Mybatis中的延迟加载案例解析

网友投稿 212 2023-06-23


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 cdhyeBKHn.zhang.entity.Dept;

public interface DeptDao {

/**

* 查询指定记录

* @return

* @throws IOException

*/

public Dept findById(Integer id) throws IOException;

}

5.DeptDAO.xml

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select empno,empname

from emp where deptno=#{deptno}

column="deptno" />

select deptno,deptname from dept

where deptno=#{deptno}

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

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

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中的延迟加载,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!

column="deptno" />

select deptno,deptname from dept

where deptno=#{deptno}

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

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

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中的延迟加载,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决java后台登录前后cookie不一致问题
下一篇:自动适应iframe右边的高度
相关文章

 发表评论

暂时没有评论,来抢沙发吧~