mybatis是半自动orm框架,核心在于开发者手动编写sql,框架负责参数绑定、sql执行与结果映射;其关键组件包括sqlsessionfactory、sqlsession、mapper接口及xml/注解、executor和resultsethandler,协同实现灵活可控的数据库操作。

MyBatis 的核心概念,本质是“半自动 ORM 框架”——它不替你生成 SQL,而是让你写 SQL,并帮你把参数塞进去、把结果取出来、把对象映射好。它的设计优势不是追求全自动的省事,而是在可控性与开发效率之间找到一个务实平衡点。
什么是“半自动 ORM”?
ORM(对象关系映射)的目标是让 Java 对象和数据库表产生对应关系。Hibernate 这类全自动框架会根据实体类自动生成 SQL,开发者几乎不碰 SQL;而 MyBatis 要求你显式编写 SQL(XML 或注解中),框架只负责执行和结果封装。
- SQL 完全由开发者掌控:可优化索引、调整 JOIN 方式、用子查询或窗口函数,DBA 也能直接参与 SQL 审核
- 没有隐式 N+1 查询风险:关联数据必须手动写 JOIN 或分步查,逻辑透明,不易踩坑
- 不强制要求实体类与表结构严格一致:字段名、类型、嵌套结构都可通过
精确配置
核心组件如何协同工作?
一次典型的查询流程背后,是几个关键角色各司其职:
- SqlSessionFactory:基于配置(如 mybatis-config.xml 和 Mapper XML)构建的工厂,线程安全,通常整个应用只创建一次
- SqlSession:轻量级会话对象,非线程安全,封装了 CRUD 方法和事务控制,用完即关
- Mapper 接口 + XML/注解:接口方法通过命名空间+ID 与 SQL 绑定,MyBatis 在运行时动态代理该接口
- Executor:真正执行 SQL 的引擎,支持简单、复用、批处理等策略,并管理一级缓存(SqlSession 级)
-
ResultSetHandler:将 JDBC 的 ResultSet 按
或自动映射规则,转成 Java 对象
为什么说“SQL 与代码分离”是关键优势?
这不是形式主义,而是工程落地的真实需要:
- 运维或 DBA 可在不改 Java 代码的前提下,优化慢 SQL(比如加提示、改写子查询),上线更快、风险更低
- 同一套业务逻辑,可为 MySQL、Oracle 分别维护适配的 SQL 片段(通过 databaseId 支持)
- 历史系统迁移时,旧表结构复杂、命名不规范,
能一对一指定 column → property 映射,避免改实体类引发连锁反应 - SQL 存在独立语法校验和性能分析路径(如 EXPLAIN、慢日志采集),比 HQL 或 Criteria 更贴近数据库真实行为
动态 SQL 解决什么实际问题?
它不是炫技,而是应对“条件组合查询”这类高频场景的务实方案:
- 用户后台筛选订单:
AND status = #{status} ,空条件自动跳过,不用拼字符串防注入 - 批量操作:
#{item.id} ,生成 (1,2,3) 形式 IN 条件 - 多字段模糊搜索:
避免在 Java 层拼接 %,保持 SQL 清晰 - 注意:${} 是字符串替换,仅用于表名、列名等无法预编译的场景,必须严格校验输入,否则有 SQL 注入风险
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











