MyBatis 的核心不是“帮你写 SQL”,而是把 SQL、参数映射、结果映射和执行策略编译成运行时对象。初学时先抓住 Configuration 与 MappedStatement,比背 XML 标签更有效。
Table of contents
Open Table of contents
先运行一个最小实验
下载数据架构实验室下载,进入目录运行:
mvn -Dtest=DataArchitectureLabTest#configurationBuildsMappedStatementsAndMapperProxy test
测试使用 H2 内存数据库,不需要 Docker。它注册 OrderMapper,再用完整名称查出 MappedStatement,最后通过 Mapper 代理执行插入和查询。
四个对象各做什么
| 对象 | 直白解释 | 生命周期 |
|---|---|---|
Configuration | 整个 MyBatis 的运行时目录 | 通常与应用同生命周期 |
MappedStatement | 一条映射语句的执行说明书 | 配置解析时创建、只读使用 |
SqlSessionFactory | 创建数据库会话的工厂 | 通常是单例 |
SqlSession | 一次工作单元和一级缓存边界 | 每个请求或事务独立创建 |
“映射”是把 Java 值与数据库列互相转换。Mapper 注解或 XML 在启动时被解析;例如 OrderMapper.findById 会注册为 接口全名.findById。运行时不是重新解析注解,而是按这个 ID 找到 MappedStatement。
从配置到调用
读取配置 → 创建 Configuration → 注册 Mapper 与插件
→ 构建 SqlSessionFactory → 打开 SqlSession
→ 创建 Mapper 动态代理 → 定位 MappedStatement → 执行 SQL
插件也保存在 Configuration 中。MyBatis 在创建 Executor、StatementHandler 等对象时逐层包装它们,因此插件顺序会影响调用顺序。插件不是任意方法拦截器,只能拦截 MyBatis 明确开放的接口方法。
新手最容易混淆的边界
SqlSessionFactory可共享,SqlSession不是线程安全对象,不能做全局单例。#{value}生成 JDBC 参数,占位并绑定值;${value}是字符串替换,接收用户输入会带来 SQL 注入风险。- MyBatis 管理映射和 JDBC 调用,但业务事务边界仍要由应用或 Spring 明确控制。
可对照 MyBatis 配置参考查看完整设置,但先用实验观察对象,再查配置项。
下一步
继续阅读06-02 MyBatis SQL 执行、缓存与结果映射,沿 Mapper 代理追到 Executor 和 JDBC。