在某些情况下我们需要使用延迟加载技术来提高我们程序查询的性能,通过减少与数据库的连接操作,做到按需加载,这样达到提高程序性能的目的。

首先需要在全局配置文件(SqlMapConfig.xml)中配置全局配置参数

lazyLoadingEnabled:延迟加载的总开关,设置为true

aggressiveLazyLoading:设置为false,实现按需加载(将积极变为消极)


定义mapper.xml

注意:在这里例子中,采用的是mapper接口的方式,所有也要定义对应的mapper.java文件

(1)定义一个statement,只查询订单信息

<?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="com.ithema.mybatis.dao.OrderMapper">

<!-- 定义一个resultMap,用于映射订单信息和用户信息 -->
<resultMap type="com.ithema.mybatis.po.Orders" id="orderAndUserResultMap">
<!-- 配置订单信息的映射 -->
<id column="id" property="id"/>
<result column="user_id" property="user_id"/>
<result column="order_number"  property="order_number" />

<!-- 通过association标签,配置延迟加载,用户信息
property:通过Orders对象中的哪个属性去关联用户用户信息
javaType:所关联用户信息的对象的类型
select:延迟加载调用的statement,如果跨命名空间,需要加上namespace
column:将哪一列的值作为参数,传到延迟加载的statement
-->
<association property="user" javaType="com.ithema.mybatis.po.User" 
select="com.ithema.mybatis.dao.UserMapper.findUserById" column="user_id"></association>

</resultMap>

<!-- 查询订单列表 -->
<select id="findOrderList" resultMap="orderAndUserResultMap">
SELECT orders.id,orders.user_id,orders.order_number FROM orders
</select>

</mapper>

对应的接口

/**

 * 订单接口

 * @author yao

 * @since 2017-10-01

 */

public interface OrderMapper {

/**
* 查询订单列表,延迟加载用户信息
* @return
*/

  List<Orders> findOrderList();

}

(2)定义一个statement,只查询用户信息

<?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="com.ithema.mybatis.dao.UserMapper">
<select id="findUserById" parameterType="java.lang.Integer" resultType="com.ithema.mybatis.po.User">
SELECT user.id,user.username,user.address FROM USER WHERE user.id=#{id}
</select>

</mapper>

对应的接口

/**

 * 用户信息接口

 * @author yao

 * @since 2017-10-01

 */

public interface UserMapper {

/**
* 根据id查询用户信息
* @param id
* @return
*/

    User findUserById(int id);

}

测试类:

public class OrderMapperTest {

private SqlSessionFactory sqlSessionFactory;

@Before
public void setUp() throws Exception {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}

@Test
public void testFindOrderList() {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
List<Orders> list = orderMapper.findOrderList();
for (Orders orders : list) {
System.out.println(orders.getId());

// 当需要用到用户信息的时候才去数据库查询用户信息
System.out.println(orders.getUser());
}
}

}

使用mybatis的延迟加载的更多相关文章

  1. mybatis的延迟加载、一级缓存、二级缓存

    mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...

  2. Mybatis之延迟加载机制

    1.  延迟加载的含义: 用到的时候才会去进行相关操作 2.  延迟加载的例子: 2.1 spring的BeanFactory,在getBean()的时候才创建Bean 2.2 物理分页查询,只有点击 ...

  3. Mybatis的延迟加载和缓存

    1. MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力.       注意:MyBatis的延迟加 ...

  4. Mybatis 测试延迟加载

    在学习mybatis的延迟加载时,对 lazyLoadingEnabled 和 aggressiveLazyLoading 的区别并不理解,特别是对查询的条件不同时,执行的查询语句也不一样,所以还是测 ...

  5. Mybatis的延迟加载和立即加载

    Mybatis的延迟加载和立即加载 示例:在一对多中,当我们有一个用户,他有100个帐户 问题1:在查询用户时,要不要把关联的账户查出来? 问题2:在查询账户时,要不要把关联的用户信息查出来? 问题1 ...

  6. MyBatis学习--延迟加载

    简介 在resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能.例如:我们查询订单并 ...

  7. 8.Mybatis的延迟加载

    在Mybatis中的延迟加载只有resultMap可以实现,ResultMap 可以实现高级映射(association,collection可以实现一对1和一对多的映射),他们具有延迟加载的功能,r ...

  8. 七 mybatis的延迟加载

    1       延迟加载 1.1     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.coll ...

  9. mybatis的延迟加载

    1. 什么是延迟加载 举个例子: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 所以延迟加载即先从单 ...

  10. mybatis实现延迟加载多对一

    1.数据库表 CREATE TABLE `country` ( `cid` ) NOT NULL AUTO_INCREMENT COMMENT '国家id', `cname` ) COLLATE ut ...

随机推荐

  1. x64:x64

    ylbtech-x64:x64 “x86-64”,有时会简称为“x64”,是64位微处理器架构及其相应指令集的一种,也是Intel x86架构的延伸产品.“x86-64”1999由AMD设计,AMD首 ...

  2. iOS之CATextLayer属性简介

    1.CATextLayer简介 CATextLayer快速高效简单地来渲染纯文本.NSAttributedString /* The text layer provides simple text l ...

  3. Nginx是什么

    Nginx很强大,通常作为反向代理服务器,什么是反向代理服务器?就是客户端发送请求给Nginx ,Nginx收到请求后将请求转发给真正的服务器,然后接受服务器处理的结果,最后发送给客户端.客户端以为N ...

  4. shell脚本实现读取一个文件中的某一列,并进行循环处理

    shell脚本实现读取一个文件中的某一列,并进行循环处理 1) for循环 #!bin/bash if [ ! -f "userlist.txt" ]; then echo &qu ...

  5. Python2.7版本:定义类时为什么要继承object类?

    ********此答案摘自知乎,且经过自己实际运行后得出******** 继承 object 类的是新式类,不继承 object 类的是经典类 例子: 新式类: 经典类: B.C 是 A 的子类,D ...

  6. 运行第一个python程序,python 变量,常量,注释

    一.运行第一个python程序: print('Hello,world') 保存为.py文件 在cmd窗口: python3x:python  py文件路径 回车 python2x:python  p ...

  7. 04-6-queryselect

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. elasticsearch 中文API 记数(八)

    计数API 计数API允许开发者简单的执行一个查询,返回和查询条件相匹配的文档的总数.它可以跨多个索引以及跨多个类型执行. import static org.elasticsearch.index. ...

  9. java连接SQLserver数据库模板代码

    package cn.mldn.lxh.dbc; import java.sql.Connection; import java.sql.DriverManager; public class Dat ...

  10. typescript使用小结

    1. typescript使得js在书写的过程中有了参数类型的限制在 传参的过程中变得严格,减少了不必要的错误的发生 2. tslint同时也兼备了一部分eslint的作用,在一定程度上我们使用tsl ...