书接上篇从入门到再入门-MyBatis-Plus6-SQL查询下 今天来讲下MyBatis-Plus中关联关系的处理。
学习要求
良好的java基础, 熟悉SpringBoot框架,熟悉Mybatis框架
教程目标
了解并掌握MyBatis-Plus对象间关联关系。
视频教程
概念
关系型库数据对象与对象间以下几种关联关系
一对一关系
A表一条数据只能映射到B表唯一一条数据
以QQ号与QQ空间为例子:一个QQ号对应一个QQ空间
表设计:
关系维护:同id原则,共用id,即QQ表中id就是zone表的id
对象设计:
@Data
public class QQ {
private Long id;
private String num;
private Zone zone; //维护关系由主表维护
}
@Data
class Zone {
private Long id;
private String url;
}
MyBatis
在做查询时,mybatis的写法
<resultMap id="BaseResultMap" type="com.langfeiyes.mp.domain.QQ" >
<id column="id" jdbcType="BIGINT" property="id" />
<result column="num" jdbcType="VARCHAR" property="num" />
<result column="z_id" property="zone.id" />
<result column="z_url" property="zone.url" />
</resultMap>
<select id="selectSingle" resultMap="BaseResultMap">
select q.id, q.num, z.id z_id, z.url z_url from qq q left join zone z on q.id = z.id
</select>
MyBatis-Plus
MyBatis-Plus使用额外sql方式进行进行查询
@Test
public void testQuery10() {
QueryWrapper<QQ> wrapper = new QueryWrapper<>();
List<QQ> list = QQMapper.selectList(wrapper); //先查素有QQ对象
for(QQ q : list){
q.setZone(zoneMapper.selectById(q.getId())); //通过QQ对象带有的zoneid查询zone对象(id一样)
}
}
一对多关系
A表一条数据可以映射B表多条数据
以部门与员工为例子:一个部门可以对应多个员工, 此时主角是部门
表设计:
关系维护:在多方(员工)设置外键,引致部门主键
对象设计:
@Data
class Department {
private Long id;
private String dname;
//1对多关系,一方为主导,对象中关系维护交给一方
private List<Employee> es = new ArrayList<>();
}
@Data
class Employee {
private Long id;
private String ename;
}
MyBatis
一堆多关系查询,需要使用Collection进行额外配置
<resultMap id="BaseResultMap" type="com.langfeiyes.mp.domain.Department" >
<id column="id" jdbcType="BIGINT" property="id" />
<result column="dname" jdbcType="VARCHAR" property="dname" />
<collection property="es" ofType="com.langfeiyes.mp.domain.Employee">
<id column="e_id" property="id"/>
<result column="e_name" property="ename"/>
</collection>
</resultMap>
<select id="selectList" resultMap="BaseResultMap">
select d.id, d.dname, e.id e_id, e.ename e_name
from department d left join employee e on d.id = e.deptid
</select>
MyBatis-Plus
MyBatis-Plus使用额外sql方式进行进行查询
@Test
public void testQuery10() {
QueryWrapper<Department> wrapper = new QueryWrapper<>();
List<Department> list = departmentMapper.selectList(wrapper); //先查部门对象集合
for(Department d : list){
d.setEs(employeeMapper.selectByDeptId(d.getId())); //通过部门id查询员工集合
}
}
多对一关系
跟一对多关系一样,区分在所站的角度。
以部门与员工为例子:多个员工属于一个部门, 此时主角是员工
表设计:
关系维护:在多方(员工)设置外键,引致部门主键
对象设计:
@Data
class Department {
private Long id;
private String dname;
}
@Data
class Employee {
private Long id;
private String ename;
//多对1关系,多方为主导,对象中关系维护交给多方
private Department dept;
}
多对多关系
A表的一条数据可以映射B表多条数据,B表的一条数据也可以映射A表多条数据
以老师与学生为例子:一个老师可以教多个学生,一个学生可以给多个老师教
表设计:
关系维护:设计中间表,使用额外的表存放多对多关系映射id
对象设计:
@Data
class Student {
private Long id;
private String sname;
//多对多关系,核心对象为主导,对象中关系维护交它维护
private List<Teacher> ts = new ArrayList<>();
}
@Data
class Teacher {
private Long id;
private String tname;
}
上面面多对一,多对多操作跟之前的一对一,一堆多操作,大同小异,这里不展开讲了。
总之,MyBatis-Plus 对多表操作并不是很友好,只支持额外SQL查询方式,开发中如果复杂的SQL建议使用xml的方式。MyBatis-Plus无缝兼容Mybatis,因为:MyBatis-Plus只做增强, 不做修改。