使用mybatis的延迟加载

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


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

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

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

使用mybatis的延迟加载

定义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());
}
}


}