一、概述
MyBatis 的一对一、多对多,主要就是 resultMap 两个属性的使用,而一对多和多对一都是相互的,只是站的角度不同:
- 【一对多】association:一个复杂的类型关联。许多结果将包成这种类型
- 【多对多】collection:复杂类型的集合
二、实例
以员工管理系统为例,说明两个属性的使用方法。
- department 和 user,是一对多关系,一个部门可以拥有多个员工。
- role 和 user 是多对多关系,一个角色可能有多个员工,而一个员工也可能有多个角色。而要实现多对多,在程序中则是拆分成两个一对多,详情见下面的实体类注释。
1️⃣User
@Data
public class User {
private Integer id;
private String username;
private String address;
//多对一,一个部门多个员工
private Department dept;
//一对多,一个用户可能有多个角色。
private List<Role> roles;
public User() {
}
}
2️⃣Role
@Data
public class Role {
Integer roleId;
String roleName;
//一对多,1个角色也可能被多个用户拥有,所以是list
private List<User> users;
}
3️⃣Department
@Data
public class Department {
Integer deptId;
String deptName;
//1对多,1个部门多个用户
List<User> users;
}
4️⃣UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxp.dao.UserDao">
<resultMap id="user" type="com.xxp.object.userManagement.User">
<id property="id" column="user_id"></id>
<result property="username" column="user_name"></result>
<result property="address" column="user_address"></result>
<!-- 【一对一】association 标签对应user中的dept成员变量的属性。-->
<association property="dept" javaType="com.xxp.object.userManagement.Department">
<result property="deptName" column="dept_name"></result>
</association>
<!-- 【多对多】 collection代表集合 roles代表User中成员变量的名字 -->
<collection property="roles" ofType="com.xxp.object.userManagement.Role">
<id property="roleId" column="role_id"></id>
<result property="roleName" column="role_name"></result>
</collection>
</resultMap>
<!-- 一对一 -->
<select id="queryOneToOne" resultMap="user">
select u.*,d.dept_name from t_user u , t_department d where u.dept_id = d.dept_id
</select>
<!-- 多对多 -->
<select id="queryManyToMany" resultMap="user">
select * from t_user u
left join t_user_role ur on u.user_id=ur.uid
left join t_role r on ur.rid=r.role_id
</select>
</mapper>
不管是一对多、多对一,还是多对多,只需要知道这两个属性哪个代表多哪个代表一,就可以很好的在实体的mapper文件中配置出来。