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

      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. Vue2.0史上最全入坑教程(中)—— 脚手架代码详解

    书接上文我们说道,如何利用脚手架(vue-cli)构建一个vue项目,本回书我们一起来学习分析下代码. 回顾下创建后的项目目录:   说明:在*.vue文件,template标签里写html代码,且t ...

  2. jquery 调用asp.net后台代码

    1.需要引用对应的命名空间 System.Web.Services 2.后台方法: 必须是static 约束   必须添加[WebMethod()] 属性 示例: <script type=&q ...

  3. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU外设那些事(2)- 善变的FlexRAM

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的FlexRAM外设. 本文是外设系列第二篇,上一篇讲的是离内核最近的高速缓存L1 Cache, ...

  4. 公司mysql问题三

    数据库连接不上,解决方案: # 加在绿框?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

  5. DirectX11笔记(三)--Direct3D初始化代码

    原文:DirectX11笔记(三)--Direct3D初始化代码 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article ...

  6. C++之自定义key类型,重载操作符

    #include <map>#include <string>using namespace std;class MyString{ public:MyString(){m_s ...

  7. Hibernate QBC 简单收集

    Hibernate QBC 介绍: QBC(Query By Criteria)通过 API 来检索对象 主要由 Criteria 接口.Criterion 接口和 Exception 类组成,支持在 ...

  8. 《2019年上半年Web应用安全报告》发布:90%以上攻击流量来源于扫描器,IP身份不再可信

    Web应用安全依然是互联网安全的最大威胁来源之一,除了传统的网页和APP,API和各种小程序也作为新的流量入口快速崛起,更多的流量入口和更易用的调用方式在提高web应用开发效率的同时也带来了更多和更复 ...

  9. maven与sbt修改国内镜像

    一.idea中的maven 1.打开IntelliJ IDEA->Settings ->Build, Execution, Deployment -> Build Tools > ...

  10. 三.BP神经网络

    BP神经网络是包含多个隐含层的网络,具备处理线性不可分问题的能力.以往主要是没有适合多层神经网络的学习算法,,所以神经网络的研究一直处于低迷期. 20世纪80年代中期,Rumelhart,McClel ...