8. mybatis关联关系
大约 2 分钟
1.关联关系
https://www.processon.com/view/link/601d36dd0791294f82228202
在关系型数据库中,表与表之间很少是独立与其他表没关系的。所以在实际开发过程中我们会碰到很多复杂的关联关系。在此我们来分析下载mybatis中怎么处理这些关系
1.1 1对1关系
我们有一张员工表(T_EMP),一张部门表(T_DEPT)。员工表中的一条记录对应于部门表中有且仅有一条记录。这就是一对一的关联关系。
CREATE TABLE `t_dept` (
`deptid` int NOT NULL AUTO_INCREMENT,
`dname` varchar(20) DEFAULT NULL,
`ddesc` varchar(50) DEFAULT NULL,
PRIMARY KEY (`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
CREATE TABLE `t_emp` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL,
`deptid` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
查询每个员工的信息及对应的部门信息
package com.bobo.pojo;
public class Emp {
private Integer id;
private String name;
private Integer age;
// 1对1关联关系的体现 一个员工对象最多有一个部门对象
private Dept dept;
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
部门对象
package com.bobo.pojo;
public class Dept {
private Integer deptid;
private String dname;
private String ddesc;
public Integer getDeptid() {
return deptid;
}
public void setDeptid(Integer deptid) {
this.deptid = deptid;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getDdesc() {
return ddesc;
}
public void setDdesc(String ddesc) {
this.ddesc = ddesc;
}
@Override
public String toString() {
return "Dept{" +
"deptid=" + deptid +
", dname='" + dname + '\'' +
", ddesc='" + ddesc + '\'' +
'}';
}
}
映射文件
<?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.bobo.dao.EmpMapper">
<resultMap id="baseMap1" type="emp">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<!-- 配置1对1的关联关系 -->
<association property="dept" javaType="Dept">
<!-- 从表的属性和字段的映射关系-->
<id column="deptid" property="deptid"/>
<result column="dname" property="dname"/>
</association>
</resultMap>
<select id="queryEmp" resultMap="baseMap1">
SELECT
t1.id,
t1.`name`,
t1.`age`,
t2.`deptid`,
t2.`dname`
FROM
t_emp t1
LEFT JOIN t_dept t2
ON t1.`deptid` = t2.`deptid`
</select>
</mapper>
接口声明
package com.bobo.dao;
import com.bobo.pojo.Emp;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface EmpMapper {
List<Emp> queryEmp();
}
测试
1.2 1对多关系
部门和员工的信息其实就是一个1对多的关联关系
# 查询部门信息 然后关联查询出部门中包含的相关的员工信息
SELECT
t1.`deptid`
,t1.`dname`
,t1.`ddesc`
,t2.`id`
,t2.`name`
,t2.age
FROM t_dept t1
LEFT JOIN t_emp t2
ON t1.`deptid` = t2.`deptid`
pojo对象
映射文件配置
<resultMap id="baseMap2" type="dept">
<id column="deptid" property="deptid"/>
<result column="dname" property="dname"/>
<collection property="emps" ofType="emp">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</collection>
</resultMap>
<select id="queryDept" resultMap="baseMap2">
SELECT
t1.`deptid`
,t1.`dname`
,t1.`ddesc`
,t2.`id`
,t2.`name`
,t2.age
FROM t_dept t1
LEFT JOIN t_emp t2
ON t1.`deptid` = t2.`deptid`
</select>
测试
1.3 多对多关系
双向的一对多就是多对多关系