赞
踩
书接上篇从入门到再入门-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只做增强, 不做修改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。