联合查询

<!-- 处理关系查询相关的复杂返回数据类型(本例中未曾用到) -->
<resultMap type="SchoolStudent" id="SchoolStudentMap">
  <id property="schoolStudentId" column="schoolStudentId"/>
  <result property="teacher" column="teacher"/>
  <result property="teacherAge" column="teacherAge"/>
  <association property="studentId" column="studentId" javaType="int">
    <id property="studentId" column="studentId"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
  </association>
</resultMap>
<select id="selectSchoolStudentJoin" resultMap="SchoolStudentMap">
  select * from schoolStudent join student on schoolStudent.studentId = student.studentId
</select>

id="SchoolStudentMap":调用该resultMap的id

type="SchoolStudent":返回的类型

id property="schoolStudentId":SchoolStudent类中的id主键字段

column="schoolStudentId":schoolstudent表中与schoolStudentId相对应的字段

result property="teacher" column="teacher":SchoolStudent类中其它字段

association property="studentId":与SchoolStudent关联的子查询表的配置,这里的property属性是SchoolStudent类中与子查询类中关联的属性

column="studentId":与SchoolStudent关联的子查询表的配置,这里的column属性是SchoolStudent表中对应property的字段

javaType="int":返回到SchoolStudent类中时的值的类型

association中的其它配置与SchoolStudent主表配置相同,不过是关联表中的属性与对应的字段

构造函数查询

<resultMap id="SchoolStudentConstructor" type="SchoolStudent" >
  <id property="id" column="schoolStudent.id" />
  <result property="teacher" column="teacher" />
  <result property="age" column="age" />
  <association property="student" column="studentId" javaType="Student">
    <constructor>
      <idArg column="studentId" javaType="int"/>
      <arg column="name" javaType="String"/>
      <arg column="zhuangtai" javaType="int"/>
    </constructor>
  </association>
</resultMap>

association property="student":与SchoolStudent关联的子查询表的配置,这里的property属性是SchoolStudent类中的属性(关联表的类对象)

column="studentId":与SchoolStudent关联的子查询表的配置,这里的column属性是SchoolStudent表中对应property的字段,该字段与关联表的某字段关联

javaType="Student":返回到SchoolStudent类中时的值的类型,这里只能是关联表的类对象(别名)

constructor 设置关联表的类中的构造函数的参数。这里传入了多少参数,类中的构造函数中就有多少参数。这里的int对应类中构造函数中数据类型为Integer。值得注意的是,使用这种方式,在类中必须包含一个无参的构造函数;查询的主表与关联表中的字段名不能相同(除关联字段以外)

子查询

联合查询一次查询,占用资源大;子查询N+1次查询,占用资源可大可小。MyBatis通过懒加载的方式处理了子查询N+1次查询的问题。懒加载的原理就是先查询需要返回的主表的类对象,当用到所包含的子类对象时,才会去查询所包含的子类对象

使用懒加载必须要先启动懒加载(将以下代码加入MyBatisConfig.xml文件中:需要放在创建别名之前)

<!-- 启动懒加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

在对应的map.xml中写查询

<resultMap id="SchoolStudentSubMap" type="SchoolStudent" >
  <id property="id" column="schoolStudent.id" />
  <result property="teacher" column="teacher" />
  <result property="age" column="age" />
  <association property="student" column="studentId" javaType="Student" select="getStudentById">
  </association>
</resultMap>
<select id="selectSchoolStudentJoin" resultMap="SchoolStudentSubMap">
  select * from schoolStudent where schoolStudent.studentId in (select studentid from student)
</select>

以上代码中association的select属性是用于调用查询并返回student子表类对象的select

<select id="getStudentById" parameterType="int" resultType="Student">
  select *
  from student where studentId=#{studentId}
</select>

测试与结果

List<SchoolStudent> schoolStudents = sqlSession.selectList("selectSchoolStudentJoin");
//for(SchoolStudent schoolStudent : schoolStudents) {
//  System.out.println(schoolStudent.getTeacher());
//  System.out.println("========================");
//  int id = schoolStudent.getStudent().getStudentId();
//  System.out.println("学生id" + id);
//}
if (schoolStudents != null) {
  System.out.println(schoolStudents.get(0).getTeacher());
  System.out.println("========================");
  int id = schoolStudents.get(0).getStudent().getStudentId();
  System.out.println("学生id" + id);
}

控制台输出

只使用了其中一条数据

2017-12-15 22:58:31,801 [main] DEBUG [/.selectSchoolStudentJoin] - ==>  Preparing: select * from schoolStudent where schoolStudent.studentId in (select studentid from student)
2017-12-15 22:58:31,864 [main] DEBUG [/.selectSchoolStudentJoin] - ==> Parameters:
2017-12-15 22:58:31,947 [main] DEBUG [/.selectSchoolStudentJoin] - <== Total: 2
李四的教师
========================
2017-12-15 22:58:31,949 [main] DEBUG [/.getStudentById] - ==> Preparing: select * from student where studentId=?
2017-12-15 22:58:31,950 [main] DEBUG [/.getStudentById] - ==> Parameters: 2(Integer)
2017-12-15 22:58:31,953 [main] DEBUG [/.getStudentById] - <== Total: 1
学生id2

使用了全部数据(测试中使用for)

2017-12-15 23:09:27,260 [main] DEBUG [/.selectSchoolStudentJoin] - ==>  Preparing: select * from schoolStudent where schoolStudent.studentId in (select studentid from student)
2017-12-15 23:09:27,305 [main] DEBUG [/.selectSchoolStudentJoin] - ==> Parameters:
2017-12-15 23:09:27,377 [main] DEBUG [/.selectSchoolStudentJoin] - <== Total: 2
李四的教师
========================
2017-12-15 23:09:27,378 [main] DEBUG [/.getStudentById] - ==> Preparing: select * from student where studentId=?
2017-12-15 23:09:27,378 [main] DEBUG [/.getStudentById] - ==> Parameters: 2(Integer)
2017-12-15 23:09:27,380 [main] DEBUG [/.getStudentById] - <== Total: 1
学生id2
王五的教师
========================
2017-12-15 23:09:27,381 [main] DEBUG [/.getStudentById] - ==> Preparing: select * from student where studentId=?
2017-12-15 23:09:27,381 [main] DEBUG [/.getStudentById] - ==> Parameters: 3(Integer)
2017-12-15 23:09:27,383 [main] DEBUG [/.getStudentById] - <== Total: 1
学生id3

特别注意:

  • 这里的联合查询,在SchoolStudent表中都包含了关联的子表对象。相关联的表中的字段名除关联字段以外不能有相同的,否则便得不到对应的值。比如SchoolStudent中有id,而Student表中同样有id,那么查询时,得不到id的值

MyBatis---简单关系查询的更多相关文章

  1. MyBatis Generator 生成的example 使用 and or 简单混合查询

    MyBatis Generator 生成的example 使用 and or 简单混合查询 参考博客:https://www.cnblogs.com/kangping/p/6001519.html 简 ...

  2. MyBatis简单的增删改查以及简单的分页查询实现

    MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...

  3. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(三)(错误整理篇)

    使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二) 以上两篇已经把流 ...

  4. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)

    这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...

  5. 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一)

    梳理下使用spring+springMVC+mybatis 整合后的一个简单实例:输入用户的 ID,之后显示用户的信息(此次由于篇幅问题,会分几次进行说明,此次是工程的创建,逆向生成文件以及这个简单查 ...

  6. mybatis多表查询之多对多关系查询的实现-xml方式

    Mybatis对于多对多关系下的查询提供了集合(collection)的概念来解决,collection属性是resultMap高级结果映射的子集,首先,在本例中我们使用的是集合元素来解决多对多的查询 ...

  7. mybatis的collection查询问题以及使用原生解决方案的结果

    之前在springboot+mybatis环境的坑和sql语句简化技巧的第2点提到,数据库的一对多查询可以一次查询多级数据,并且把拿到的数据按id聚合,使父级表和子级表都有数据. 但是这种查询,必然要 ...

  8. mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别

    (转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-man ...

  9. MyBatis 示例-联合查询

    简介 MyBatis 提供了两种联合查询的方式,一种是嵌套查询,一种是嵌套结果.先说结论:在项目中不建议使用嵌套查询,会出现性能问题,可以使用嵌套结果. 测试类:com.yjw.demo.JointQ ...

  10. JavaWeb_(Mybatis框架)关联查询_六

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

随机推荐

  1. oracle自动异地备份数据库

    需求:实现oracle自动异地备份数据库 分析:1.oracle备份数据库     2.自动备份(定时)   3.非本地备份(因为如果备份到本地的话,如果硬件设备损坏可能导致数据丢失) 知识点:1.备 ...

  2. js获取及判断键盘按键的方法

    这篇文章主要介绍了js获取及判断键盘按键的方法,涉及JavaScript键盘事件的获取及键值的判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下   本文实例讲述了js获取及判断键盘按键的方法.分享 ...

  3. 笨办法学Python(三十二)

    习题 32: 循环和列表 现在你应该有能力写更有趣的程序出来了.如果你能一直跟得上,你应该已经看出将“if 语句”和“布尔表达式”结合起来可以让程序作出一些智能化的事情. 然而,我们的程序还需要能很快 ...

  4. VirtualBox虚拟机 host/guest 拷贝粘贴,共享剪贴板,安装guest additions

    Oracle VirtualBox 虚拟机,为了在主机.从机间拷贝文件,共享剪贴板,需要进行设置,以及安装guest additions软件 测试环境 host: windows 7 professi ...

  5. 不同编程语言在发生stackoverflow之前支持的调用栈最大嵌套层数

    今天我的一位同事在微信群里发了一张图片,勾起了我的好奇心:不同编程语言支持的函数递归调用的最大嵌套层数是? Java 1.8 private static void recur(int i){ Sys ...

  6. Excel公式巧用-将新值替换旧值,新值为空保留原值

    使用excel时候遇到 将新值替换旧值,新值为空保留原值的问题,简单使用Excel的函数即可以实现.

  7. 2018年第九届蓝桥杯【C++省赛B组】第四题 测试次数

    x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机.各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通.x星球 ...

  8. Annual Congress of MUD(最大流)

    Annual Congress of MUD 时间限制: 1 Sec  内存限制: 128 MB提交: 80  解决: 10[提交] [状态] [讨论版] [命题人:admin] 题目描述 Multi ...

  9. B1954 The xor-longest Path

    爆炸入口 给定一颗带权值的,节点数为n的树,求树上路径最大异或和. solution: 先dfs将所有点到根的异或和算出来.然后放进tire树中贪心. #include<cstdio> # ...

  10. GPGPU::数学基础教程

    并行方向需要学习的数学知识 http://dev.gameres.com/Program/Visual/3D/GPGPU_math_Tutorial.html