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),支持性好 ...
随机推荐
- 使用GDI+保存带Alpha通道的图像(续)
之前结合网上的一些代码及ATL::CImage的实现,自己写了一个将HBITMAP以PNG格式保存到文件到函数.见上一篇日记. 不过,后来换了个环境又发现了问题,昨天和今天上午把<Windows ...
- 怎样用java生成GUID与UUID
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随机数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
- Jq将字符串复制粘贴到剪贴板
第一种: 自己测试时 只适合于input 和textarea 但是针对于其他标签的复制就不能用了.代码如下: <!DOCTYPE html> <html> <head ...
- SQL判断NULL的几种常见方式
第一种 where XX ='NULL' ,XX字段存的值就是NULL这四个字符, 第二种 where XX is null ,XX字段什么也没存,这是数据库的判断语法, 第三种 where isnu ...
- SQL Server 2005/2008压缩数据库日志的方法
适用于SQL Server 2005的方法 Backup Log DNName WITH no_log GO DUMP TRANSACTION DNName WITH no_log GO USE DN ...
- Code blocks调试教程
特别声明:本教程已转移至百度经验:https://jingyan.baidu.com/article/6b182309939a87ba58e159bf.html 一.题外话 之前一直想用Code bl ...
- 学生党如何拿到阿里技术offer:《阿里面试经历-2014.4.18研发实习生面试经历(失败)》
我们分享的上一篇文章是一位学长在大三的时候面试阿里实习生成功的经历的分享,其实就像学长在上一篇文章最后说的那样“面试并没有想的那么难,运气也会占一部分.”,其实我个人觉得,对于我们而言,自己越努力就会 ...
- 11_java之接口和多态
01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来 ...
- 一、linux搭建jenkins+github详细步骤
事情缘由: 现在在做的主要工作是通过jenkins+postman实现api的自动化测试,想要达到的效果是,api自动化测试定时跑脚本的同时,github有新的代码提交,jenkins会自动检测部署新 ...
- PHP编译安装系列
徐亮伟, 江湖人称标杆徐.多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作.擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作. 个人博客"徐亮伟架构师之路&quo ...