mybatis学习之高级映射 延迟加载
2017-06-23 22:24
411 查看
1、什么是延迟加载
resultMap可以实现高级映射,对于查询结果有特殊要求的,使用association和collection 具备延迟加载的功能比如,查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求。当我们需要查询用户信息时,再查询用户信息。把对用户信息的查询按照需求去查询,就叫做延迟加载
延迟加载:先从单表开始查询,需要时再从关联表关联查询,可以大大提高数据库的性能。因为查询单表要比关联查询多张表的速度要快
2、使用[b]association实现延迟加载[/b]
[b]2.1 需求[/b]
查询订单并且关联查询用户信息2.2 mapper.xml
需要定义两个mapper的方法对应的statement1、只查询订单的信息
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类
相关文章推荐
- Mybatis框架学习(三)—高级映射,延迟加载
- Mybatis - 高级映射( 一对多 ,多对多 ,延迟加载)
- MyBatis学习(六)---高级应用(延迟加载、缓存)
- 【MyBatis框架】高级映射-延迟加载
- 【MyBatis框架】高级映射-延迟加载
- 【MyBatis框架】高级映射-延迟加载
- 【MyBatis学习09】高级映射之一对多查询
- 【MyBatis学习08】高级映射之一对一查询
- Mybatis学习记录(七)----Mybatis延迟加载
- MyBatis学习五:延迟加载
- MyBatis学习五:延迟加载
- 【MyBatis学习11】MyBatis中的延迟加载
- mybatis学习教程中级(八)延迟加载
- 【MyBatis学习11】MyBatis中的延迟加载
- mybatis高级结果映射学习之一对一映射(六)
- mybatis学习之高级映射
- mybatis--关联映射及延迟加载
- JPA学习---第六节:大数据字段映射与字段延迟加载
- MyBatis学习--高级映射
- MyBatis高级映射学习教程