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的时候就提及过了懒加载,但没有好好地说明具体的说明究竟是怎么回事-本博文主要讲解懒加载 什么是拦截器以及为什么要使用懒加载? 懒加载就是当使用数据的时候才去获取数据. ...
随机推荐
- 缺氧debug模式开启及功能
在游戏OxygenNotIncluded_Data文件夹创建一个debug_enable.txt的空文本文档 在缺氧目录下添加debug_enable.txt文件 按删除键就可以开启debug模式 需 ...
- ListView设置的点点滴滴
去掉ListView的分界线 1. ListView的属性Divider设为#FFCC00 这种对任何背景都适用 2. 把ListView的属性Divider设为和背景一样的颜色 3.and ...
- Android学习笔记之mainfest文件中android属性
android:allowTaskReparenting 是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务. -------------------------------- ...
- switch或判断
<?php $num1 = 1; $num2 = 2; function int($num){ switch($num){ case 1: case 2: echo "1或2" ...
- SQL知识总结(1)
什么是数据库: sql组成: DDL:数据定义语句,有CREATE/DROP等: DML:数据操作语句,有DELETE/UPDATE/INSERT/INSERT等; DQL:数据查询语句,有SELEC ...
- JMeter 参数意义
样本数目:运行时得到的取样器响应结果个数 最新样本:最近一个取样器结果的响应时间 平均:所有取样器结果的响应时间平均值 偏离:所有取样器结果的响应时间标准差 吞吐量:每分钟响应的取样器结果个数 中值: ...
- js写的滑动解锁
css部分 *{ margin:; padding:; box-sizing: border-box; -webkit-touch-callout: none; -webkit-user-select ...
- hackerrank---List Comprehensions
题目链接 刷刷Python基本功...列表解析 附上代码: x = int(input()) y = int(input()) z = int(input()) n = int(input()) pr ...
- 微信小程序组件——详解wx:if elif else的用法
背景 在学习微信小程序开发wxml页面时,需要使用if,else来判断组件是否进行展示,代码如下 <view wx:if="{{is_login==1}}">成功登录& ...
- uva 10453 【回文串区间dp】
Uva 10453 题意:给定字符串,问最少插入多少个字符使其变成回文串,并任意输出一种结果. 题解:和Uva 10739类似,这里是只能增加.类似定义dp[i][j]表示子串Si...Sj变为回文串 ...