目录
1. Mybatis映射概念
(1)自动映射
当 SQL 查询结果的列名与 Java 对象的属性名完全匹配时,MyBatis 会自动将查询结果 映射到 Java 对象。
(2)基本的
<resultMap>
映射当你需要更精细地控制映射过程时,可以使用
<resultMap>
元素。例如,如果列名与属 性名不一致,你可以显式指定映射关系。(3)复杂的
<association>
和<collection>
映射对于一对多或一对一或多对多的表关系,可以使用
<association>
和<collection>
标 签来处理。
2. <resultMap>标签的使用
2.1 概念
该标签用于定义结果集和对象之间的映射关系。通常用于复杂的映射操作,通俗的理解就是,这个返回的结果数据太多或者太过复杂,需要进行额外的处理。
2.2 用法
用法1:如下图,结合<association/>标签一起使用,通常处理一对一的映射关系。
【题】两张表,员工表employee和员工工号表workCard通过外键连接,查询员工名字是李明的工号。
- 确定查询方式一,先查询employee表名字为李明的员工。然后再根据关联的id字段来查询workcard表来查询员工工号。
- 在员工对象中添加一个非数据库字段WorkCard属性,用于存储查询到的workCard对象,统一将处理的结果存储到employee对象中。
- 查询的映射sql语句如下。
<association/>标签用于处理一对一的关系。它通常用来将结果集中的部分列映射到另一个对象类型。
【参数说明】
property
:指明将数据存到employee对象的workCard属性中。javaType
:指明查询对象的类型。column
:指明使用的是数据表的哪个字段。select
属性指定了一个额外的查询语句,该语句用于从关联的表中获取数据。
说明:上面代码的工作流程是先查询到名字为李明的员工数据,然后再<resultMap>在根据额外的查询语句通过外键去员工表中查询到了员工信息。(数据是自动映射的,也可以手动)
查询方式二,用一条sql语句查询,如下图代码所示。
注意:数据库字段和对象属性的映射关系最好手动写上。
用法2:如下图,结合<collection/>标签一起使用,通常处理一对多,多对多的映射关系。
下面是对一个对员工的打卡记录进行查询的sql映射文件,首先在员工属性中再定义一个打卡记录的集合用于记录员工的打卡信息。查询到的打卡信息封装到该属性中。
<collection>
标签用于处理一对多的关系。它通常用来将结果集中的部分列映射到一个集合类型的对象。标签的相关属性如下:
property:
操作的集合名。
ofType:
结合的每一项类型。
column
: 指定数据库列的名称。
select
:可以使用select
属性来指定一个额外的查询语句,从而从关联的表中获取数据。
fetchType
:指定是否使用懒加载(lazy
)还是立即加载(eager
)。默认值是lazy。
总结:其实就是一句话,对复杂一点的结果再进行额外的处理,进行封装,映射。
3. 表关联映射
3.1 一对一映射
主表的主键做副表的外键并且指定到副表的主键上。
【注意】
- 主表要先有数据,副表可以没有数据
- 副表的ID必须是主表有的
- 副表的ID不能重复,不能自增
3.2 一对多映射
在一对多关系中,主键数据表中的一条记录可以和另外一张数据表的多条记录相关。例如:班级角度:一个班级可以有多名学生。学生角度:一个学生只能属于一个班级。
如下图的两张表也属于一对多的映射关系 。员工表和打卡记录表。
3.2 多对多映射
设定中间表,用中间去关联其他两张表,将两张主表的主键分别设定为第三张表的外键。
如下图所示
基于这些映射关系实现多表查询数据,然后再结合<resultMap>标签使用对多表查询的结果进行处理,封装。(为啥这样?单表查询可能用一个对象,一个变量去接收就可以了,但多表查询的结果较复杂需要单独处理)