热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Mybatis中的延迟加载案例解析

这篇文章主要介绍了Mybatis中的延迟加载,场景结合案例分析非常不错,具有参考借鉴价值,需要的朋友可以参考下

一、延迟加载

  resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。

  延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

在mybatis核心配置文件中配置:

     lazyLoadingEnabled、aggressiveLazyLoading

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false',则所有相关联的都会被初始化加载。

true | false

false

aggressiveLazyLoading

当设置为‘true'的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

true | false

true


  
  

场合:

         当只有部分记录需要关联查询其它信息时,此时可按需延迟加载,需要关联查询时再向数据库发出sql,以提高数据库性能。

         当全部需要关联查询信息时,此时不用延迟加载,直接将关联查询信息全部返回即可,可使用resultType或resultMap完成映射。

二:案例:(在部门和员工一对多)

源码介绍:

1.Dept.java

package cn.zhang.entity;
import java.util.HashSet;
import java.util.Set;
public class Dept {
 private Integer deptno;
 private String deptname;
 private Set emp = new HashSet();
 @Override
 public String toString() {
  return "Dept [deptno=" + deptno + ", deptname=" + deptname + ", emp="
    + emp + "]";
 }
 public Integer getDeptno() {
  return deptno;
 }
 public void setDeptno(Integer deptno) {
  this.deptno = deptno;
 }
 public String getDeptname() {
  return deptname;
 }
 public void setDeptname(String deptname) {
  this.deptname = deptname;
 }
 public Set getEmp() {
  return emp;
 }
 public void setEmp(Set emp) {
  this.emp = emp;
 }
}

2.Emp.java

package cn.zhang.entity;
public class Emp {
 private Integer empno;
 private String empname;
 @Override
 public String toString() {
  return "Emp [empno=" + empno + ", empname=" + empname + "]";
 }
 public Integer getEmpno() {
  return empno;
 }
 public void setEmpno(Integer empno) {
  this.empno = empno;
 }
 public String getEmpname() {
  return empname;
 }
 public void setEmpname(String empname) {
  this.empname = empname;
 }
}

3.MybatisUtil.java

package cn.zhang.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
 * 工具类
 * 
 */
public class MybatisUtil {
 private static String cOnfig= "mybatis-config.xml";
 static Reader reader;
 static {
  try {
   reader = Resources.getResourceAsReader(config);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 private static SqlSessionFactory factory = new SqlSessionFactoryBuilder()
   .build(reader);
 // 提供一个可以获取到session的方法
 public static SqlSession getSession() throws IOException {
  SqlSession session = factory.openSession();
  return session;
 }
}

4.DeptDao.java

package cn.zhang.dao;
import java.io.IOException;
import cn.zhang.entity.Dept;
public interface DeptDao {
 /**
  * 查询指定记录
  * @return
  * @throws IOException
  */
 public Dept findById(Integer id) throws IOException;
}

5.DeptDAO.xml

<&#63;xml version="1.0" encoding="UTF-8" &#63;>


 
 
 
 
  
  
  
  
  
  
 
 
 

6.mybatis-config.xml (延迟加载的配置在此)

<&#63;xml version="1.0" encoding="UTF-8" &#63;>


 
 
  
  
  
  
 
 
 
  
  
  
 
 
  
   
   
   
   
    
    
    
    
    
   
  
 
 
  
 

7.MyTest.java(测试类)

package cn.zhang.test;
//一对多
import java.io.IOException;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;
import cn.zhang.dao.DeptDao;
import cn.zhang.entity.Dept;
import cn.zhang.util.MybatisUtil;
public class MyTest {
 DeptDao dao;
 @Before
 public void initData() throws IOException{
  SqlSession session = MybatisUtil.getSession();
  dao = session.getMapper(DeptDao.class);
 }
 /**
  * 查询指定记录
  * @throws IOException
  */
 @Test
 public void findAll() throws IOException{
  Dept dept = dao.findById(1);
  System.out.println(dept);
 }
}

测试结果:

在下面位置打断点

情况一:在mybatis-config.xml中不做配置情况

情况二:在mybatis-config.xml中配置


 
 
 
 

下一步:

F6下步:

F6下步:打出员工的名字

 情况三:

F6下一步:

 F6下一步:打印出员工名字

以上所述是小编给大家介绍的Mybatis中的延迟加载,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • HBase运维工具全解析
    本文深入探讨了HBase常用的运维工具,详细介绍了每种工具的功能、使用场景及操作示例。对于HBase的开发人员和运维工程师来说,这些工具是日常管理和故障排查的重要手段。 ... [详细]
  • 在本周的白板演练中,Apache Flink 的 PMC 成员及数据工匠首席技术官 Stephan Ewen 深入探讨了如何利用保存点功能进行流处理中的数据重新处理、错误修复、系统升级和 A/B 测试。本文将详细解释保存点的工作原理及其应用场景。 ... [详细]
author-avatar
璋houge
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有