Mybatis中的延遲加載案例解析
一、延遲加載
resultMap可以實現(xiàn)高級映射(使用association、collection實現(xiàn)一對一及一對多映射),association、collection具備延遲加載功能。
延遲加載:先從單表查詢,需要時再從關(guān)聯(lián)表去關(guān)聯(lián)查詢,大大提高數(shù)據(jù)庫性能,因為查詢單表要比關(guān)聯(lián)查詢多張表速度要快。
在mybatis核心配置文件中配置:
lazyLoadingEnabled、aggressiveLazyLoading
|
設(shè)置項 |
描述 |
允許值 |
默認(rèn)值 |
|
lazyLoadingEnabled |
全局性設(shè)置懶加載。如果設(shè)為‘false',則所有相關(guān)聯(lián)的都會被初始化加載。 |
true | false |
false |
|
aggressiveLazyLoading |
當(dāng)設(shè)置為‘true'的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。 |
true | false |
true |
<settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings>
場合:
當(dāng)只有部分記錄需要關(guān)聯(lián)查詢其它信息時,此時可按需延遲加載,需要關(guān)聯(lián)查詢時再向數(shù)據(jù)庫發(fā)出sql,以提高數(shù)據(jù)庫性能。
當(dāng)全部需要關(guān)聯(lián)查詢信息時,此時不用延遲加載,直接將關(guān)聯(lián)查詢信息全部返回即可,可使用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> 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);
// 提供一個可以獲取到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.對部門實體的映射 -->
<resultMap type="Dept" id="deptMapper">
<id property="deptno" column="deptno" />
<result property="deptname" column="deptname" />
<!-- 一對多部門關(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)的都會被初始化加載。
aggressiveLazyLoading:默認(rèn)為true。當(dāng)設(shè)置為true時,懶加載的對象可能被任何懶屬性全部加載;否則,每個屬性按需加載。 -->
<settings>
<!-- 打開延遲加載的開關(guān) -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 將積極加載改為消息加載即按需加載 -->
<setting name="aggressiveLazyLoading" value="false" />
</settings>
<!-- 配置別名 -->
<typeAliases>
<!--方式一: 按類型名定制別名 -->
<!--方式二: 拿當(dāng)前指定包下的簡單類名作為別名 -->
<package name="cn.zhang.entity" />
</typeAliases>
<environments default="oracle">
<environment id="oracle">
<!-- 使用jdbc的事務(wù) -->
<transactionManager type="JDBC" />
<!-- 使用自帶的連接池 -->
<dataSource type="POOLED">
<!-- 我用的Oracle數(shù)據(jù)庫 -->
<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(測試類)
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);
}
}
測試結(jié)果:
在下面位置打斷點

情況一:在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中的延遲加載,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java實現(xiàn)Excel轉(zhuǎn)PDF的兩種方法詳解
使用具將Excel轉(zhuǎn)為PDF的方法有很多,在這里我給大家介紹兩種常用的方法:使用spire轉(zhuǎn)化PDF、使用jacob實現(xiàn)Excel轉(zhuǎn)PDF,分別應(yīng)對兩種不一樣的使用場景,需要的可以參考一下2022-01-01
Spring整合TimerTask實現(xiàn)定時任務(wù)調(diào)度
這篇文章主要介紹了Spring整合TimerTask實現(xiàn)定時任務(wù)調(diào)度的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
Java基于Guava Retrying實現(xiàn)重試功能
這篇文章主要介紹了Java基于Guava Retrying實現(xiàn)重試功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
Spring?MVC文件請求處理MultipartResolver詳解
這篇文章主要介紹了Spring?MVC文件請求處理詳解:MultipartResolver,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-11-11

