MyBatis 与 MyBatis-Plus 源码阅读:从 SqlSession 到插件链
基线:MyBatis 3.5.x、MyBatis-Plus 3.5.x、Spring Boot 3、Java 17+。
1. 原生执行链
Mapper proxy -> SqlSession -> Executor -> StatementHandler -> JDBC -> ResultSetHandler
SqlSession 是入口,Executor 负责查询、更新、事务和一级缓存,StatementHandler 负责参数与 Statement,ResultSetHandler 负责结果映射。MyBatis-Plus 增加 BaseMapper、Wrapper、自动填充、逻辑删除、分页和拦截器,但不改变 JDBC 事务约束。
2. 参数绑定
<select id="findByStatus" resultType="Order">
select * from orders where status = #{status}
</select>
字符串替换只能用于白名单化表名、列名和排序字段,不能把用户输入直接拼进 SQL。
3. Executor 与缓存
SimpleExecutor 每次创建 Statement;ReuseExecutor 复用 Statement;BatchExecutor 批量发送更新;CachingExecutor 处理 namespace 二级缓存。一级缓存位于 SqlSession/Executor 生命周期内,二级缓存涉及序列化和失效一致性,不能默认当作 Redis 缓存。
4. 插件链
分页、乐观锁、租户和数据权限通过插件链执行。插件顺序、租户条件、分页和逻辑删除必须用集成测试验证。逻辑删除不等于数据不再增长。升级时以锁定版本源码为准。