联合查询

<!-- 处理关系查询相关的复杂返回数据类型(本例中未曾用到) -->
<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. (转)轻松解决 MyEclipse、Eclipse 编译时提示 @Override The method of type must override a superclass method 即 @Override 标注问题

    刚才在把工程从其他地方导入到自己机子的 MyEclipse 下时,出现了 The method of type must override a superclass method ,提示的是实现类必须 ...

  2. 如何通过C#实现网页信息采集的方法总结

    Internet上有着极其庞大的资源信息,各行各业的信息无所不有.网页的信息搜集就是获取网页的数据,然后通过程序分析,将有用的数据提取分离出来.搜索引擎工作的一部分就是网页数据抽取.比如编制程序抽取新 ...

  3. SAP UI5和CRM WebUI的View和Controller是如何绑定的

    UI5 例如我在UI5的界面上画一个按钮,点击之后弹出一个Alert dialog. 在XML view里只定义了controller的名称和事件处理函数的名称.那么按钮被点击之后,controlle ...

  4. percona-toolkit 工具集安装

    下载地址: www.percona.com/downloads/percona-toolkit     安装方法一,源码安装: perl Makefile.PL make:make install   ...

  5. andriod给ListView中的TextView增加跑马灯效果

    正常情况下跑马灯效果只需要在TextView中添加android:ellipsize="marquee" android:singleLine="true" a ...

  6. 【转】Android的setTag

    前言 首先我们要知道setTag方法是干什么的,SDK解释为 Tags Unlike IDs, tags are not used to identify views. Tags are essent ...

  7. Thread 创建线程

    1.该线程变量 无参数 我们可以把线程的变量 理解为一个 委托.可以指向一个方法.有点像c语言中的指向函数的指针. 第1步我们创建了 Thread变量t1 ,第2步创建了一个方法threadChild ...

  8. MyBatis简单了解

    MyBatis 是什么? MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代 码,并提供了一个简单易用的 AP ...

  9. window环境下安装node.js

    在使用sublime text 3 过程中,node.js装了好几次都没有成功,今天终于成功了,现将安装过程整理一下. 安装过程中主要参考了以下代码: 第一,下载文件 https://nodejs.o ...

  10. 一篇SSM框架整合友好的文章(三)

    ###一.SpringMVC理论 它始终是围绕 handler. 数据模型 model. 页面view进行开发的. 运行流程图: 通过mvc配置文件,配置"中央处理器"dispat ...