懒加载:对于页面有很多静态资源的情况下(比如网商购物页面),为了节省用户流量和提高页面性能,可以在用户浏览到当前资源的时候,再对资源进行请求和加载。

      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 嵌套查询与懒加载的更多相关文章

  1. MyBatis关联查询和懒加载错误

    MyBatis关联查询和懒加载错误 今天在写项目时遇到了个BUG.先说一下背景,前端请求更新生产订单状态,后端从前端接收到生产订单ID进行查询,然后就有问题了. 先看控制台报错: org.apache ...

  2. mybatis(三)懒加载

    懒加载的好处: 所谓懒加载(lazy)就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为 ...

  3. vue路由(一个包含重定向、嵌套路由、懒加载的main.js如下)and 路由跳转传参的query和params的异同

    import Vue from 'vue'import VueRouter from 'vue-router'import App from './App'Vue.use(VueRouter)cons ...

  4. mybatis分页插件以及懒加载

    1.   延迟加载 延迟加载的意义在于,虽然是关联查询,但不是及时将关联的数据查询出来,而且在需要的时候进行查询. 开启延迟加载: <setting name="lazyLoading ...

  5. MyBatis 懒加载

    懒加载的概念 MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询. 当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力,在一定程度上可以降低 ...

  6. day04-MyBatis的缓存与懒加载

    为什么会用到缓存? 为了减少与数据库链接所消耗的时间,将查询到的内容放到内存中去,下次查询直接取用就ok了. 缓存的适应场景: 1.经常查询并且不经常改变的. 2.数据的正确与否对最终结果影响不大的. ...

  7. Hibernate中的一级缓存、二级缓存和懒加载(转)

    1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...

  8. Hibernate中的一级缓存、二级缓存和懒加载

    1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...

  9. Hibernate第八篇【懒加载】

    前言 前面在使用Hibernate的时候就提及过了懒加载,但没有好好地说明具体的说明究竟是怎么回事-本博文主要讲解懒加载 什么是拦截器以及为什么要使用懒加载? 懒加载就是当使用数据的时候才去获取数据. ...

随机推荐

  1. leetcode 350 easy

    350. Intersection of Two Arrays II class Solution { public: vector<int> intersect(vector<in ...

  2. 实现一个vue的图片预览插件

    vue-image-swipe 基于photoswipe实现的vue图片预览组件 安装 1 第一步 npm install vue-image-swipe -D 2 第二步 vue 入口文件引入 im ...

  3. oracle 写存储过程有返回值时 注意在loop循环处添加返回值:=

    例子: create or replace procedure p_xl is v_count NUMBER(10); begin for rs in(select yhbh from dbyh) l ...

  4. Spring4.x 基础知识点

    # Spring4.x 基础知识点## 第二章 快速入门- 一般情况下,需要在业务模块包下进一步按分层模块划分子包,如user\dao.user\service.viewspace\dao.views ...

  5. Leetcode868.Binary Gap二进制间距

    给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...

  6. 云服务器 ECS Linux Web 环境配置站点的方法

    摘自:https://help.aliyun.com/knowledge_detail/41100.html ECS Linux 系统一键安装 Web 环境<专业版>下 Tomcat 添加 ...

  7. CSS3--关于z-index不生效问题

    最近写CSS3和js结合,遇到了很多次z-index不生效的情况: 1.在用z-index的时候,该元素没有定位(static定位除外) 2.在有定位的情况下,该元素的z-index没有生效,是因为该 ...

  8. 关于sublime text2的一些问题(为解决)

    1. 编写markdown文件后,如何转成pdf ? 2. 执行程序时,如何在控制台输入数据?

  9. 大数据技术之HBase

    第1章 HBase简介 1.1 什么是HBase HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储. 官方 ...

  10. Codeforces 425B

    点击打开题目链接 题意:给定一个n×m的0,1矩阵,做多可以对矩阵做k次变换,每次变换只可以将矩阵的某一个元素由0变成1,或从1变成0. 求最小的变换次数使得得到的矩阵满足:每一个连通块都是一个“实心 ...