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),支持性好 ...
随机推荐
- stm32f0系列在SWD模式下载时复位失败
用stm32f030K6T6做了个小玩意,仿真电路就直接把3.3V,SWDIO,SWCLK,GND引出来连接到j-link的这四个角上,SWDIO和SWCLK引脚既没有上拉也没有下拉. MCU ...
- sqlserver2008事务日志已满
--将数据库设为简单模式.日志文件自动断开. alter database CustomerInfoProject set recovery simple --查看日志文件状况 use Custom ...
- Java语言与C语言混合编程(1)--Java native 关键字
一. 什么是 native Method 简单地讲,一个 native Method 就是一个java调用非java代码的接口.一个 native Method 是这样一个java的方法:该方法的实现 ...
- celery制作定时任务
celery参考地址:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#starting-the-schedu ...
- Form 总结
禁止input自动完成下拉 //ie: autocomplete="off" //ff: disableautocomplete <input size="40&q ...
- [Java][Web]利用 referer 防盗链
String referer = request.getHeader("referer"); if(referer == null || !referer.startsWith(& ...
- localhost不能访问127.0.0.1可以访问的原因及解决方法 被打磨的不像人样
localhost不能访问127.0.0.1可以访问的原因及解决方法 作者:admin 时间:2013-12-16 10:58:47 浏览:16599 有时候我们在调试程序的时候,会出 ...
- 关于Struts2配置文件名修改的问题
突发奇想的想知道Struts2的配置文件名是否可以修改,自己最早使用Struts2的时候,只是单纯的将配置文件命名为“struts.xml”,这是Strut2默认的配置文件名,我一直也没有去修改它的命 ...
- 【洛谷】P1892 团伙(并查集)+ 求助
题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友. 两个强盗是同一团伙的 ...
- Centos7 可执行程序自定义为系统服务
systemctl的使用相比以往系统服务的/etc/init.d的启动脚本的方式变动也比较大,但变的更简单更易用了,同firewalld一样,运行原理一目了然,对于初学者来说,只要做过一两次练习,就能 ...