记得要跟对象搞好关系啊,来聊下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

对象设计:

@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只做增强, 不做修改。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪飞yes

我对钱没兴趣~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值