mybatis中延迟加载Lazy策略的方法

lazy策略原理:只有在使用查询sql返回的数据是才真正发出sql语句到数据库,否则不发出(主要用在多表的联合查询)

1.一对一延迟加载:

假设数据库中有person表和card表:其中person表中有字段pid,pname,page,psex,cid,card表中有字段cid,cnum;

假设要查询某个人的姓名和身份证号码:

原理:在查询姓名时,实际本没有查询出身份证号码的信息,只有当前台使用身份证号时才发出对card的查询,需要查询出身份证号码是采取查询的一种策略;

实现实例:

实现步骤:

1-导入mybatis 的依赖jar包

2-添加log4j文件 (可查看内存中实际执行的程序)

1-原理:只有当前台使用身份证号时才发出对card的查询,否则只发出person信息的查询
          2-开启lazy:在conf.xml

 <settings>
     <setting name="lazyLoadingEnabled" value="true"/>
     <setting name="aggressiveLazyLoading" value="false"/>
   </settings>

3.实现:

(1)在mapper.xml映射文件中:

<select id="findCid" parameterType="int" resultType="card">
    select * from card where cid=#{value}
  </select>
  <resultMap type="person" id="p_c1">
    <id column="pid" property="pid" />
    <result column="pname" property="pname" />
    <result column="page" property="page" />
    <result column="psex" property="psex" />
    <association property="card" javaType="card" select="findCid"
      column="cid">
    </association>
  </resultMap>
  <select id="selectpersonAndCardLazyByPid" parameterType="int"
    resultMap="p_c1">
    SELECT * FROM person where pid=#{value}
  </select> 

1-select:指定关联的查询语句

2-column:指定主语句中的哪个字段的值作为参数传递给从sql语句

(2)在mapper接口中定义方法:

public Person selectpersonAndCardLazyByPid(int pid);

(3)使用junit测试结果:

1.此处是只发出person信息的查询;

@Test
  public void testselectpersonAndCardLazyByPid(){//lazy策略一对1
    Person p=pm.selectpersonAndCardLazyByPid(1);
    //System.out.println(p);
    System.out.println(p.getPname()+",");
    //System.out.println(p.getPname()+","+p.getCard().getCnum());
  } 

结果执行的查询语句:

2.当前台使用身份证号时才发出对card的查询

@Test
  public void testselectpersonAndCardLazyByPid(){//lazy策略一对1
    Person p=pm.selectpersonAndCardLazyByPid(1);
    //System.out.println(p);
    System.out.println(p.getPname()+",");
    System.out.println(p.getPname()+","+p.getCard().getCnum());//当前台使用身份证号时才发出对card的查询
  } 

结果执行的查询语句:

2.一对多延迟加载:

实现实例:

假设数据库中有person表和card身份信息表,adder地址表:其中person表中有字段pid,pname,page,psex,cid,card表中有字段cid,cnum;adder表有字段aid,ashi,pid

假设要查询某个人的姓名和住址,身份证号码:

(1)mapper.xml映射文件:

<!-- lazy策略一对多 -->
  <select id="fingCard_Adder" parameterType="int" resultType="adder">
    select * from adder where pid=#{value}
  </select>
  <select id="findCid1" parameterType="int" resultType="card">
    select * from card where cid=#{value}
  </select>
  <resultMap type="person" id="p_c1_a1">
    <id column="pid" property="pid" />
    <result column="pname" property="pname" />
    <result column="page" property="page" />
    <result column="psex" property="psex" />
    <association property="card" javaType="card" select="findCid1"
      column="cid">
    </association>
    <collection property="adder" ofType="Adder" select="fingCard_Adder"
      column="pid">
    </collection>
  </resultMap>
  <select id="selectpersonAndCardAndAdderLazyByPid" parameterType="int"
    resultMap="p_c1_a1">
    SELECT * FROM person where pid=#{value}
  </select> 

(2)mapper接口定义方法:

1.此处是只发出person信息的查询;

@Test
public void testselectpersonAndCardAndAdderLazyByPid(){//lazy策略一对多
  Person p=pm.selectpersonAndCardAndAdderLazyByPid(1);
  System.out.println(p.getPname()+",");////此处是只发出person信息的查询
} 

结果执行的查询语句:

2.此处是发出person信息和身份信息的查询;

@Test
public void testselectpersonAndCardAndAdderLazyByPid(){//lazy策略一对多
  Person p=pm.selectpersonAndCardAndAdderLazyByPid(1);
  System.out.println(p.getPname()+",");//此处是只发出person信息的查询;
  System.out.println(p.getPname()+","+p.getCard().getCnum());//此处是发出person信息和身份信息的查询;
}

结果执行的查询语句:

3.此处发出person信息和身份信息,地址信息的查询;

@Test
public void testselectpersonAndCardAndAdderLazyByPid(){//lazy策略一对多
  Person p=pm.selectpersonAndCardAndAdderLazyByPid(1);
  System.out.println(p.getPname()+",");//此处是只发出person信息的查询;
  System.out.println(p.getPname()+","+p.getCard().getCnum());//此处是发出person信息和身份信息的查询;
  //System.out.println(p.getPname()+","+p.getCard().getCnum());
  for (Adder adder : p.getAdder()) {////此处发出person信息和身份信息,地址信息的查询;
    System.out.println(adder.getAshi());
  }
}

结果执行的查询语句:

总结

以上所述是小编给大家介绍的mybatis中延迟加载Lazy策略的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • MyBatis关于二级缓存问题

    MyBatis提供一级缓存和二级缓存,其中一级缓存是sqlSession级别的缓存,不同的sqlSession之间的缓存互不影响.二级缓存是Mapper级别的缓存,多个sqlSession操作同一个Mapper,其二级缓存是可以共享的. MyBatis有多种二级缓存方案可供选择.其中对Memcached的支持较为成熟,现以Memcached为例介绍与spring项目的集成. 使用配置 配置pom.xml,添加依赖. <dependencies> ... <dependency> &

  • Mybatis查询延迟加载详解及实例

    Mybatis查询延迟加载详解及实例 1.1     启用延迟加载 Mybatis的延迟加载是针对嵌套查询而言的,是指在进行查询的时候先只查询最外层的SQL,对于内层SQL将在需要使用的时候才查询出来.Mybatis的延迟加载默认是关闭的,即默认是一次就将所有的嵌套SQL一并查了将对象所有的信息都查询出来.开启延迟加载有两种方式. 第一种是在对应的<collection>或<association>标签上指定fetchType属性值为"lazy".如下示例中我们

  • MyBatis 延迟加载、一级缓存、二级缓存(详解)

    使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能. 一.延迟加载 延迟加载已经是老生常谈的问题,什么最大化利用数据库性能之类之类的,也懒的列举了,总是我一提到延迟加载脑子里就会想起来了Hibernate get和load的区别.OK,废话少说,直接看代码. 先来修改配置项xml. 注意,编写mybatis.xm

  • mybatis 延迟加载的深入理解

    什么是延迟加载 延迟加载又叫懒加载,也叫按需加载,也就是说先加载主信息,需要的时候,再去加载从信息.代码中有查询语句,当执行到查询语句时,并不是马上去DB中查询,而是根据设置的延迟策略将查询向后推迟. 什么时候会执行延迟加载 配置之后在对关联对象进行查询时使用延迟加载. 延迟加载策略 直接加载 遇到代码中查询语句,马上到DB中执行select语句进行查询.(这种只能用于多表单独查询) 侵入式延迟加载 将关联对象的详情(具体数据,如id.name)侵入到主加载对象,作为主加载对象的详情的一部分出现

  • 深入理解Mybatis二级缓存

    上篇文章给大家介绍了mybatis一级缓存,有需要的朋友可以参考下. 与一级缓存相比,二级缓存范围更大了一些,可以被多个SqlSession所共用. 同样是发送同样的查询sql会先去缓存中找,找不到再去查询数据库. 每个namespace的mapper都会有自己的一个缓存的空间. 如果两个mapper的namespace相同,执行mapper查询到的数据将存储到相同的二级缓存. 同样如果有sqlSession执行了commit 会清空二级缓存. 配置文件(不用配置也是默认开启的): 在sqlMa

  • Mybatis中的延迟加载案例解析

    一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 在mybatis核心配置文件中配置: lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置

  • mybatis教程之延迟加载详解

    延迟加载 1 使用延迟加载意义 在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快. 如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载. mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载. 2 配置mybatis支持延迟加载 在 SqlMapConfig.xml中配置全局参数: <!-- 全局配置参数 --> <settings> <

  • 深入理解MyBatis中的一级缓存与二级缓存

    前言 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据.不同的sqlSession之间的缓存数据区域是互相不影响的.也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的. 一级缓

  • Mybatis延迟加载和缓存深入讲解

    一.Mybatis中的延迟加载 1.延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association.collection实现一对一及一对多(多对多)映射),同样的association.collection具备延迟加载功能.所谓延迟加载,就是先单表查询,需要时再从关联表去关联查询(同样也可能只是是单表查询),大大单表查询速度更快,所以可以间接的提高数据库性能 2.在mybatis核心配置文件中配置,其中lazyLoadingEnabled表示

  • mybatis中延迟加载Lazy策略的方法

    lazy策略原理:只有在使用查询sql返回的数据是才真正发出sql语句到数据库,否则不发出(主要用在多表的联合查询) 1.一对一延迟加载: 假设数据库中有person表和card表:其中person表中有字段pid,pname,page,psex,cid,card表中有字段cid,cnum; 假设要查询某个人的姓名和身份证号码: 原理:在查询姓名时,实际本没有查询出身份证号码的信息,只有当前台使用身份证号时才发出对card的查询,需要查询出身份证号码是采取查询的一种策略: 实现实例: 实现步骤:

  • 如何使用C#中的Lazy的使用方法

    延迟初始化 是一种将对象的创建延迟到第一次需要用时的技术,换句话说,对象的初始化是发生在真正需要的时候才执行,值得注意的是,术语 延迟初始化 和 延迟实例化 的意思是相同的--可以互换使用,通过使用 延迟初始化 技术,可以避免应用程序不必要的计算和内存消耗,这篇文章我们将会讨论如何在 C# 中使用 延迟初始化. 有些朋友听完这些可能会懵逼,接下来用一个简单的例子来了解下 延迟加载 的场景,考虑下面两个类, Customer 和 Order, Customer 类包含了一个 Orders 属性,一

  • Mybatis 中的sql批量修改方法实现

    在项目中遇到需要批量更新的功能,原本想的是在Java中用循环访问数据库去更新,但是心里总觉得这样做会不会太频繁了,太耗费资源了,效率也很低,查了下mybatis的批量操作,原来确实有<foreach>标签可以做到. dao  层接口: public class Demo{ private int id; private String name; private String sex; } <pre name="code" class="html"&

  • 关于Mybatis 中使用Mysql存储过程的方法

    1.存储过程的简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以看做是对编程中

  • MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    1.#{}是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号,如上面的值 "4,44,514"就会变成" '4,44,514' ": 2.是字符串替换,在处理是字符串替换,MyBatis在处理时,它会将sql中的{}是字符串替换,在处理{ }是字符串替换, MyBatis在处理{ }时,它会将sql中的是字符串替换,在处理是字符串替换,MyB

  • Mybatis中SqlSession接口中selectList方法详解

    目录 1.SqlSession简介 2.selectList方法 3.selectList方法简介 总结 1.SqlSession简介 SqlSession是mybatis持久层框架提供的接口,该接口中包含了大量的CRUD操作方法(既增删改查方法). 2.selectList方法 selectList方法是用于查询的方法,该方法具有多态性,如图所示(打开mybatis的SqlSession接口所得到) 3.selectList方法简介 该方法一共有三种不同的调用方式: List selectLi

  • Oracle在Mybatis中SQL语句的配置方法

    数据库中有下划线的字段在实体中应采用驼峰命名法,如P_NAME对应pName,实例如下: 1.XML文件中SQL语句配置(Geteway.xml文件) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-m

  • MyBatis中动态sql的实现方法示例

    1. 动态sql 动态sql是mybatis中的一个核心,什么是动态sql? 动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. MyBatis的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.有些时候,SQL语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可

  • MyBatis中association的基本使用方法

    目录 通过association对两表进行联表查询 按照查询嵌套处理 按照结果嵌套处理 总结 通过association对两表进行联表查询 student表属性如下 teacher表属性如下 按照查询嵌套处理 关于需求的SQL稍微有点复杂时,可以打开右侧查询框进行语句的编写执行. 当使用以下时,查询出来存在问题 <select id="getStudentTeacher" resultType="Student" > select s.id,s.name

随机推荐