Mybatis中的延遲加載案例解析
一、延遲加載
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的兩種方法詳解
使用具將Excel轉(zhuǎn)為PDF的方法有很多,在這里我給大家介紹兩種常用的方法:使用spire轉(zhuǎn)化PDF、使用jacob實(shí)現(xiàn)Excel轉(zhuǎn)PDF,分別應(yīng)對(duì)兩種不一樣的使用場(chǎng)景,需要的可以參考一下2022-01-01Spring整合TimerTask實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度
這篇文章主要介紹了Spring整合TimerTask實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Java基于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)方式
本文將詳細(xì)介紹如何使用Java語言來計(jì)算文件的MD5值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04Spring?MVC文件請(qǐng)求處理MultipartResolver詳解
這篇文章主要介紹了Spring?MVC文件請(qǐng)求處理詳解:MultipartResolver,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11