当前位置:   article > 正文

记得要跟对象搞好关系啊,来聊下MyBatis-Plus对象关系_mybatis plus 关联对象

mybatis plus 关联对象

书接上篇从入门到再入门-MyBatis-Plus6-SQL查询下 今天来讲下MyBatis-Plus中关联关系的处理。 

学习要求

良好的java基础, 熟悉SpringBoot框架,熟悉Mybatis框架  

教程目标

 了解并掌握MyBatis-Plus对象间关联关系。

视频教程

MyBatisPlus实战教程与开发建议

概念

关系型库数据对象与对象间以下几种关联关系 

一对一关系

A表一条数据只能映射到B表唯一一条数据

以QQ号与QQ空间为例子:一个QQ号对应一个QQ空间

表设计:

关系维护:同id原则,共用id,即QQ表中id就是zone表的id

对象设计:

  1. @Data
  2. public class QQ {
  3. private Long id;
  4. private String num;
  5. private Zone zone; //维护关系由主表维护
  6. }
  7. @Data
  8. class Zone {
  9. private Long id;
  10. private String url;
  11. }

MyBatis

在做查询时,mybatis的写法

  1. <resultMap id="BaseResultMap" type="com.langfeiyes.mp.domain.QQ" >
  2. <id column="id" jdbcType="BIGINT" property="id" />
  3. <result column="num" jdbcType="VARCHAR" property="num" />
  4. <result column="z_id" property="zone.id" />
  5. <result column="z_url" property="zone.url" />
  6. </resultMap>
  7. <select id="selectSingle" resultMap="BaseResultMap">
  8. 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
  9. </select>

MyBatis-Plus

MyBatis-Plus使用额外sql方式进行进行查询

  1. @Test
  2. public void testQuery10() {
  3. QueryWrapper<QQ> wrapper = new QueryWrapper<>();
  4. List<QQ> list = QQMapper.selectList(wrapper); //先查素有QQ对象
  5. for(QQ q : list){
  6. q.setZone(zoneMapper.selectById(q.getId())); //通过QQ对象带有的zoneid查询zone对象(id一样)
  7. }
  8. }

 一对多关系

A表一条数据可以映射B表多条数据

以部门与员工为例子:一个部门可以对应多个员工, 此时主角是部门

表设计:

关系维护:在多方(员工)设置外键,引致部门主键

对象设计:

  1. @Data
  2. class Department {
  3. private Long id;
  4. private String dname;
  5. //1对多关系,一方为主导,对象中关系维护交给一方
  6. private List<Employee> es = new ArrayList<>();
  7. }
  8. @Data
  9. class Employee {
  10. private Long id;
  11. private String ename;
  12. }

MyBatis

一堆多关系查询,需要使用Collection进行额外配置

  1. <resultMap id="BaseResultMap" type="com.langfeiyes.mp.domain.Department" >
  2. <id column="id" jdbcType="BIGINT" property="id" />
  3. <result column="dname" jdbcType="VARCHAR" property="dname" />
  4. <collection property="es" ofType="com.langfeiyes.mp.domain.Employee">
  5. <id column="e_id" property="id"/>
  6. <result column="e_name" property="ename"/>
  7. </collection>
  8. </resultMap>
  9. <select id="selectList" resultMap="BaseResultMap">
  10. select d.id, d.dname, e.id e_id, e.ename e_name
  11. from department d left join employee e on d.id = e.deptid
  12. </select>

MyBatis-Plus

MyBatis-Plus使用额外sql方式进行进行查询

  1. @Test
  2. public void testQuery10() {
  3. QueryWrapper<Department> wrapper = new QueryWrapper<>();
  4. List<Department> list = departmentMapper.selectList(wrapper); //先查部门对象集合
  5. for(Department d : list){
  6. d.setEs(employeeMapper.selectByDeptId(d.getId())); //通过部门id查询员工集合
  7. }
  8. }

多对一关系

跟一对多关系一样,区分在所站的角度。

以部门与员工为例子:多个员工属于一个部门, 此时主角是员工

表设计:

关系维护:在多方(员工)设置外键,引致部门主键

对象设计:

  1. @Data
  2. class Department {
  3. private Long id;
  4. private String dname;
  5. }
  6. @Data
  7. class Employee {
  8. private Long id;
  9. private String ename;
  10. //多对1关系,多方为主导,对象中关系维护交给多方
  11. private Department dept;
  12. }

多对多关系

A表的一条数据可以映射B表多条数据,B表的一条数据也可以映射A表多条数据

以老师与学生为例子:一个老师可以教多个学生,一个学生可以给多个老师教

表设计:

关系维护:设计中间表,使用额外的表存放多对多关系映射id

对象设计:

  1. @Data
  2. class Student {
  3. private Long id;
  4. private String sname;
  5. //多对多关系,核心对象为主导,对象中关系维护交它维护
  6. private List<Teacher> ts = new ArrayList<>();
  7. }
  8. @Data
  9. class Teacher {
  10. private Long id;
  11. private String tname;
  12. }

上面面多对一,多对多操作跟之前的一对一,一堆多操作,大同小异,这里不展开讲了。

总之,MyBatis-Plus 对多表操作并不是很友好,只支持额外SQL查询方式,开发中如果复杂的SQL建议使用xml的方式。MyBatis-Plus无缝兼容Mybatis,因为:MyBatis-Plus只做增强, 不做修改。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/870340
推荐阅读
相关标签
  

闽ICP备14008679号