15.1 MyBatis
MyBatis 是一款流行的 Java 持久层框架,用于简化与关系型数据库的交互。它提供了一种半自动化的 ORM(对象关系映射)解决方案,允许开发人员以灵活的方式编写动态 SQL,同时又保留了对 SQL 语句的直接控制权。MyBatis 将繁琐的 JDBC 层抽象出来,通过配置文件或注解描述数据库操作,使得应用程序与数据库之间的交互更为清晰、简洁。
主要特性:
- SQL 映射:通过 XML 或注解定义 SQL 查询语句,将 SQL 语句与 Java 方法关联起来。
- 动态 SQL:支持动态拼接 SQL,可根据传入参数动态调整查询条件,简化复杂查询的编写。
- 自动结果映射:根据配置自动将查询结果映射到 Java 对象,无需手动解析结果集。
- 插件机制:提供插件接口,便于扩展功能,如日志记录、性能监控、事务管理等。
- 与 Spring 集成:无缝集成 Spring 框架,支持 Spring 的依赖注入和事务管理。
15.2 MyBatis 对象关系映射
对象关系映射 (ORM) 是一种将关系型数据库的数据结构映射到对象模型的技术。在 MyBatis 中,ORM 主要体现在以下几个方面:
- 实体类与表的映射:定义 Java 类(实体类)来表示数据库中的表,类的属性对应表的字段。
- 对象关系:通过配置或注解描述实体类之间的关联关系,如一对一、一对多、多对多等。
- 数据操作:通过映射文件或注解定义 CRUD(Create, Read, Update, Delete)操作对应的 SQL 语句,将数据库操作与 Java 方法关联。
关系映射示例:
- 一对一映射:使用
<association>
标签定义,例如一个Employee
实体类与一个Department
实体类之间的一对一关系,查询员工时可以同时获取其所在部门的信息。 - 一对多映射:使用
<collection>
标签定义,如一个Department
实体类包含多个Employee
实体类的一对多关系,查询部门时可以同时获取其下属员工列表。 - 多对多映射:通常通过中间表实现,MyBatis 中同样使用
<collection>
标签配置,如Course
与Student
之间的多对多关系,查询课程时可以获取选修该课程的所有学生列表。
15.3 MyBatis 结构
MyBatis 的基本结构包括以下几个核心组件:
- SqlSessionFactoryBuilder:用于创建
SqlSessionFactory
实例的构建器,通过解析配置文件或配置类生成。 - SqlSessionFactory:工厂类,用于创建
SqlSession
实例,是 MyBatis 工作的核心,包含了数据库连接信息、事务管理、映射器加载等配置。 - SqlSession:会话接口,提供了执行 SQL 语句、获取映射器方法等功能。每个线程都应该有自己独立的 SqlSession 实例。
- Mapper接口/映射器:定义了与数据库交互的方法签名,方法名与映射文件中的 SQL ID 相对应。通过 SqlSession 调用这些接口方法即可执行数据库操作。
- 映射文件(XML 或注解):定义了 SQL 语句、结果映射、参数映射等信息,与 Mapper 接口方法对应。
执行流程简述:
- 使用
SqlSessionFactoryBuilder
通过配置文件或配置类创建SqlSessionFactory
。 - 通过
SqlSessionFactory
开启一个新的SqlSession
。 - 通过
SqlSession
调用已映射的 Mapper 接口方法,执行 SQL 操作。 - 获取并处理查询结果,关闭
SqlSession
。
15.4 MyBatis 的映射标记
MyBatis 的映射标记主要用于 XML 映射文件中,用来描述 SQL 语句、结果映射、参数映射等信息。常见的映射标记包括:
<select>
、<insert>
、<update>
、<delete>
:分别定义 SELECT、INSERT、UPDATE、DELETE 类型的 SQL 语句。<if>
,<choose>
,<when>
,<otherwise>
:用于构建动态 SQL,根据传入参数的条件决定是否包含某些 SQL 片段。<where>
、<set>
:辅助动态 SQL,自动添加前置条件(WHERE)或更新字段(SET)的关键词。<foreach>
:遍历集合参数,生成 IN 条件或批量插入等语句。<bind>
:计算表达式并将结果绑定到一个变量,供 SQL 语句使用。<resultMap>
:定义结果集映射规则,包括如何将查询结果映射到 Java 对象的属性。<association>
、<collection>
:在结果映射中用于描述一对一、一对多或多对多关联关系的映射。<parameterMap>
、<parameter>
:(已过时,推荐使用#{}
占位符)定义参数映射规则,如何将方法参数传递给 SQL 语句。
通过这些映射标记,开发人员可以清晰地定义 SQL 操作以及结果的处理方式,使得数据库交互逻辑与业务逻辑分离,提高代码的可读性和可维护性。同时,MyBatis 也支持使用注解进行类似的映射配置,为开发人员提供了更多元化的选择。