- resultMap
- ResultMap用于自定义映射关系, 可以由程序员自主制定
- 列名和属性名的映射关系. 一旦使用 resultMap, 表示不再采用自动映射机制.
- 使用resultMap进行结果映射时,不需要查询的列名和映射的属性名必须一致。
- 但是需要声明一个resultMap,来对列名和属性名进行映射。
- resultType和resultMap的区别
- resultType表示采用 MyBatis 的Auto-Mapping(自动映射)机制, 即相同的列名和属性名会自动匹配,列名和映射的属性名必须一致。
- ResultMap表示不再采用自动映射机制,不需要查询的列名和映射的属性名必须一致。
- MyBatis实现多表关联查询方式:
- 业务装配
- 单个对象N+1
- 关联方式多对一
- 集合对象N+1
- 集合对象关联方式
- Auto-Mapping自动映射
业务装配
- mapper 层:
- 只做单表查询操作, 在 service 层进行手动装配,
- 实现关联查询的结果.
- 实体类:
- 创建班级类(Clazz)和学生类(Student), 并在 Student 中添
- 加一个 Clazz 类型的属性, 用于表示学生的班级信息.
- Mapper层:
- 提供StudentMapper和ClazzMapper, StudentMapper查询所
- 有学生信息, ClazzMapper 根据编号查询班级信息.
- Service层:
- 调用 mapper 层, 先查询所有学生, 再根据每个学生的班级
- 编号查询班级信息, 手动进行组装, 称之为业务装配.
- 代码示例:
Mapper层:
业务层
测试类
单个对象N+1:
- 实体类
- 创建班级类(Clazz)和学生类(Student), 并在 Student 中添
- 加一个 Clazz 类型的属性, 用于表示学生的班级信息.
- mapper 层
- 提供StudentMapper和ClazzMapper,
- StudentMapper查询所有学生信息, ClazzMapper 根据编号查询班级信息.
- 在StudentMapper 中使用<association>设置装配.
- service 层
- 由于装配已经完成, service 层只需要调用 mapper 即可, 不
- 需要再进行装配了.
Mapper层:
业务层:
测试类:
关联方式多对一
mapper 层
- 在ClaszMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应学生的信息.通过<resultMap>定义映射关系, 并通过<association>指定对象属性的映射关系. 可以把<association>看成一个<resultMap>使用.
- 代码示例:
mapper 层
业务层:
测试类:
- 也可以用左外连接查询 在StudentMapper.xml 中定义多表连接查询 SQL 语句, 一
- 次性查到需要的所有数据, 包括对应班级的信息.
集合对象N+1
mapper 层
- 提供ClazzMapper和StudentMapper, ClazzMapper查询所有班级信息,
- StudentMapper 根据班级编号查询学生信息.
- 在 ClazzMapper 中使用<collection>设置装配.
mapper 层
业务层:
测试类:
集合对象关联方式
mapper层:
- 在 ClazzMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应学生的信息.
- 通过<resultMap>定义映射关系, 并通过<collection>指定集合属性泛型的映射关系. 可以把<collection>看成一个<resultMap>使用.
mapper层
service层:
测试类:
Auto-Mapping自动映射
Mapper层:
- 通过 MyBatis 的 Auto-Mapping 机制及数据库查询时的别名结合, 可以方便的实现多表查询.
- SQL 语句中, 别名出现特殊符号时, 必须进行处理. MySQL可以使用(``)符号, Oracle 可以使用("")符号.
代码示例:
Mapper层:
业务层:
测试类:
注解开发
- 注解是用于描述代码的代码. 例如: @Test(用于描述方法进行 junit 测试), @Override(用于描述方法的重写),@Param(用于描述属性的名称)
- 注解的使用风格: @xxx(属性), 使用前必须先导包
- 使用注解一般用于简化配置文件. 但是, 注解有时候也不是很友好(有时候反而更麻烦), 例如动态 SQL.
- 注解和配置文件可以配合使用
注解的属性
- 属性的设定方式是: 属性名=属性值
- 基本类型和 String, 可以直接使用双引号的形式
- 数组类型, name={值 1, 值 2, ...}; 如果数组元素只有一个, 可以省略大括号
- 对象类型, name=@对象名(属性)
- 如果属性是该注解的默认属性, 而且该注解只配置这一个属性, 可以将属性名省略
MyBatis 中常用的注解
CRUD 注解
- @Select: 类似于<select>
- @Insert: 类似于<insert>
- @Update: 类似于<update>
- @Delete: 类似于<delete>
其他注解
- @Results: 类似于<resultMap>
- @Result: 类似于<resultMap>的子标签
- @One: 类似于<association>
- @Many: 类似于<collection>
MyBatis 运行原理
运行过程中涉及到的类或接口
- Resources(C)
- 用于加载 MyBatis 核心配置文件
- XMLConfigBuilder(C)
- 用于解析 xml 文件(核心配置文件)
- Configuration(C)
- 用于存放 xml 文件解析后的结果
- DefaultSqlSessionFactory(C)
- 是 SqlSessionFactory(I)的 实 现 类 , 创 建 时 需 要 使 用Configuration 对象
- SqlSession(I)
- 是 MyBatis 操作的核心
- DefaultSqlSession(C)
- 是 SqlSession 接口的实现类
- TransactionFactory(I)
- 用于生产 Transaction 对象
- Transaction(I)
- 用于表示操作数据库的事务对象
- Executor(I)
- 是 MyBatis 的核心执行器, 类似于 jdbc 中的 Statement, 常用的实现类是 SimpleExecutor
- 当 MyBatis 运行开始时, 先要通过 Resources 加载核心 配置文件,
- 之后使用 XMLConfigBuilder 对配置文件进行解析,将解析结果封
- 装为Configuration对象, 接着, 使用Configuration对象构建一个DefaultSqlSessionFactory对象, 至此,SqlSession工厂构建完成.
- 接下来, 通过工厂对象调用openSession方法创建SqlSession对象.
- 在这个过程中,需 要 通 过TransactionFactory 生成 Transaction 对象,
- 并且, 还需要创建核心执行器Executor对象, 之后, 通过这些对象来创
- 建DefaultSqlSession对象, 至此, SqlSession对象创建成