1 MyBatis程序
【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂:https://www.bilibili.com/video/BV1NE411Q7Nx/
https://blog.csdn.net/weixin_52200256/article/details/126611600
https://www.cnblogs.com/pinghuimolu/p/15350459.html
https://www.cnblogs.com/pinghuimolu/p/15350459.html
https://www.cnblogs.com/renxuw/p/13047424.html
1 什么是MyBats
1.1 简介
【官网】
MyBatis 是一款优秀的持久层框架,
它支持自定义 SQL、存储过程以及高级映射。
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
【百度百科】
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。
2013年11月迁移到Github。
如何获得MyBatis
Maven仓库:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
官网:https://mybatis.net.cn/
中文文档:https://mybatis.org/mybatis-3/zh/index.html
GitHub:https://github.com/mybatis
1.2 持久化
持久化就是将程序的数据在持久化状态和瞬时状态转化的过程。
内存:断电即失
数据库jdbc、io文件持久化。
生活:冷藏、罐头。
为什么需要持久化?
- 有一些对象,不能让他丢掉。
- 内存太贵了。
1.3 持久层
完成持久化工作的代码块
层界限十分明显
1.4 为什么需要MyBatis
帮忙程序员将数据存入数据库中。
方便。
传统的JDBC代码太复杂了,简化、框架。
不用MyBatis也可以。更容易上手。技术没有高低之分。
优点:【百度百科】
- 简单易学
- 灵活
- sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的ORM字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
最重要的一点,使用的人多!
2 第一个MyBatis程序
思路:搭建环境-导入MyBatis-编写代码-测试
2.1 搭建环境
CREATE DATABASE `mybatis`;
USE `mybatis`;
CREATE TABLE `user`(
`id` INT(20) NOT NULL PRIMARY KEY,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user`(`id`,`name`,`pwd`)VALUES
(1,'张三','123456'),
(2,'李四','123456'),
(3,'王五','123456')
【新建一个普通的Maven项目】
删除src目录
pom.xml导入maven依赖,mysql、mybatis、junit,父工程
<!--导入依赖-->
<dependencies>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.2 创建一个模块
1)编写mybatis的核心配置模块
resources文件夹下新增mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
2)编写mybatis工具类
新建com.liweixiao.utils文件夹,新建MybatisUtils.java
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//第一步:获取sqlSessionFactory对象
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获得SqlSession实例,包含了面向数据库执行sql命令所需的所有方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
2.3 编写代码
1.实体类,新建pojo文件夹
public class User {
//属性
private int id;
private String name;
private String pwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
//构造函数
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
//方法
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
2.Dao接口,新建dao文件夹
public interface UserDao {
List<User> getUserList();
}
3.实现类,由原来的UserDaoImpl转换为Mapper配置文件
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace绑定一个Dao/Mapper接口-->
<mapper namespace="com.liweixiao.dao.UserMapper">
<!-- 查询全部用户 -->
<select id="getUserList" resultType="com.liweixiao.pojo.User" >
select * from mybatis.user
</select>
</mapper>
2.4 测试
junit测试
public class UserDaoTest {
@Test
public void test(){
//第一步:获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
//关闭sqlSessin
sqlSession.close();
}
}
可能会遇到的问题:
1.配置文件没有注册
2.绑定接口错误
3.方法名不对
4.返回类型不对
5.Maven导出资源问题
注意点1:org.apache.ibatis.binding.BindingException: Type interface com.liweixiao.dao.UserDao is not known to the MapperRegistry.
Mybatis-config.xml
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
<mappers>
<mapper resource="com/liweixiao/dao/UserMapper.xml"/>
</mappers>
注意点2:The error may exist in com/liweixiao/dao/UserMapper.xml
父工程和子工程的pom.xml都加上
<!--在build中配置resources,来防止资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
3 CRUD增删改查(create、read、update、delete)
3.1 namespace
namespace中的包名要和Dao/Mapper接口的包名一致
3.2 Select查询
- id对应接口中的方法名
- resultType对应sql语句执行的返回值
- parameterType参数类型
3.3 Insert
3.4 Update
3.5 Delete
增删改,都要提交事务
1)UserMapper.java
public interface UserMapper {
//查询全部用户
List<User> getUserList();
//根据id查询用户
User getUserById(int id);
//增加用户
int addUser(User user);
//修改用户
int updateUser(User user);
//删除用户
int deleteUser(int id);
}
2)UserMapper.xml
<!--namespace绑定一个Dao/Mapper接口-->
<mapper namespace="com.liweixiao.dao.UserMapper">
<!-- 查询全部用户 -->
<select id="getUserList" resultType="com.liweixiao.pojo.User" >
select * from mybatis.user
</select>
<!-- 根据id查询用户 -->
<select id="getUserById" parameterType="int" resultType="com.liweixiao.pojo.User">
select * from mybatis.user where id = #{id}
</select>
<!--增加用户,对象中的属性可以直接取出来-->
<insert id="addUser" parameterType="com.liweixiao.pojo.User">
insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<!-- 修改用户-->
<update id="updateUser" parameterType="com.liweixiao.pojo.User">
update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}
</update>
<!-- 删除用户-->
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id}
</delete>
</mapper>
3)UserDaoTest.java
public class UserDaoTest {
//查询全部用户
@Test
public void test(){
//第一步:获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
//方式二:不推荐使用
//List<User> userList = sqlSession.selectList("com.liweixiao.dao.UserDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
//关闭sqlSessin
sqlSession.close();
}
//根据id查询用户
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
//增加用户,增删改,需要提交事务
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.addUser(new User(4, "赵六", "123123"));
System.out.println("增加的行数:"+i);
//提交事务
sqlSession.commit();
sqlSession.close();
}
//修改用户
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.updateUser(new User(4,"zhaoliu","123456"));
sqlSession.commit();
System.out.println("更新的行数:"+i);
sqlSession.close();
}
//删除用户
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUser(4);
sqlSession.commit();
System.out.println("删除的行数:"+i);
sqlSession.close();
}
}
3.6 分析错误
- 标签不要匹配错,select、insert、update、delete
- resource绑定mapper,需要使用路径
- 程序配置文件必须符合规范
- 空指针异常,没有注册到资源
- target输出xml文件中存在中文乱码问题
- maven资源没有导出问题
3.7 万能Map
实体类中或者数据库中的字段或者参数过多,考虑使用Map
Map传递参数,直接在sql中取出key;对象传递参数,直接在sql中去对象的属性。
多个参数用Map,或者注解。
UserMapper.java
int addUser2(Map<String,Object> map);
User getUserById2(Map<String,Object> map);
UserMapper.xml
<!--使用map-->
<insert id="addUser2" parameterType="map">
insert into mybatis.user(id,name,pwd) values (#{userid},#{username},#{password})
</insert>
<select id="getUserById2" parameterType="map" resultType="com.liweixiao.pojo.User">
select * from user where id=#{userid} and name=#{username}
</select>
UserDaoTest.java
//使用map
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("userid",5);
map.put("username","5");
map.put("password","111111");
int i = mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
@Test
public void getUserById2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("userid",3);
map.put("username","王五");
User user = mapper.getUserById2(map);
System.out.println(user);
sqlSession.close();
}
3.8 模糊查询
1.Java代码执行的时候,传递通配符%%
2.在sql拼接中使用通配符
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~