MyBatis 学习笔记

MyBatis 是一款优秀的持久层框架,免除了所有的 JDBC 代码以及设置参数和获取结果集的工作。

快速入门

1、Maven 加载依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>

2、使用 XML 构建 SqlSessionFactory

在 resource 目录下创建 mybatis-config.xml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>

修改相关的参数,以确保能连接上数据库

3、新建接口

1
2
3
4
public interface UserDao {
List<User> findAll();
User findUserById(int id);
}

定义相关的接口,在 resource 目录下创建与其全类名相同的 XML 文件

1
2
3
4
5
6
7
8
9
10
11
12
<?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">
<mapper namespace="com.haibara.dao.UserDao">
<select id="findAll" resultType="com.haibara.pojo.User">
select * from user
</select>
<select id="findUserById" resultType="com.haibara.pojo.User">
select * from user where id = #{id};
</select>
</mapper>

namespace 是接口的全路径

查询使用的是 select 标签

resultType 是结果的类型

id 是接口中的方法名

4、测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String resource = "mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
// 读取配置文件,创建工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 通过工厂对象获取SQLSession(理解为数据库连接池)
SqlSession sqlSession = build.openSession();
// 通过工厂对象获取UserDao的实现对象
UserDao mapper = sqlSession.getMapper(UserDao.class);
// 测试第一个方法
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
// 测试第二个方法
User userById = mapper.findUserById(1);
System.out.println(userById);
// 关闭连接
sqlSession.close();

idea 模板

为了方便开发,可以在 idea 中添加 mybatis 的配置文件模板到 idea 中

6D89F2FA1F8BA05398798F457A52610D

获取参数

一个参数

1、参数为基础数据类型的情况

1
User findUserById(int id);

根据 ID 查询只需要传入一个参数

1
select * from user where id = #{id};

2、参数并非基础数据类型的情况

1
User findByUser(User user);
1
2
3
<select id="findByUser" parameterType="com.haibara.pojo.User" resultType="com.haibara.pojo.User">
select * from user where id = #{id} and username = #{username};
</select>

但由于可以自动识别参数类型,所以 parameterType 可以省略

3、参数为 Map 时

1
User findByMap(Map map);

当参数为 Map 时,依旧是同样的写法

1
2
3
<select id="findByMap" resultType="com.haibara.pojo.User">
select * from user where id = #{id} and username = #{username}
</select>
1
2
3
4
5
HashMap hashMap = new HashMap();
hashMap.put("id",1);
hashMap.put("username","小明");
hashMap.put("password","123456");
User byMap = mapper.findByMap(hashMap);

多个参数

在多个参数时,在定义方法时需要通过注解对参数命名

1
User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
1
2
3
<select id="findByUsernameAndPassword" resultType="com.haibara.pojo.User">
select * from user where username = #{username} and password = #{password}
</select>

核心类

SqlSessionFactory

SqlSessionFactory 是一个 SqlSession 的工厂类,主要用来获取 SqlSession 对象

成员方法

1
2
SqlSession openSession();//非自动提交
SqlSession openSession(boolean autoCommit);//自动提交

SqlSession

SqlSession 提供了在数据库执行 SQL 命令所需要的所有方法,它提供了事务的相关操作

成员方法

1
2
3
4
T getMapper(Class<T> type);//获取Mapper对象
void commit();//提交事务
void rollback();//回滚事务
void close();//释放资源

MyBatis 实现增删查改

新增

在接口中新增方法

1
void addUser(User user);

在 XML 映射文件中编写 SQL 语句

1
2
3
<insert id="addUser">
insert into user values (null, #{username},#{password})
</insert>

在测试类中调用测试

1
2
3
4
User user = new User();
user.setUsername("萧炎");
user.setPassword("123456");
mapper.addUser(user);

查询

在接口中添加方法

1
List<User> findAll();

在 XML 映射文件中添加对应的映射

1
2
3
<select id="findAll" resultType="com.haibara.pojo.User">
select * from user;
</select>

调用方法测试

1
2
List<User> all = mapper.findAll();
System.out.println(all.toString());

修改

在接口中添加相关的方法

1
void updatePasswordById(User user);

在 XML 映射文件添加映射

1
2
3
<update id="updatePasswordById">
update user set password=#{password} where id =#{id}
</update>

在测试类中测试

1
2
3
4
User user = new User();
user.setId(2);
user.setPassword("abcdefg");
mapper.updatePasswordById(user);

删除

在接口中添加相关的方法

1
void deleteUserById(int id);

在 XML 映射文件添加映射

1
2
3
<delete id="deleteUserById">
delete from user where id=#{id}
</delete>

在测试类中测试

1
mapper.deleteUserById(8);

配置文件

properties

在 mybatis-config.xml 中可以通过 properties 标签读取 properties 文件内容

在资源文件夹中新建一个 jdbc.properties 的文件

1
2
3
4
jdbc.url=jdbc:mysql:///mydb?characterEncoding=UTF-8
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=root

将 jdbc 连接数据库的配置写到 properties 文件中

在 mybatis-comfig.xml 中的 configuration 标签下的最前边添加一个 properties 标签,并且指定 jdbc.properties 的文件路径

1
<properties resource="jdbc.properties"></properties>

因为 jdbc 的配置已经在 jdbc.properties 文件中添加了,所以在 mybatis-config.xml 中就可以换一种方式写配置

1
2
3
4
5
6
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>