目录
前言
自定义映射resultMap标签
resultType标签
准备sql表
多对一映射处理
1、级联方式处理映射关系
2、使用association处理映射关系
3、分步查询
①查询员工信息
②根据员工所对应的部门id查询部门信息
一对多映射处理
1、collenction
2、分步查询
①查询部门信息
②根据部门id查询部门中的所有员工
association和 collection
MyBatis是一种持久层框架,用于简化数据库操作。在MyBatis中,映射是指将数据库中的数据映射到Java对象中的过程,而resultMap标签则用于定义映射规则。
resultMap标签是MyBatis中用于定义结果集映射规则的标签。它可以指定如何将查询结果映射到Java对象中的属性,包括列名和Java属性名的映射关系,以及复杂类型的映射规则。
一对多映射指的是一个Java对象中包含多个子对象的映射关系。在MyBatis中,可以使用collection标签来定义一对多映射的规则,指定父对象和子对象之间的映射关系,以及如何将查询结果映射到Java对象中。
多对一映射指的是多个Java对象中包含一个共同的父对象的映射关系。在MyBatis中,可以使用association标签来定义多对一映射的规则,指定子对象和父对象之间的映射关系,以及如何将查询结果映射到Java对象中。
resultMap是MyBatis中最强大的结果映射方式,它允许你自定义复杂的数据结构映射规则。当查询结果与实体类属性名不匹配或者需要处理关联关系时,可以使用此标签。resultMap会详细描述数据库表字段到Java对象属性之间的映射,以及嵌套结果集的映射。
若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射
resultMap:设置自定义映射属性,包含有以下几个标签:
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
association:设置多对一的映射关系
collection:设置一对多的映射关系属性
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名
相对于resultMap,resultType标签提供了更为简洁的结果映射方式。它直接指定一个类型(通常是一个Java Bean的全限定类名),MyBatis会按照默认规则将查询结果中的列名自动映射到Java对象具有相同名称的属性上。
两张表,部门表和员工表,字段如下:
名 |
类型 |
备注 |
id |
int |
主键 |
name |
vachar |
部门名称 |
名 |
类型 |
备注 |
id |
int |
主键 |
name |
vachar |
员工姓名 |
gender |
vachar |
性别 |
salary |
double |
薪资 |
join_date |
date |
入职日期 |
dept_id |
int |
外键 |
bean
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
private Integer id;
private String name;
private List empList;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
private Integer id;
private String name;
private String gender;
private Double salary;
private Date joinDate;
private Integer deptId;
//一对一关系
private Dept dept; //引入Dept类
}
场景模拟:
查询员工信息以及员工所对应的部门信息
已知员工是多,部门是一,一个员工对应多个部门,一个部门有多个员工。两种方式处理映射关系
级联方式:
EmpMapper接口
/**
*通过分步查询查询员工信息
*@param eid
*@return
*/
Emp getEmpByStep(@Param("eid") int eid);
EmpMapper.xml
分步查询中的association标签用到select属性,就是在调用下一步查询中DeptMapper接口中的一个方法;column属性即是传入的字段。比如根据员工查询部门,我们就得传入员工信息中的部门id--dept_id。
DeptMapper接口中方法。
/**
*分步查询的第二步: 根据员工所对应的did查询部门信息
*@param did
*@return
*/
Dept getEmpDeptByStep(@Param("did") int did);
DeptMapper.xml
场景模拟:
根据部门id查询部门以及部门中的员工信息
一对多查询时,一那方实体类就要再定义一个集合属性。即部门实体类中还应该再定义List
Dept实体类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
private Integer id;
private String name;
private List empList;
}
DeptMapper接口中定义方法:
/**
*根据部门id查询部门以及部门中的员工信息
*@param did
*@return
*/
Dept getDeptEmpByDid(@Param("did") int did);
DeptMapper.xml映射文件中代码:
注意:两表联查时容易出现表中字段相同的情况,这种情况一定要写别名,并且在resultMap标签中映射
与上述多对一基本是一致的,只是标签不同,多对一使用的是collection标签
DeptMapper接口中方法:
/**
*分步查询部门和部门中的员工
*@param did
*@return
*/
Dept getDeptByStep(@Param("did") int did);
DeptMapper.xml文件中代码:
EmpMapper接口中定义方法:
List getEmpListByDid(int did);
EmpMapper.xml文件中代码:
在MyBatis中,association 和 collection 是用于处理对象关联关系的标签,它们分别用于实现一对一和一对多(或多对一)的数据映射。
association (一对一或多对一映射)
collection (一对多或多对多映射)
总结来说,association 主要用于一对一或者多对一关系,而 collection 适用于处理一对多或者多对多的关系。通过这两种标签,可以方便地将关联表数据映射到Java对象图中,形成一个完整的对象模型。