有时候我们的POJO对象经常不是一个简单的对象,往往存在着一对一或者一对多的关系。就如一个学生可以有一个班主任,有多门课程一样:

public class StudentCourse {private String sId;private String sName;private String sBirth;private String sSex;private Teacher teacher;private List<Course> courseList;
}

这种情况就是级联了。

mybatis 中的三种级联

  • association:代表一对一关系。
  • collection:代表一对多关系。
  • discriminator:鉴别器,允许根据特定的条件去关联不同的结果集

association 一对一级联


假定:学生(Student)和班主任(Teacher)是一对一的关系:

public class Student {private String sId;private String sName;private String sBirth;private String sSex;private Teacher teacher;
}
<!--查询学生的接口-->
<select id="getStudent" resultMap="oneToOneMap">select s_id,s_name,s_birth,s_sex from Studentwhere s_id in (01)
</select><!--查询老师的接口-->
<select id="selectTeacherById" resultType="om.wys.combineduse.pojo.Teacher">select t_name,t_id from Teacherwhere t_id = #{tId}
</select><resultMap id="oneToOneMap" type="com.wys.combineduse.pojo.Student"><id column="s_id" property="sId" /><result column="s_name" property="sName" /><result column="s_birth" property="sBirth" /><result column="s_sex" property="sSex" /><!--在resultMap中调用 查询老师的接口 实现级联查询,column 是 查询老师的接口 的入参--><association property="teacher" column="s_id" select="com.wys.combineduse.dao.StudentMapper.selectTeacherById"/>
</resultMap>

执行的过程:先查询出 Student 的信息,然后根据 column=“s_id” 作为老师 的 tId 查询出老师的信息。


collection 一对多级联

假定:学生(StudentCourse)和课程(Course)是一对多的关系:

public class StudentCourse {private String sId;private String sName;private String sBirth;private String sSex;private Teacher teacher;private List<Course> courseList;
}
<!--查询学生接口-->
<select id="getStudentCourse" resultMap="oneToManyMap">select s_id,s_name,s_birth,s_sex from Studentwhere s_id in (01)
</select>
<!--查询课程接口 返回值为course-->
<select id="getCourseById" resultType="com.wys.combineduse.pojo.Course">select c_id,c_name,t_id from Coursewhere t_id = #{tId}
</select><resultMap id="oneToManyMap" type="com.wys.combineduse.pojo.StudentCourse"><id column="s_id" property="sId" /><result column="s_name" property="sName" /><result column="s_birth" property="sBirth" /><result column="s_sex" property="sSex" /><!--一对一的级联查询--><association property="teacher" column="s_id" select="com.wys.combineduse.dao.StudentMapper.selectTeacherById"/><!--一对多的级联查询,自动把Course对象装配进courseList中--><collection property="courseList" column="s_id" select="com.wys.combineduse.dao.StudentMapper.getCourseById"/>
</resultMap>

N+1问题:多一个关联,SQL就要多执行一次。每次取一个Student对象,那么它所有关联的信息都会被取出来。这样会造成SQL执行过多导致性能下降。

注意事项:

需要传递多参数时,在column中用需要用"{}"将参数包起来, =左侧的为mapper中定义的param,也就是实体类中映射的字段, =右侧为主查询的数据库的对应表的表字段名  ,
如:<collection property="highList" column="{id= id,standardId= standard_id}" select="getChildById"/>单参数传递时不用"{}",如:<collection property="highRuleList" column="id" select="getHighRuleList"/>

另一种级联

上面的级联会有N+1的问题,下面这种方式更加的简单和直接:

<!--   主推这种查询,没有n+1问题!-->
<select id="getStudentCourseByOther" resultMap="oneToManyOtherMap">select s.s_id,s.s_name,s.s_birth,s.s_sex,t.t_name,t.t_id,c.c_id,c.c_name,c.t_id from Student sleft join Teacher t on s.s_id = t.t_idleft join Course c on t.t_id = c.t_idwhere s_id in (01)
</select><resultMap id="oneToManyOtherMap" type="com.wys.combineduse.pojo.StudentCourse"><id column="s_id" property="sId" /><result column="s_name" property="sName" /><result column="s_birth" property="sBirth" /><result column="s_sex" property="sSex" /><association property="teacher" column="s_id" javaType="com.wys.combineduse.pojo.Teacher"><id column="t_id" property="tId" /><result column="t_name" property="name" /></association><!--ofType属性定义的是collection里面的泛型是上面Java类型,MyBatis会拿定义的Java类和结果集做映射--><collection property="courseList" column="s_id" ofType="com.wys.combineduse.pojo.Course" ><id column="c_id" property="cId" /><result column="c_name" property="cName" /><result column="t_id" property="tId" /></collection>
</resultMap>

mybatis 级联查询相关推荐

  1. MyBatis级联查询

    文章目录 MyBatis级联查询 简介 一对一 创建数据库初始数据 创建实体类 创建Mapper类及XML 提供两次方式xml进行查询,代码均在StudentMapper .xml 分步查询 单步查询 ...

  2. mybatis级联查询list_MyBatis手把手跟我做系列(四) ---级联查询与懒加载

    涉及到数据库的级联查询,那肯定就要提到一对一,一对多,多对多这样的表关系,以及java程序与之对应的类和类之间的表现形式,我这里主要通过一对多的表关系给大家介绍以下MyBatis里面对于级联关系的处理 ...

  3. layui表格显示后台的多表的级联查询(多对多,多对一)带mybatis级联查询源码,已解决

    在ssm和springboot项目中我们存在表与表之间一对多和多对多的情况,那么他们就要进行级联查询查询出相关联的数据,级联查询涉及到的问题就是在一个实体类中存在另一个实体类的对象(一对一)或者对象集 ...

  4. mybatis 级联查询兑现_MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)...

    A:首先先看下一个简单的面试题 斐波那契数列 计算数组{1,1,2,3,5,8.......} 第30位值 规律:1 1 从第三项开始,每一项都是前两项之和 有两种实现方式 第一种方式: public ...

  5. mybatis级联查询(主子查询)

    主表类 public class SysClass{private String classId;private String className;private String classType;/ ...

  6. mybatis一对多关联 创建_MyBatis多对多关联查询(级联查询)

    其实,MyBatis 没有实现多对多级联,这是因为多对多级联可以通过两个一对多级联进行替换. 例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系,使用一个中间表(订 ...

  7. mybatis 一对一 一对多 级联查询

    大家好,我是烤鸭: 今天分享一下关于mybatis的级联查询. 环境: mybatis   3.2.8 spring      4.1.9 1.   业务场景 在一个人申请某些账号或者权限的时候,比如 ...

  8. MyBatis实现级联查询及逆向生成

    MyBatis实现级联查询及逆向生成 一,级联查询 1.级联查询 N-1 ​ 以多的一方为主表 接口 //级联查询 N-1List<Emp> selectEmp(Map map); 映射文 ...

  9. MyBatis 的级联查询

    最近面试遇上一个问题就是问我MyBatis怎么级联查询 例如查询老师的时候把他的学生也查询出来 没回答上,回来自己看了看资料 找到方法了 记录下 我这里实现的是查询用户的时候把他的详情(一对一)和他的 ...

最新文章

  1. mysql 代替不明_mysql不明原因停止后不能启动,请高手分析
  2. python开发工具
  3. php 将换行符替换,PHP替换回车换行符的三种方法
  4. SQL 2005 中的数据约束
  5. 针对Chrome的css的hack写法
  6. tf.slice解析
  7. 我的世界java村民繁殖_我的世界:Java19w08a更新,村民加强守卫,小狐狸背叛
  8. python将字典作为参数传入函数
  9. python装饰器简单理解_python装饰器的简单理解
  10. 3月30日见!荣耀30S外观“偷跑”:经典蝶羽纹理设计
  11. 从零开始用python处理excel视频_从零开始学数据分析,什么程度可以找工作,如何计划学习方案?...
  12. 精读ConViT: Improving Vision Transformerswith Soft Convolutional Inductive Biases
  13. 黑马 docker 学习笔记
  14. Vue 实现 Chrome 小恐龙游戏
  15. 利用matlab实现AM调制解调
  16. 2019暑期集训感悟
  17. BT 运行及内网穿透原理
  18. 全面解析大数据解决方案的架构层
  19. H3C交换机如何进行批量端口配置
  20. 总结一下强大的ES6符号

热门文章

  1. codeforces:E1. Divisible Numbers (easy version)【数论 + 复杂度计算 + 分解质因数】
  2. 企业如何数据集成?数据集成解决方案
  3. CodeForces Round #521 (Div.3) B. Disturbed People
  4. macbook pro键盘按键帽清理,修复手感变差的问题
  5. 基于CT107D开发板的控制ne555方波发生器输出200Hz-20kHz频率
  6. Linux下rsh服务配置
  7. win10此电脑默认7个文件夹(附+ OneDrive、Catch!)隐藏方法
  8. 在微信公众号上下载视频音频的办法
  9. unreal4 源码引言
  10. 数量X金额=总额 再例如X抽成0.08等出抽成金额180,大师们帮忙改一下下,万分感谢!