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的时候就提及过了懒加载,但没有好好地说明具体的说明究竟是怎么回事-本博文主要讲解懒加载 什么是拦截器以及为什么要使用懒加载? 懒加载就是当使用数据的时候才去获取数据. ...
随机推荐
- windows下maven的安装配置
什么是maven Maven是基于POM(工程对象模型),通过一小段描述来对项目的代码.报告.文件进管理的工具. Maven是一个跨平台的项目管理工具,它是使用java开发的,它要依赖于jdk1.6及 ...
- Nacos Committers 团队首亮相,发布 0.9.0 版本
223 天,发布 14 个版本,19 位 Committers,39 位 Contributors. 在宣布开源后的第 223 天,Nacos 发布了其第14个版本 - 0.9.0,该版本提升了 Na ...
- 使用web-component搭建企业级组件库
组件库的现状 前端目前比较主流的框架有react,vuejs,angular等. 我们通常去搭建组件库的时候都是基于某一种框架去搭建,比如ant-design是基于react搭建的UI组件库,而ele ...
- B站直播 DEMO ijkplayerDemo
http://blog.csdn.net/kengsir/article/details/51750879 一. 下载ijkplayer ijkplayer下载地址 下载完成后解压, 解压后文件夹内部 ...
- Unrecognised tag: 'build'
[ERROR] [ERROR] Some problems were encountered while processing the POMs:[ERROR] Malformed POM H:\ec ...
- github中markdown语言的使用规则
开始使用github就接触了markdown,确实如它的宗旨所言"易读易写",语法简洁明了,功能比纯文本更强,是一种非常适用于网络的书写语言.并且一大优点是兼容HTML,只要不在m ...
- python 类的创建
- oracle-17113错误
Errors in file /oracle/OraHome1/admin/hncrm/udump/hncrm_ora_24470.trc: ORA-00600: internal error cod ...
- webpack配置vue项目
npm init 安装webpack,webpack-cli 新建src目录,在src目录下新建main.js
- Python学习之路3☞编程风格
语句和语法 # 表示注释掉的内容 \ 续行 print("yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\ yyyyyyyyyyyyyyyyyyyyyyy& ...