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对表进行增.删.改.查操作_ ...
随机推荐
- 数据批量删除_从页面js到后台数据库
LayUI 批量选择的 ,然后操作 batchdel: function () { var checkStatus = table.checkStatus('LAY-gridview') , ch ...
- java环境变量配置备忘录
用鼠标右击“我的电脑”->属性->高级->环境变量系统变量->新建->变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.6.0_1 ...
- SPFieldLookupValue
//得到查阅项的值SPWeb web = site.OpenWeb();SPList list = web.Lists["DemoList"];SPListItem item = ...
- 异常处理 try...catch...finally 执行顺序, 以及对返回值得影响
异常处理 try...catch...finally 执行顺序, 以及对返回值得影响 结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,fina ...
- Linux命令之添加权限Chmod的使用
chmod是change mode的缩写,是修改文件权限的一个命令: 一个文件分别有三组权限:用户拥有者,用户组 第一个横杆-表示文件,如果是d表示目录.还有可能是l,表示链接. 第一组(rw-)表示 ...
- JAVA StringBuffer的用法
在使用StringBuffer 的时候,习惯性的像String一样把他初始化了 StringBuffer result = null; 结果警告:Null pointer access: The va ...
- Open Data for Deep Learning
Open Data for Deep Learning Here you’ll find an organized list of interesting, high-quality datasets ...
- Verilog频率计设计
这是以前的一个可编程逻辑课上机实验三 实验报告 数字频率计的基本设计思路是在给定一个time开始测量的时候产生的T的个数,也就是采用一个标准的基准时钟,在单位时间(1秒)里对被测信号的脉冲数进行计数. ...
- Linux空间PHP开发环境小白教程(LAMP)
租了一个云服务器, 但是只有linux系统,没有php开发环境, 只好自己摸索着一步一步安装啦. 本教程来自自学IT创E老师的Linux教程,想详细了解的可以去论坛找. 一.使用PUTTY登录服务器 ...
- C++STL之multiset多重集合容器
multiset多重集合容器 multiset与set一样, 也是使用红黑树来组织元素数据的, 唯一不同的是, multiset允许重复的元素键值插入, 而set则不允许. multiset也需要声明 ...