mybatis 嵌套查询与懒加载
懒加载:对于页面有很多静态资源的情况下(比如网商购物页面),为了节省用户流量和提高页面性能,可以在用户浏览到当前资源的时候,再对资源进行请求和加载。
fetchType="lazy"
mybatis多对一嵌套查询:
嵌套查询的特点就是:利用一个查询的时候发送多条sql语句;
1+n条sql语句:1条主sql,还有多条分别查询语句:
例如:我想要查询用户的详细信息包括地址,(地址在另一张表,此时表被关系表管理),我就需要嵌套查询:
1.先根据id查询用户信息:
select * from t_user where id =5

2.再根据用户信息查询用户地址的关系表得到地址表中的id:
select address_id aid from t_user_address ua where user_id =5

3.根据关系表地址id拿到地址的详细信息:
select * from t_address where id =1
select * from t_address where id =2


代码原理:

t_address 地址信息表

t_address_user地址id和用户id关系表

t_user用户表

查询的sql和结果:

代码实现:
配置懒加载:mybatis-config.xml
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
编写sql:UserDAO.xm 1 <resultMap id="mynesting" type="user">
<resultMap id="mynesting" type="user">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="sal" column="sal"></result>
<result property="birth" column="birthday"></result>
<collection fetchType="lazy" property="addresses" ofType="Address" column="id" javaType="ArrayList" select="selectAddressId">
</collection>
</resultMap> <resultMap id="myua" type="ua">
<id property="addressId" column="aid"></id>
<collection fetchType="lazy" property="addresses" ofType="Address" column="aid" javaType="ArrayList" select="selectAddress">
</collection>
</resultMap> <select id="ById" resultMap="mynesting">
select * from t_user where id =#{id}
</select> <select id="selectAddressId" resultMap="myua" >
select address_id aid from t_user_address ua where user_id =#{id}
</select> <select id="selectAddress" resultType="address">
select * from t_address where id =#{id}
</select>
UserDAO:
package com.etc.dao;
import com.etc.entity.User;
import java.util.List;
public interface UserDao {
List<User> ById(int id);
}
UA.java:
package com.etc.entity;
import java.util.List;
public class UA {
private int userId;
private int addressId;
private List<Address> addresses;
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getAddressId() {
return addressId;
}
public void setAddressId(int addressId) {
this.addressId = addressId;
}
@Override
public String toString() {
return ""+addresses;
}
}
UA.java
User.java:
package com.etc.entity; import java.util.Date;
import java.util.List; public class User {
private int id;
private String name;
private double sal;
private Date birth;
private List<Address> addresses; public User() {
} public User(int id, String name, double sal, Date birth, List<Address> addresses) {
this.id = id;
this.name = name;
this.sal = sal;
this.birth = birth;
this.addresses = addresses;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public double getSal() {
return sal;
} public void setSal(double sal) {
this.sal = sal;
} public Date getBirth() {
return birth;
} public void setBirth(Date birth) {
this.birth = birth;
} public List<Address> getAddresses() {
return addresses;
} public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", sal=" + sal +
", birth=" + birth +
", addresses=" + addresses +
'}';
}
}
User.java
address.java:
package com.etc.entity;
public class Address {
private int id;
private String name;
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Address{" +
"id=" + id +
", name='" + name + '\'' +
", user=" + user +
'}';
}
}
address.java
t_uesr.sql:
/*
Navicat MySQL Data Transfer Source Server : Test
Source Server Version : 50562
Source Host : localhost:3310
Source Database : mybatis Target Server Type : MYSQL
Target Server Version : 50562
File Encoding : 65001 Date: 2019-07-25 11:43:23
*/ SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sal` float(255,0) DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES ('', 'asda', '', '2019-07-22');
INSERT INTO `t_user` VALUES ('', 'asda', '', '2019-07-22');
INSERT INTO `t_user` VALUES ('', 'asdasdaa', '', '2019-07-22');
INSERT INTO `t_user` VALUES ('', 'asdasdaa', '', '2019-07-22');
INSERT INTO `t_user` VALUES ('', 'asdasdaa', '', '2019-07-22');
INSERT INTO `t_user` VALUES ('', 'asdasdaa', '', '2019-07-22');
INSERT INTO `t_user` VALUES ('', 'asdasdaa', '', '2019-07-22');
INSERT INTO `t_user` VALUES ('', 'asdasdaa', '', '2019-07-22');
INSERT INTO `t_user` VALUES ('', 'asdasdaa', '', '2019-07-23');
INSERT INTO `t_user` VALUES ('', 'asdasdaa', '', '2019-07-23');
t_user.sql
t_address.sql:
/*
Navicat MySQL Data Transfer Source Server : Test
Source Server Version : 50562
Source Host : localhost:3310
Source Database : mybatis Target Server Type : MYSQL
Target Server Version : 50562
File Encoding : 65001 Date: 2019-07-25 11:43:30
*/ SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for t_address
-- ----------------------------
DROP TABLE IF EXISTS `t_address`;
CREATE TABLE `t_address` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_address
-- ----------------------------
INSERT INTO `t_address` VALUES ('', '这是地址');
INSERT INTO `t_address` VALUES ('', '这是地址');
INSERT INTO `t_address` VALUES ('', '');
INSERT INTO `t_address` VALUES ('', '');
INSERT INTO `t_address` VALUES ('', '');
INSERT INTO `t_address` VALUES ('', '');
t_address.sql
t_user_address.sql:
/*
Navicat MySQL Data Transfer Source Server : Test
Source Server Version : 50562
Source Host : localhost:3310
Source Database : mybatis Target Server Type : MYSQL
Target Server Version : 50562
File Encoding : 65001 Date: 2019-07-25 11:43:12
*/ SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for t_user_address
-- ----------------------------
DROP TABLE IF EXISTS `t_user_address`;
CREATE TABLE `t_user_address` (
`user_id` int(11) DEFAULT NULL,
`address_id` int(11) DEFAULT NULL,
UNIQUE KEY `address_unqiue` (`address_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_user_address
-- ----------------------------
INSERT INTO `t_user_address` VALUES ('', '');
INSERT INTO `t_user_address` VALUES ('', '');
INSERT INTO `t_user_address` VALUES ('', '');
INSERT INTO `t_user_address` VALUES ('', '');
INSERT INTO `t_user_address` VALUES ('', '');
t_user_address.sql
懒加载:
fetchType="lazy"

userDaoTest:

查询结果:

mybatis 嵌套查询与懒加载的更多相关文章
- MyBatis关联查询和懒加载错误
MyBatis关联查询和懒加载错误 今天在写项目时遇到了个BUG.先说一下背景,前端请求更新生产订单状态,后端从前端接收到生产订单ID进行查询,然后就有问题了. 先看控制台报错: org.apache ...
- mybatis(三)懒加载
懒加载的好处: 所谓懒加载(lazy)就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为 ...
- vue路由(一个包含重定向、嵌套路由、懒加载的main.js如下)and 路由跳转传参的query和params的异同
import Vue from 'vue'import VueRouter from 'vue-router'import App from './App'Vue.use(VueRouter)cons ...
- mybatis分页插件以及懒加载
1. 延迟加载 延迟加载的意义在于,虽然是关联查询,但不是及时将关联的数据查询出来,而且在需要的时候进行查询. 开启延迟加载: <setting name="lazyLoading ...
- MyBatis 懒加载
懒加载的概念 MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询. 当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力,在一定程度上可以降低 ...
- day04-MyBatis的缓存与懒加载
为什么会用到缓存? 为了减少与数据库链接所消耗的时间,将查询到的内容放到内存中去,下次查询直接取用就ok了. 缓存的适应场景: 1.经常查询并且不经常改变的. 2.数据的正确与否对最终结果影响不大的. ...
- Hibernate中的一级缓存、二级缓存和懒加载(转)
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- Hibernate中的一级缓存、二级缓存和懒加载
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- Hibernate第八篇【懒加载】
前言 前面在使用Hibernate的时候就提及过了懒加载,但没有好好地说明具体的说明究竟是怎么回事-本博文主要讲解懒加载 什么是拦截器以及为什么要使用懒加载? 懒加载就是当使用数据的时候才去获取数据. ...
随机推荐
- CSS制作的32种图形效果[梯形|三角|椭圆|平行四边形|菱形|四分之一圆|旗帜]
转载链接:http://www.w3cplus.com/css/css-simple-shapes-cheat-sheet 前面在<纯CSS制作的图形效果>一文中介绍了十六种CSS画各种不 ...
- angular依赖注入(3) —— 的提供商
一.注册商必须写在NgModel当中,不然只能对当前组件注入 二.写法: 1.令牌:providers:[Logger,Data] 2.供应商定义对象:providers:[{provide:Logg ...
- LintCode_488 快乐数
题目 写一个算法来判断一个数是不是"快乐数". 一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是无 ...
- jquery文字上下滚动--单行 批量多行 文字图片上下翻滚 | 多行滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C#和JS交互 WebBrowser实例
本文实现了WebBrowser的简单例子 1.引用System.Windows.Froms.dll 2.引用WindowsFormsIntegration.dll 代码如下: public parti ...
- layers.py cs231n
如果有错误,欢迎指出,不胜感激. import numpy as np def affine_forward(x, w, b): 第一个最简单的 affine_forward简单的前向传递,返回 ou ...
- mysql各个引擎区别
1.如果你有一个 MyISAM 数据表包含着 FULLTEXT 或 SPATIAL 索引,你将不能把它转换为使用 另一种引擎,因为只有 MyISAM 支持这两种索引. 2. 如果你有一个数据表包含着一 ...
- SDUT-3378_数据结构实验之查找六:顺序查找
数据结构实验之查找六:顺序查找 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个给定的无序序列里,查找与给定关键字 ...
- Directx11教程(52) 实例(instancing)的简单应用
原文:Directx11教程(52) 实例(instancing)的简单应用 有些时候,我们需要在场景中渲染大量的重复的物体,比如体育场中的观众,森林里面的树木等等,这些物体具有相似的形状,比如很多树 ...
- day39-Spring 06-Spring的AOP:带有切点的切面
环绕增强功能是最强的,它相当于前置增强和后置增强. 这就是带有切点的切面 package cn.itcast.spring3.demo4; import org.aopalliance.interce ...