mybatis中使用懒加载实现一对多复杂查询
1.包结构

2.pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.</modelVersion> <groupId>com.zy</groupId>
<artifactId>mybatis03</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.</version>
</dependency>
</dependencies> </project>
3.main目录下

3.1java目录下
3.1.1model层
===================stu类==========================
package com.zy.model; import java.io.Serializable; /**
* Created by Administrator on 2018/6/27.
*/
public class Stu implements Serializable{ private Integer id;
private String name;
private Integer age; @Override
public String toString() {
return "Stu{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Stu() { } public Stu(Integer id, String name, Integer age) { this.id = id;
this.name = name;
this.age = age;
}
}
=========================classinfo类=================
package com.zy.model; import java.io.Serializable; /**
* Created by Administrator on 2018/6/29.
*/
public class ClassInfo implements Serializable { private Integer id;
private String className; @Override
public String toString() {
return "ClassInfo{" +
"id=" + id +
", className='" + className + '\'' +
'}';
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getClassName() {
return className;
} public void setClassName(String className) {
this.className = className;
} public ClassInfo() { } public ClassInfo(Integer id, String className) { this.id = id;
this.className = className;
}
}
==============score类============================
package com.zy.model; import java.io.Serializable; /**
* Created by Administrator on 2018/6/29.
*/
public class Score implements Serializable { private Integer id;
private String sub;
private Integer score;
private Integer sId; public Integer getsId() {
return sId;
} public void setsId(Integer sId) {
this.sId = sId;
} public Score(Integer id, String sub, Integer score, Integer sId) { this.id = id;
this.sub = sub;
this.score = score;
this.sId = sId;
} @Override
public String toString() {
return "Score{" +
"id=" + id +
", sub='" + sub + '\'' +
", score=" + score +
'}';
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getSub() {
return sub;
} public void setSub(String sub) {
this.sub = sub;
} public Integer getScore() {
return score;
} public void setScore(Integer score) {
this.score = score;
} public Score() { } public Score(Integer id, String sub, Integer score) { this.id = id;
this.sub = sub;
this.score = score;
}
}
3.1.2dto层
==========studto类===================
package com.zy.dto; import com.zy.model.ClassInfo;
import com.zy.model.Stu; /**
* Created by Administrator on 2018/6/29.
*/
public class StuDto extends Stu { private ClassInfo classInfo; public ClassInfo getClassInfo() {
return classInfo;
} public void setClassInfo(ClassInfo classInfo) {
this.classInfo = classInfo;
} public StuDto() { } public StuDto(ClassInfo classInfo) { this.classInfo = classInfo;
} @Override
public String toString() {
return super.toString() + classInfo;
} }
============classinfodto类==========================
package com.zy.dto; import com.zy.model.ClassInfo;
import com.zy.model.Stu; /**
* Created by Administrator on 2018/6/29.
*/
public class ClassInfoDto extends ClassInfo { private Stu stu; public ClassInfoDto(Stu stu) {
this.stu = stu;
} public ClassInfoDto() {
} @Override
public String toString() {
return "ClassInfoDto{" +
"stu=" + stu +
'}';
} public Stu getStu() {
return stu;package com.zy.dto; import com.zy.model.Score;
import com.zy.model.Stu; import java.util.List; /**
* Created by Administrator on 2018/6/29.
*/
public class ScoreDto extends Stu { private List<Score> list; @Override
public String toString() {
return "ScoreDto{" +
"list=" + list +
"} " + super.toString();
} public List<Score> getList() {
return list;
} public void setList(List<Score> list) {
this.list = list;
} public ScoreDto(List<Score> list) { this.list = list;
} public ScoreDto() { }
} } public void setStu(Stu stu) {
this.stu = stu;
}
}
==================ScoreDto类==================
3.1.3mapper层
===============StuMapper接口===================
package com.zy.mapper; import com.zy.dto.ClassInfoDto;
import com.zy.dto.ScoreDto;
import com.zy.model.Stu;
import org.apache.ibatis.annotations.Param; import java.util.List; /**
* Created by Administrator on 2018/6/27.
*/ public interface StuMapper { // 根据班级id获取学生信息
List<Stu> getStuByClassId(@Param("id") Integer id); // 分步查询(一对一):即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载
List<ClassInfoDto> getStuByClassIdStep(@Param("id") Integer id); // 分步查询(一对多):即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载
List<ScoreDto> getStuByScoreStep(@Param("id") Integer id); }
===================ClassInfoMapper接口=================
package com.zy.mapper; import com.zy.model.ClassInfo;
import org.apache.ibatis.annotations.Param; /**
* Created by Administrator on 2018/6/29.
*/
public interface ClassInfoMapper { // 根据班级id查询班级信息
ClassInfo getClassById(@Param("cid") Integer id);
}
==================ScoreMapper接口=============
由于是最后一层,可写可不写方法,但接口一定要定义!!!!!!!!!!!!!!!
3.1.4util层(用于Junit测试)
package com.zy.util; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; /**
* Created by Administrator on 2018/6/27.
*/
public class MybatisUtil { private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
private static SqlSessionFactory sqlSessionFactory; static {
InputStream is = MybatisUtil.class.getClassLoader().getResourceAsStream("sqlMappingConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} /*定义或者sqlSession的方法*/
public static SqlSession getSqlSession() {
SqlSession sqlSession = threadLocal.get();
if (sqlSession == null) {
sqlSession = sqlSessionFactory.openSession(true);
threadLocal.set(sqlSession);
}
return sqlSession;
} /*定义关闭方法*/
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession != null){
sqlSession.close();
threadLocal.remove();
}
}
}
3.2resources目录下

3.2.1sqlMappingConfig.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--读取配置文件-->
<properties resource="db.properties"/>
<!--设置全局配置环境-->
<settings>
<!--开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
<!--开启懒加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--根据对象触发配置需要关闭-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!--配置别名:不推荐使用-->
<typeAliases></typeAliases>
<!--配置数据库环境-->
<environments default="mysql_dev">
<environment id="mysql_dev">
<!--事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--数据库-->
<!--POOLED,UNPOOLED,JNDI-->
<dataSource type="POOLED">
<property name="url" value="${jdbc.url}"/>
<property name="driver" value="${jdbc.driver}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--映射文件,mappers:将sql映射注册到全局配置中-->
<mappers>
<package name="com.zy.mapper"/>
</mappers>
</configuration>
3.2.2db.properties配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/atguigu_mybatis
jdbc.username=root
jdbc.password= orcl.driver=oracle.jdbc.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost::orcl
orcl.username=zhang
orcl.password=
3.2.3其他xml配置
=============StuMapper.xml========================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace:名称空间;指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id值 public Employee getEmpById(Integer id);
--> <!--namespace必须是EmployeeMapper的全限定名-->
<mapper namespace="com.zy.mapper.StuMapper">
<!--配置resultMap:关联查询-->
<resultMap id="stuResultMap" type="com.zy.dto.StuDto">
<!--如果是date类型的变量,此处的jdbcType必须配置为TIMESTAMP-->
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="age" property="age" jdbcType="INTEGER"/>
<association property="classInfo" javaType="com.zy.model.ClassInfo">
<id column="id" property="id"/>
<result column="className" property="className"/>
</association>
</resultMap> <!--配置resultMap(一对一):分步查询-->
<resultMap id="stuResultMapStep" type="com.zy.dto.StuDto">
<!--如果是date类型的变量,此处的jdbcType必须配置为TIMESTAMP-->
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="age" property="age" jdbcType="INTEGER"/>
<association property="classInfo" javaType="com.zy.model.ClassInfo" select="com.zy.mapper.ClassInfoMapper.getClassById" column="cid"/>
</resultMap> <!--配置resultMap(一对多):分步查询-->
<resultMap id="stuResultMapScoreStep" type="com.zy.dto.ScoreDto">
<!--如果是date类型的变量,此处的jdbcType必须配置为TIMESTAMP-->
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="age" property="age" jdbcType="INTEGER"/>
<collection property="list" ofType="com.zy.model.Score" select="com.zy.mapper.ScoreMapper.getScoreById" column="id" />
</resultMap> <!--==================查询结果区====================--> <!--// 根据班级id获取学生信息
Stu getStuByClassId(Integer id);-->
<select id="getStuByClassId" resultMap="stuResultMap">
SELECT s.id id,s.`name` name,s.age age,c.className className
from t_stu s
LEFT JOIN t_classinfo c
on s.cId = c.id
where c.id = #{id}
</select> <!--// 分步查询:即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载
List<Stu> getStuByClassIdStep(@Param("id") Integer id);-->
<select id="getStuByClassIdStep" resultMap="stuResultMapStep">
select * from t_stu where id=#{id}
</select> <!--// 分步查询(一对多):即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载
List<Stu> getStuByScoreStep(@Param("id") Integer id);--> <select id="getStuByScoreStep" resultMap="stuResultMapScoreStep">
select * from t_stu where id=#{id}
</select> </mapper>
===================ClassInfoMapper.xml==============
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.mapper.ClassInfoMapper">
<select id="getClassById" resultType="com.zy.model.ClassInfo">
select * from classInfo where id = #{cid}
</select>
</mapper>
================ScoreMapper.xml===================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.mapper.ScoreMapper">
<!--定义resultMap-->
<resultMap id="myScoreResultMap" type="com.zy.model.Score">
<id column="id" property="id"/>
<result column="sub" property="sub"/>
<result column="score" property="score"/>
<result column="sId" property="sId"/>
</resultMap>
<select id="getScoreById" resultMap="myScoreResultMap">
SELECT * from t_score where sId = #{id}
</select>
</mapper>
4.junit测试配置

import com.zy.dto.ClassInfoDto;
import com.zy.dto.ScoreDto;
import com.zy.mapper.StuMapper;
import com.zy.model.Stu;
import com.zy.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import java.util.List; /**
* Created by Administrator on 2018/6/29.
*/
public class StuTest { // 按照班级id查询
@Test
public void testGetStuById() {
// 获取sqlSession
final SqlSession sqlSession = MybatisUtil.getSqlSession();
// 获取mapper
StuMapper mapper = sqlSession.getMapper(StuMapper.class);
// 调用mapper的增加方法
List<Stu> list = mapper.getStuByClassId();
System.out.println(list);
// 关闭资源
MybatisUtil.closeSqlSession();
} // 分步查询:即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载
@Test
public void testGetStuByClassIdStep() {
// 获取sqlSession
final SqlSession sqlSession = MybatisUtil.getSqlSession();
// 获取mapper
StuMapper mapper = sqlSession.getMapper(StuMapper.class);
// 调用mapper的增加方法
List<ClassInfoDto> list = mapper.getStuByClassIdStep();
System.out.println(list);
// 关闭资源
MybatisUtil.closeSqlSession();
} // 分步查询:即多个单表查询,一个查询结果是另一个查询的条件:需要配置懒加载,并关闭延迟加载
@Test
public void testGetStuByScoreStep() {
// 获取sqlSession
final SqlSession sqlSession = MybatisUtil.getSqlSession();
// 获取mapper
StuMapper mapper = sqlSession.getMapper(StuMapper.class);
// 调用mapper的增加方法
List<ScoreDto> list = mapper.getStuByScoreStep();
System.out.println(list);
// 关闭资源
MybatisUtil.closeSqlSession();
} }
mybatis中使用懒加载实现一对多复杂查询的更多相关文章
- mybatis中的懒加载
知识点:mybatis中的懒加载的使用 参考:https://www.cnblogs.com/ysocean/p/7336945.html?utm_source=debugrun&utm_me ...
- 解决hibernate中的懒加载(延迟加载)问题
解决hibernate中的懒加载(延迟加载)问题 我们在开发的时候经常会遇到延迟加载问题,在实体映射时,多对一和多对多中,多的一样的属性默认是lazy="true"(即,默认是 ...
- 在webpack中使用Code Splitting--代码分割来实现vue中的懒加载
当Vue应用程序越来越大,使用Webpack的代码分割来懒加载组件,路由或者Vuex模块, 只有在需要时候才加载代码. 我们可以在Vue应用程序中在三个不同层级应用懒加载和代码分割: 组件,也称为异步 ...
- web中的懒加载
在Web应用程序中,系统的瓶颈常在于系统的响应速度.如果系统响应速度过慢,用户就会出现埋怨情绪,系统的价值也因此会大打折扣.因此,提高系统响应速度,是非常重要的. Web应用程序做的最多就是和后台数据 ...
- django中的懒加载机制
懒加载在前端中的意义: 懒加载的主要目的就是作为服务器前端的优化,减少请求次数或者延迟请求数. 实现原理: 先加载一部分数据,当触发某个条件时利用异步加载剩余的数据,新得到的数据不会影响原有数据的显示 ...
- mybatis和hibernate中的懒加载
概念:所谓懒加载就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减 ...
- Web程序中的懒加载异常说明及解决方案
所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有 ...
- ssh中Hibernate懒加载,session问题的学习与理解
交代本项目中要求获取session的方式如下: public Session getCurrentSession() { // 增删改使用的session,事务必须是开启的(Required,即pro ...
- vue中的懒加载和按需加载
懒加载 (1)定义:懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. (2)异步加载的三种表示方法: 1. resolve => require([URL], resolve),支持性好 ...
随机推荐
- bzoj 1257 [CQOI2007]余数之和——数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1257 \( n\%i = n - \left \lfloor n/i \right \rfl ...
- TMS320CC657基本外围电路调试
一.本文内容 本文主要包含以下三个基本外围电路的调试过程与调试结果: 电源模块 时钟模块 复位模块 二.电源模块调试 无论对FPGA还是DSP而言,对电源的上电顺序都有一定的要求,且不同型号的器件对电 ...
- Java 静态对象 static
什么是静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立. 然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了 ...
- Warning: require(D:\wamp\www\glink-smart\bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in D:\wamp\www\glink-smart\bootstrap\autoload.php on line 1
Laravel访问出错错误信息:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or dire ...
- ApacheOFBiz的相关介绍以及使用总结(三)
Ofbiz中还提供了一些基础性服务,可以直接用来使用,下面就简单介绍说明一下. ofbiz邮件发送服务 ofbiz中提供发送邮件相关功能:sendMailFromScreen contex ...
- 03:TPCC 基准压测my.cnf
line: V1.3 mail: gczheng@139.com date: 2017-11-09 一.TPCC测试前准备 1.压测环境 配置 信息 主机 Dell PowerEdge R730xd ...
- kubernetes 学习 pod相关
1 pod的状态: Pending, Running, Succeeded, Failed, Unknown 2 pod重启策略: Always(自动重启,是默认的) . OnFailure(容 ...
- html5的canvas方法的总结
canvas的方法 save()保存当前环境的状态 restore() 返回之前保存过的路径状态和属性 createEvent() getContext()返回一个对象,指出访问绘图功能必要的API ...
- 关于调整TimePicker, DatePicker的大小,样式
最近在做一个时间选择器,想把要DatePicker和TimePicker放在一起使用,无赖他们的大小样式是被Google写死了,找不到相应的属性来设置,自己花了点时间写了一个使用的Demo,运行的效果 ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...