欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis中的延遲加載案例解析

 更新時(shí)間:2016年12月22日 14:21:15   作者:天盡頭的那片海  
這篇文章主要介紹了Mybatis中的延遲加載,場(chǎng)景結(jié)合案例分析非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

一、延遲加載

  resultMap可以實(shí)現(xiàn)高級(jí)映射(使用association、collection實(shí)現(xiàn)一對(duì)一及一對(duì)多映射),association、collection具備延遲加載功能。

  延遲加載:先從單表查詢,需要時(shí)再?gòu)年P(guān)聯(lián)表去關(guān)聯(lián)查詢,大大提高數(shù)據(jù)庫(kù)性能,因?yàn)椴樵儐伪硪汝P(guān)聯(lián)查詢多張表速度要快。

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

     lazyLoadingEnabled、aggressiveLazyLoading

設(shè)置項(xiàng)

描述

允許值

默認(rèn)值

lazyLoadingEnabled

全局性設(shè)置懶加載。如果設(shè)為‘false',則所有相關(guān)聯(lián)的都會(huì)被初始化加載。

true | false

false

aggressiveLazyLoading

當(dāng)設(shè)置為‘true'的時(shí)候,懶加載的對(duì)象可能被任何懶屬性全部加載。否則,每個(gè)屬性都按需加載。

true | false

true

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

場(chǎng)合:

         當(dāng)只有部分記錄需要關(guān)聯(lián)查詢其它信息時(shí),此時(shí)可按需延遲加載,需要關(guān)聯(lián)查詢時(shí)再向數(shù)據(jù)庫(kù)發(fā)出sql,以提高數(shù)據(jù)庫(kù)性能。

         當(dāng)全部需要關(guān)聯(lián)查詢信息時(shí),此時(shí)不用延遲加載,直接將關(guān)聯(lián)查詢信息全部返回即可,可使用resultType或resultMap完成映射。

二:案例:(在部門和員工一對(duì)多)

源碼介紹:

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> emp = new HashSet<Emp>();
 @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<Emp> getEmp() {
  return emp;
 }
 public void setEmp(Set<Emp> 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);
 // 提供一個(gè)可以獲取到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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.zhang.dao.DeptDao">
 <!-- 3.根據(jù)員工id查詢員工信息 -->
 <select id="selectEmpByDeptNo" resultType="Emp">
  select empno,empname
  from emp where deptno=#{deptno}
 </select>
 <!-- 2.對(duì)部門實(shí)體的映射 -->
 <resultMap type="Dept" id="deptMapper">
  <id property="deptno" column="deptno" />
  <result property="deptname" column="deptname" />
  <!-- 一對(duì)多部門關(guān)聯(lián)的員工 -->
  <!--select:關(guān)聯(lián)員工查詢 -->
  <!--column:關(guān)聯(lián)員工查詢所需要的條件(來源于1) -->
  <collection property="emp" ofType="Emp" select="selectEmpByDeptNo"
   column="deptno" />
 </resultMap>
 <!--1.根據(jù)部門id查詢部門信息 -->
 <select id="findById" resultMap="deptMapper">
  select deptno,deptname from dept
  where deptno=#{deptno}
 </select>
</mapper>

6.mybatis-config.xml (延遲加載的配置在此)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <!--lazyLoadingEnabled:設(shè)置懶加載,默認(rèn)為false。如果為false:則所有相關(guān)聯(lián)的都會(huì)被初始化加載。
  aggressiveLazyLoading:默認(rèn)為true。當(dāng)設(shè)置為true時(shí),懶加載的對(duì)象可能被任何懶屬性全部加載;否則,每個(gè)屬性按需加載。 -->
 <settings>
  <!-- 打開延遲加載的開關(guān) -->
  <setting name="lazyLoadingEnabled" value="true" />
  <!-- 將積極加載改為消息加載即按需加載 -->
  <setting name="aggressiveLazyLoading" value="false" />
 </settings>
 <!-- 配置別名 -->
 <typeAliases>
  <!--方式一: 按類型名定制別名 -->
  <!--方式二: 拿當(dāng)前指定包下的簡(jiǎn)單類名作為別名 -->
  <package name="cn.zhang.entity" />
 </typeAliases>
 <environments default="oracle">
  <environment id="oracle">
   <!-- 使用jdbc的事務(wù) -->
   <transactionManager type="JDBC" />
   <!-- 使用自帶的連接池 -->
   <dataSource type="POOLED">
    <!-- 我用的Oracle數(shù)據(jù)庫(kù) -->
    <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
    <property name="username" value="study" />
    <property name="password" value="123" />
   </dataSource>
  </environment>
 </environments>
 <mappers>
  <mapper resource="cn/zhang/dao/DeptDAO.xml" />
 </mappers>
</configuration>

7.MyTest.java(測(cè)試類)

package cn.zhang.test;
//一對(duì)多
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);
 }
}

測(cè)試結(jié)果:

在下面位置打斷點(diǎn)

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

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

<settings>
 <!-- 打開延遲加載的開關(guān) -->
 <setting name="lazyLoadingEnabled" value="true" />
 <!-- 將積極加載改為消息加載即按需加載 -->
 <setting name="aggressiveLazyLoading" value="false" />
</settings>

下一步:

F6下步:

F6下步:打出員工的名字

 情況三:

F6下一步:

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

以上所述是小編給大家介紹的Mybatis中的延遲加載,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java實(shí)現(xiàn)Excel轉(zhuǎn)PDF的兩種方法詳解

    Java實(shí)現(xiàn)Excel轉(zhuǎn)PDF的兩種方法詳解

    使用具將Excel轉(zhuǎn)為PDF的方法有很多,在這里我給大家介紹兩種常用的方法:使用spire轉(zhuǎn)化PDF、使用jacob實(shí)現(xiàn)Excel轉(zhuǎn)PDF,分別應(yīng)對(duì)兩種不一樣的使用場(chǎng)景,需要的可以參考一下
    2022-01-01
  • java web圖片上傳和文件上傳實(shí)例詳解

    java web圖片上傳和文件上傳實(shí)例詳解

    這篇文章主要介紹了java web圖片上傳和文件上傳實(shí)例詳解的相關(guān)資料,這里提供了兩種方法及示例代碼,需要的朋友可以參考下
    2016-11-11
  • 使用java生成字母驗(yàn)證碼

    使用java生成字母驗(yàn)證碼

    這篇文章主要介紹了使用java生成字母驗(yàn)證碼的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Spring整合TimerTask實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度

    Spring整合TimerTask實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度

    這篇文章主要介紹了Spring整合TimerTask實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • SpringBoot掃描不到Controller的解決方案

    SpringBoot掃描不到Controller的解決方案

    這篇文章主要介紹了SpringBoot掃描不到Controller的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 一篇文章帶你搞定JAVA內(nèi)存泄漏

    一篇文章帶你搞定JAVA內(nèi)存泄漏

    今天小編就為大家分享一篇關(guān)于Java內(nèi)存泄漏問題處理方法經(jīng)驗(yàn)總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-07-07
  • Spring Boot 定制URL匹配規(guī)則的方法

    Spring Boot 定制URL匹配規(guī)則的方法

    本篇文章主要介紹了Spring Boot 定制URL匹配規(guī)則的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java基于Guava Retrying實(shí)現(xiàn)重試功能

    Java基于Guava Retrying實(shí)現(xiàn)重試功能

    這篇文章主要介紹了Java基于Guava Retrying實(shí)現(xiàn)重試功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 通過Java計(jì)算文件的MD5值實(shí)現(xiàn)方式

    通過Java計(jì)算文件的MD5值實(shí)現(xiàn)方式

    本文將詳細(xì)介紹如何使用Java語言來計(jì)算文件的MD5值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Spring?MVC文件請(qǐng)求處理MultipartResolver詳解

    Spring?MVC文件請(qǐng)求處理MultipartResolver詳解

    這篇文章主要介紹了Spring?MVC文件請(qǐng)求處理詳解:MultipartResolver,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11

最新評(píng)論