MyBatis---简单关系查询
联合查询
<!-- 处理关系查询相关的复杂返回数据类型(本例中未曾用到) -->
<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---简单关系查询的更多相关文章
- MyBatis Generator 生成的example 使用 and or 简单混合查询
MyBatis Generator 生成的example 使用 and or 简单混合查询 参考博客:https://www.cnblogs.com/kangping/p/6001519.html 简 ...
- MyBatis简单的增删改查以及简单的分页查询实现
MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(三)(错误整理篇)
使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二) 以上两篇已经把流 ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)
这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一)
梳理下使用spring+springMVC+mybatis 整合后的一个简单实例:输入用户的 ID,之后显示用户的信息(此次由于篇幅问题,会分几次进行说明,此次是工程的创建,逆向生成文件以及这个简单查 ...
- mybatis多表查询之多对多关系查询的实现-xml方式
Mybatis对于多对多关系下的查询提供了集合(collection)的概念来解决,collection属性是resultMap高级结果映射的子集,首先,在本例中我们使用的是集合元素来解决多对多的查询 ...
- mybatis的collection查询问题以及使用原生解决方案的结果
之前在springboot+mybatis环境的坑和sql语句简化技巧的第2点提到,数据库的一对多查询可以一次查询多级数据,并且把拿到的数据按id聚合,使父级表和子级表都有数据. 但是这种查询,必然要 ...
- mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别
(转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-man ...
- MyBatis 示例-联合查询
简介 MyBatis 提供了两种联合查询的方式,一种是嵌套查询,一种是嵌套结果.先说结论:在项目中不建议使用嵌套查询,会出现性能问题,可以使用嵌套结果. 测试类:com.yjw.demo.JointQ ...
- JavaWeb_(Mybatis框架)关联查询_六
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
随机推荐
- php-fpm如何优化进程数
参考链接: php-fpm进程数优化
- java:xml解析
DOM.SAX.JDOM.DOM4J四种解析:https://www.cnblogs.com/longqingyang/p/5577937.html Java解析XML文件例子:https://blo ...
- python+pywinauto之PC端自动化一
所需软件安装: 1.下载 pywinauto 安装参考: https://jingyan.baidu.com/article/414eccf6a1a3906b421f0a59.html 下载地址: h ...
- Anaconda上安装Tensorflow并在jupyter上运行
博客原文地址:https://blog.csdn.net/index20001/article/details/73555182 https://www.cnblogs.com/HongjianChe ...
- Java中的字符集
Java中的字符集 1.字符集概述 字符集是各国家文字与字符编码对照表.字符可以看成是计算机中展示的图案效果,每个字符集都对每一种图案进行编码,有着一对一的对应关系.因此进行字符输出时,都需要指定使用 ...
- 非常全面的PHP header函数设置HTTP头的示例
突然看到这个,觉得很好,就拿过来了,如下: //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Conten ...
- 正交矩阵、正规矩阵和酉矩阵(转自Ramble Over The Cloud~)
网址:http://blog.csdn.net/alec1987/article/details/7414450 在数学中,正规矩阵 是与自己的共轭转置交换的复系数方块矩阵,也就是说, 满足 其中 是 ...
- DP找最优配置,(POJ1018)
题目链接:http://poj.org/problem?id=1018 这个DP,我的头都快晕了. dp[i][j]表示取到第i个设备,宽带为j时的最小价格. 状态转移方程: dp[i][k]=min ...
- 用到UdpClient的一点经验
Thread.Abort对UdpClient.Receive阻塞的线程无效 http://computer-programming-forum.com/4-csharp/184f9d4ee63704f ...
- 解决调用Office组件的问题
在修改一个之前工作的好好的工具的时候出了如下错误: 无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Excel ...