mybatis工作流程
1. 读取配置文件
MyBatis 需要加载 核心配置文件 mybatis-config.xml 和 映射文件 XXXMapper.xml:
mybatis-config.xml:配置数据库连接、环境信息、插件等。XXXMapper.xml:定义 SQL 语句、参数映射和结果映射
示例:mybatis-config.xml
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
2. 创建 SqlSessionFactory
MyBatis 通过 SqlSessionFactoryBuilder 解析 mybatis-config.xml 并创建 SqlSessionFactory。
示例代码:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory作用:
- 维护数据库连接池
- 解析
Mapper映射文件 - 提供
SqlSession进行数据库操作
3. 获取 SqlSession
SqlSession 是 MyBatis 操作数据库的核心对象,提供 SQL 执行方法,如:
selectOne():查询单个对象selectList():查询列表insert()、update()、delete()
示例代码:
SqlSession sqlSession = sqlSessionFactory.openSession();
openSession(true)表示自动提交事务openSession(false)需要手动提交事务
4. 获取 Mapper
MyBatis 通过 动态代理 方式创建 Mapper 接口的实现类,并映射 SQL 语句。
示例代码:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserMapper是 接口- MyBatis 自动生成代理对象 负责执行 SQL
5. 执行 SQL 语句
调用 Mapper 接口的方法,MyBatis 会:
- 匹配
Mapper.xml里的 SQL - 填充参数
- 执行 SQL 并返回结果
示例:UserMapper.java
public interface UserMapper {
User getUserById(int id);
}
示例:UserMapper.xml
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
调用方法
User user = userMapper.getUserById(1);
System.out.println(user);
SqlSession
作用范围:
SqlSession 代表 一次数据库会话(Session),其作用范围通常是 方法级、请求级或事务级,具体取决于使用方式。一般来说,SqlSession 的作用范围不应该跨线程共享,通常应遵循 "用完即关闭" 的原则
Executor 与 SqlSession 的关系
SqlSession 是 MyBatis 中的一个会话对象,负责管理数据库操作的生命周期。
SqlSession 内部通过 Executor 执行实际的 SQL 语句。
MyBatis 缓存简介
一级缓存(Local Cache)
属于会话(Sqlsession)
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 第一次查询,查询数据库
User user1 = userMapper.getUserById(1);
// 第二次查询,直接从缓存中读取
User user2 = userMapper.getUserById(1);
sqlSession.close(); // 一级缓存被清空
二级缓存(Second Level Cache)
(1) 二级缓存的作用范围
- 二级缓存是 MyBatis 提供的全局缓存,作用范围是
SqlSessionFactory。即不同的SqlSession实例可以共享二级缓存。 - 二级缓存可以跨
SqlSession使用,它的设计是为了提高性能,减少数据库访问次数。
(2) 二级缓存的工作原理
- 当查询某个数据时,MyBatis 会首先查看 一级缓存,如果没有命中,就会查 二级缓存。
- 如果二级缓存也没有,才会查询数据库。
- 查询结果会被存入二级缓存,供其他
SqlSession使用。
(3) 启用二级缓存
<configuration>
<settings>
<!-- 启用二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
(4) 缓存的清除策略
SqlSession关闭时:一级缓存会自动清除
qlSessionFactory 关闭时:所有缓存会被清除
物理分页和逻辑分页
逻辑分页:需要先获取所有数据,再根据请求的页数在应用层进行切割和展示
物理分页:使用limit进行分页
PageHelper分页的原理是什么
-
当我们在代码中使用PageHelper.startPage(int pageNum, int pageSize)设置分页参数之后,其实PageHelper会把他们存储到ThreadLocal中。
-
PageHelper会在执行器的query方法执行之前,会从ThreadLocal中再获取分页参数信息,页码和页大小,然后执行分页算法,计算需要返回的数据块的起始位置和大小。最后,PageHelper会通过修改SQL语句的方式,在SQL后面动态拼接上limit语句