mybatis多表crud_MyBatis多表联查,注解和工作原理

本文详细介绍了MyBatis中的resultMap与resultType的区别,以及如何通过resultMap进行自定义映射,包括多表关联查询的N+1方式和自动映射。讨论了不同场景下手动装配、多对一和集合对象关联的方法,并给出了代码示例和注解的使用。
  • resultMap
  • ResultMap用于自定义映射关系, 可以由程序员自主制定
  • 列名和属性名的映射关系. 一旦使用 resultMap, 表示不再采用自动映射机制.
  • 使用resultMap进行结果映射时,不需要查询的列名和映射的属性名必须一致。
  • 但是需要声明一个resultMap,来对列名和属性名进行映射。
  • resultType和resultMap的区别
  • resultType表示采用 MyBatis 的Auto-Mapping(自动映射)机制, 即相同的列名和属性名会自动匹配,列名和映射的属性名必须一致。
  • ResultMap表示不再采用自动映射机制,不需要查询的列名和映射的属性名必须一致。
  • MyBatis实现多表关联查询方式:
  1. 业务装配
  2. 单个对象N+1
  3. 关联方式多对一
  4. 集合对象N+1
  5. 集合对象关联方式
  6. Auto-Mapping自动映射

业务装配

  • mapper 层:
  • 只做单表查询操作, 在 service 层进行手动装配,
  • 实现关联查询的结果.
  • 实体类:
  • 创建班级类(Clazz)和学生类(Student), 并在 Student 中添
  • 加一个 Clazz 类型的属性, 用于表示学生的班级信息.
  • Mapper层:
  • 提供StudentMapper和ClazzMapper, StudentMapper查询所
  • 有学生信息, ClazzMapper 根据编号查询班级信息.
  • Service层:
  • 调用 mapper 层, 先查询所有学生, 再根据每个学生的班级
  • 编号查询班级信息, 手动进行组装, 称之为业务装配.
  • 代码示例:

Mapper层:

3fc01efa379816d79e25169e442baf60.png

d0892a66740080ed0116edbaf9358a64.png

业务层

b4a6fea5d17ad9c67b3dc96fe80afd9a.png

测试类

91b714399d3037a131822c7dfd4aee1a.png

单个对象N+1:

  • 实体类
  • 创建班级类(Clazz)和学生类(Student), 并在 Student 中添
  • 加一个 Clazz 类型的属性, 用于表示学生的班级信息.
  • mapper 层
  • 提供StudentMapper和ClazzMapper,
  • StudentMapper查询所有学生信息, ClazzMapper 根据编号查询班级信息.
  • 在StudentMapper 中使用<association>设置装配.
  • service 层
  • 由于装配已经完成, service 层只需要调用 mapper 即可, 不
  • 需要再进行装配了.

Mapper层:

b2b4e14285522585ba8edf29b2812e71.png

90546bd0ed35141cf85990adbf48c3cc.png

业务层:

7ed9cafc63fcf46cbb6bd2f9dfe9d157.png

测试类:

85823a2509eab69d0ced9043346fd352.png

关联方式多对一

mapper 层

  • 在ClaszMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应学生的信息.通过<resultMap>定义映射关系, 并通过<association>指定对象属性的映射关系. 可以把<association>看成一个<resultMap>使用.
  • 代码示例:

mapper 层

9db77c24476bfb36df6dcf711cce3d17.png

业务层:

662ae660850b2fda09fd1f389bf020c9.png

测试类:

83d676973a0636c6fe42d8947486fa84.png
  • 也可以用左外连接查询 在StudentMapper.xml 中定义多表连接查询 SQL 语句, 一
  • 次性查到需要的所有数据, 包括对应班级的信息.

66eefdec5f0e832d791ebbc9acbdf594.png

集合对象N+1

mapper 层

  • 提供ClazzMapper和StudentMapper, ClazzMapper查询所有班级信息,
  • StudentMapper 根据班级编号查询学生信息.
  • 在 ClazzMapper 中使用<collection>设置装配.

mapper 层

c248737c6ad86ef8c7ce4116875acb97.png

841eccc50722b00df7572a24af9bae36.png

业务层:

283cc31307f687b05e66f8a008e330dd.png

测试类:

7dd58e9474686e169fe92014641c2830.png

集合对象关联方式

mapper层:

  • 在 ClazzMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应学生的信息.
  • 通过<resultMap>定义映射关系, 并通过<collection>指定集合属性泛型的映射关系. 可以把<collection>看成一个<resultMap>使用.

mapper层

c91305fb3ab9e3700efa29923272d731.png

8868f5612c86e5b079a236a8b1a1df36.png

service层:

f9ee44118e4e48bc5c9a7526ca434e77.png

测试类:

77bcdf27b6cae50cc7c36565d2b222af.png

Auto-Mapping自动映射

Mapper层:

  • 通过 MyBatis 的 Auto-Mapping 机制及数据库查询时的别名结合, 可以方便的实现多表查询.
  • SQL 语句中, 别名出现特殊符号时, 必须进行处理. MySQL可以使用(``)符号, Oracle 可以使用("")符号.

代码示例:

Mapper层:

a71dd69e0b173906510192795656a956.png

业务层:

562012b525b32f5291499e1a66373028.png

测试类:

a62ffaa427c820a68e08ae5c4deeab0d.png

注解开发

  • 注解是用于描述代码的代码. 例如: @Test(用于描述方法进行 junit 测试), @Override(用于描述方法的重写),@Param(用于描述属性的名称)
  • 注解的使用风格: @xxx(属性), 使用前必须先导包
  • 使用注解一般用于简化配置文件. 但是, 注解有时候也不是很友好(有时候反而更麻烦), 例如动态 SQL.
  • 注解和配置文件可以配合使用

注解的属性

  • 属性的设定方式是: 属性名=属性值
  • 基本类型和 String, 可以直接使用双引号的形式
  • 数组类型, name={值 1, 值 2, ...}; 如果数组元素只有一个, 可以省略大括号
  • 对象类型, name=@对象名(属性)
  • 如果属性是该注解的默认属性, 而且该注解只配置这一个属性, 可以将属性名省略

MyBatis 中常用的注解

CRUD 注解

  • @Select: 类似于<select>
  • @Insert: 类似于<insert>
  • @Update: 类似于<update>
  • @Delete: 类似于<delete>

19ef6c8081ffacca12b74cadf9051118.png

其他注解

  • @Results: 类似于<resultMap>
  • @Result: 类似于<resultMap>的子标签
  • @One: 类似于<association>
  • @Many: 类似于<collection>

73be91609b1c9ab477f71d7f093e7fe3.png

0ecb64462d4b1227d3260a90872e2972.png

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对象创建成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值