mysql懒加载_mybatis懒加载

1.概念

懒加载就是按需加载,我们需要什么的时候再去进行什么操作。而且先从单表查询,需要时再从关联表去关联查询,能很大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

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

2.demo

1.创建部门表和员工表(ps:这里员工表有一个外键映射的关系,实现一对多)

mysql懒加载_mybatis懒加载_第1张图片

mysql懒加载_mybatis懒加载_第2张图片

2.创建实体

@Data

public class Department {

private Integer id;

private String name;

private List employeeList;

}

@Data

public class Employee {

private Integer id;

private String name;

private Integer departmentId;

}

3.创建dao和mapper(ps:fetchType="lazy",这个拉取类型是配置懒加载的关键)

/**

* 查询所有部门

* @return

*/

List getDepartment();

/**

* 根据部门ID查询员工

* @param departmentId

* @return

*/

List getEmployeeByDepartmentId(Integer departmentId);

SELECT

*

FROM department

javaType="ArrayList" ofType="com.mljr.movies.entity.Employee"

select="getEmployeeByDepartmentId" fetchType="lazy">

SELECT

*

FROM employee

where department_id = #{departmentId}

3.测试

1.test

@Test

public void contextLoads() {

List departments = userDao.getDepartment();

System.out.println("=========only query department==========");

System.out.println("departmentName: "+departments.get(0).getName());

System.out.println("=========query department and employee==========");

System.out.println("employeeName: "+departments.get(0).getEmployeeList().get(0).getName());

}

2.总结

当配置懒加载(fetchType="lazy")时,可以看到控制台输出,在只查询部门时,仅查询部门sql,在需要获取员工时,才回去查询涉及到员工的sql。

JDBC Connection [HikariProxyConnection@1749758430 wrapping com.mysql.jdbc.JDBC4Connection@6b52dd31] will not be managed by Spring

==> Preparing: SELECT * FROM department

==> Parameters:

<== Columns: id, name

<== Row: 1, 开发部

<== Row: 2, 产品部

<== Row: 3, 人事部

<== Total: 3

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@216914]

=========only query department==========

departmentName: 开发部

=========query department and employee==========

JDBC Connection [HikariProxyConnection@275002771 wrapping com.mysql.jdbc.JDBC4Connection@6b52dd31] will not be managed by Spring

==> Preparing: SELECT * FROM employee where department_id = ?

==> Parameters: 1(Integer)

<== Columns: id, name, department_id

<== Row: 1, 张三, 1

<== Row: 4, 王健, 1

<== Total: 2

employeeName: 张三

当不配置懒加载(fetchType="lazy")时,可以看到控制台输出,在结果集之前sql全部执行。

JDBC Connection [HikariProxyConnection@438897070 wrapping com.mysql.jdbc.JDBC4Connection@e042c99] will not be managed by Spring

==> Preparing: SELECT * FROM department

==> Parameters:

<== Columns: id, name

<== Row: 1, 开发部

====> Preparing: SELECT * FROM employee where department_id = ?

====> Parameters: 1(Integer)

<==== Columns: id, name, department_id

<==== Row: 1, 张三, 1

<==== Row: 4, 王健, 1

<==== Total: 2

<== Row: 2, 产品部

====> Preparing: SELECT * FROM employee where department_id = ?

====> Parameters: 2(Integer)

<==== Columns: id, name, department_id

<==== Row: 2, 李四, 2

<==== Total: 1

<== Row: 3, 人事部

====> Preparing: SELECT * FROM employee where department_id = ?

====> Parameters: 3(Integer)

<==== Columns: id, name, department_id

<==== Row: 3, 王二, 3

<==== Total: 1

<== Total: 3

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@35764bef]

=========only query department==========

departmentName: 开发部

=========query department and employee==========

employeeName: 张三

你可能感兴趣的:(mysql懒加载)