您的位置:首页 > 编程语言 > Java开发

mybatis学习之高级映射 延迟加载

2017-06-23 22:24 411 查看

1、什么是延迟加载

resultMap可以实现高级映射,对于查询结果有特殊要求的,使用association和collection 具备延迟加载的功能

比如,查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求。当我们需要查询用户信息时,再查询用户信息。把对用户信息的查询按照需求去查询,就叫做延迟加载

延迟加载:先从单表开始查询,需要时再从关联表关联查询,可以大大提高数据库的性能。因为查询单表要比关联查询多张表的速度要快

2、使用[b]association实现延迟加载[/b]

[b]2.1 需求[/b]

查询订单并且关联查询用户信息

2.2 mapper.xml

需要定义两个mapper的方法对应的statement

1、只查询订单的信息
SELECT * FROM orders

在查询订单的statement中使用association去延迟加载(执行)下面的statement
<!-- 查询订单 关联查询用户 ,用户信息需要延迟加载 -->
<select id="findOrderUserLazyLoading" resultMap="OrderUserLazyLoading">
SELECT * FROM orders
</select>


2、查询用户信息
通过上面查询到的订单信息中user_id去关联查询用户信息
从userMapper.xml中的findUserById,拿过来执行
<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM USER WHERE id = #{id}
</select>


上面先去执行findOrderUserLazyLoading方法,当需要去查询用户时,再去执行findUserById,通过resultMap的定义,将延迟加载的执行配置起来。

resultMap:
<!-- 延迟加载的resultMap -->
<resultMap id="OrderUserLazyLoading" type="pojo.Order">
<!-- 对订单信息进行配置 -->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!--
实现度用户信息进行延迟加载
select:指定延迟加载所需要执行的statement的id(根据user_id查询用户信息的statement,可使用usermapper中的findUserById来完成根据用户id(user_id)信息的查询
column:订单信息中关联用户信息查询的列,是user_id。
关联查询的sql理解为:
SELECT orders.* ,
(SELECT username FROM USER WHERE orders.`user_id` = user.`id`)username,
(SELECT sex FROM USER WHERE orders.`user_id` = user.`id`)sex
FROM orders
-->
<association property="user" javaType="pojo.User" select="mapper.UserMapper.findUserById" column="user_id">
<!-- 实现度用户信息进行延迟加载 -->

</association>
</resultMap>


2.3 mapper.java

//查询订单 关联查询用户 用户信息延迟加载
public List<Order> findOrderUserLazyLoading() throws Exception;

2.4 测试

测试思路:
执行上面的mapper方法,内部调用orderCustom.xml中的findOrderUserLazyLoading方法,只查询order信息(单表)
在程序中遍历该List<Order> ,当我们调用order中的getUser方法时,就开始进行延迟加载。
延迟加载去调用UserMapper.xml中的findUserById这个方法,获取用户的信息
延迟加载配置:
mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置

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

lazyLoadingEnabled、aggressiveLazyLoading

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true | false

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

true | false

true

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

测试代码
@Test
public void testFindOrderUserLazyLoading() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
OrderMapperCustom orderMapperCustom = sqlSession.getMapper(OrderMapperCustom.class);
//查询订单信息(单表)
List<Order> list = orderMapperCustom.findOrderUserLazyLoading();
//遍历订单列表
for(Order order:list){
//执行getUser() 查询用户信息,实现按需加载
User user = order.getUser();
System.out.println(user);
}
}


2.5 运行结果

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - Class not found: org.jboss.vfs.VFS
DEBUG [main] - JBoss 6 VFS API is not available in this environment.
DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile
DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Reader entry: Items.class
DEBUG [main] - Reader entry: Order.class
DEBUG [main] - Reader entry: OrderCustom.class
DEBUG [main] - Reader entry: OrderDetail.class
DEBUG [main] - Reader entry: User.class
DEBUG [main] - Reader entry: UserCustom.class
DEBUG [main] - Reader entry: UserQueryVo.class
DEBUG [main] - Listing file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Items.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Items.class
DEBUG [main] - Reader entry: ����   4 W
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Order.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/Order.class
DEBUG [main] - Reader entry: ����   4 f
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderCustom.class
DEBUG [main] - Reader entry: ����   4 "
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderDetail.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/OrderDetail.class
DEBUG [main] - Reader entry: ����   4 J
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/User.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/User.class
DEBUG [main] - Reader entry: ����   4 [
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserCustom.class
DEBUG [main] - Reader entry: ����   4
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserQueryVo.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/pojo/UserQueryVo.class
DEBUG [main] - Reader entry: ����   4 %
DEBUG [main] - Checking to see if class pojo.Items matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.Order matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.OrderCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.OrderDetail matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.User matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.UserCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class pojo.UserQueryVo matches criteria [is assignable to Object]
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Reader entry: OrderMapperCustom.class
DEBUG [main] - Reader entry: OrderMapperCustom.xml
DEBUG [main] - Reader entry: UserMapper.class
DEBUG [main] - Reader entry: UserMapper.xml
DEBUG [main] - Listing file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.class
DEBUG [main] - Reader entry: ����   4
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.xml
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/OrderMapperCustom.xml
DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.class
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.class
DEBUG [main] - Reader entry: ����   4    findUserByIdResultMap (I)Lpojo/User;
DEBUG [main] - Find JAR URL: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.xml
DEBUG [main] - Not a JAR: file:/E:/%e5%a4%a7%e5%ad%a6%e9%a1%b9%e7%9b%ae/IDEA%20Project/mybatis/out/production/mybatis/mapper/UserMapper.xml
DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
DEBUG [main] - Checking to see if class mapper.OrderMapperCustom matches criteria [is assignable to Object]
DEBUG [main] - Checking to see if class mapper.UserMapper matches criteria [is assignable to Object]
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 84739718.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@50d0686]
DEBUG [main] - ==>  Preparing: SELECT * FROM orders
DEBUG [main] - ==> Parameters:
DEBUG [main] - <==      Total: 4
DEBUG [main] - ==>  Preparing: SELECT * FROM USER WHERE id = ?
DEBUG [main] - ==> Parameters: 28(Integer)
DEBUG [main] - <==      Total: 1
User{id=28, username='fjnmbb124', sex='1', birthday=Mon Jun 19 00:00:00 CST 2017, address='湖南长沙', orderList=null}
DEBUG [main] - ==>  Preparing: SELECT * FROM USER WHERE id = ?
DEBUG [main] - ==> Parameters: 29(Integer)
DEBUG [main] - <==      Total: 1
User{id=29, username='测试测试1', sex='1', birthday=Mon Jun 19 00:00:00 CST 2017, address='湖南益阳', orderList=null}
DEBUG [main] - ==>  Preparing: SELECT * FROM USER WHERE id = ?
DEBUG [main] - ==> Parameters: 30(Integer)
DEBUG [main] - <==      Total: 1
User{id=30, username='测试测试2', sex='1', birthday=Mon Jun 19 00:00:00 CST 2017, address='湖南长沙', orderList=null}
DEBUG [main] - ==>  Preparing: SELECT * FROM USER WHERE id = ?
DEBUG [main] - ==> Parameters: 31(Integer)
DEBUG [main] - <==      Total: 1
User{id=31, username='测试测试3', sex='1', birthday=Mon Jun 19 00:00:00 CST 2017, address='湖南张家界', orderList=null}

Process finished with exit code 0



2.6、延迟加载思考

不实用mybatis提供的association喝collection中的延迟加载功能, 如何实现延迟加载?

实现方法如下:

定义两个mapper方法:

1,查询订单列表

2,根据用户id查询用户信息

实现思路:

先去查询第一个mapper方法,获取订单信息列表

在程序中(service),按需去调用第二个mapper方法 查询用户信息

总结:使用延迟加载方法,先去查询简单的sql(最好是单表,也可以是关联表)再去按需加载关联查询的其他信息
不需要关联查询(进一步查询数据),只需要执行方法即可,若需要进一步了解数据外键,则可使用延迟加载(懒加载),调用get方法 获取到该数据的pojo类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息