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

 更新时间:2018年06月24日 15:13:40   作者:JYLM  
这篇文章主要介绍了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策略的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

您可能感兴趣的文章:

相关文章

  • Java基本语法小白入门级

    Java基本语法小白入门级

    Java基本语法就是指java中的规则,也是一种语言规则,规范,同时也能让您在后面的学习中避免不必要的一些错误和麻烦,是您学好java必修的第一门课程
    2023-05-05
  • SpringBoot+JavaMailSender实现腾讯企业邮箱配置

    SpringBoot+JavaMailSender实现腾讯企业邮箱配置

    这篇文章主要介绍了SpringBoot+JavaMailSender实现腾讯企业邮箱配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 基于Java开发实现ATM系统

    基于Java开发实现ATM系统

    这篇文章主要为大家详细介绍了基于Java开发实现ATM系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 浅析SpringBoot自动化配置原理实现

    浅析SpringBoot自动化配置原理实现

    这篇文章主要介绍了浅析SpringBoot自动化配置原理实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Spring Cloud OpenFeign实例介绍使用方法

    Spring Cloud OpenFeign实例介绍使用方法

    Spring Cloud OpenFeign 对 Feign 进行了二次封装,使得在 Spring Cloud 中使用 Feign 的时候,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程访问,更感知不到在访问 HTTP 请求
    2022-09-09
  • Java实现多用户注册登录的幸运抽奖

    Java实现多用户注册登录的幸运抽奖

    这篇文章主要为大家详细介绍了Java实现多用户注册登录的幸运抽奖,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • java基础知识之FileInputStream流的使用

    java基础知识之FileInputStream流的使用

    这篇文章主要介绍了java基础知识之FileInputStream流的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • intellij idea查看方法被哪些类引用过(推荐)

    intellij idea查看方法被哪些类引用过(推荐)

    这篇文章主要介绍了intellij idea查看方法被哪些类引用过,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Spring Boot XSS 攻击过滤插件使用

    Spring Boot XSS 攻击过滤插件使用

    这篇文章主要介绍了Spring Boot XSS 攻击过滤插件使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java如何使用Iterator迭代器删除集合重复选项

    Java如何使用Iterator迭代器删除集合重复选项

    这篇文章主要介绍了Java如何使用Iterator迭代器删除集合重复选项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论