0
点赞
收藏
分享

微信扫一扫

mybatis的延迟加载


延迟加载意义:在需求允许的情况下,先查询单表,当需要关联其它表查询时,进行延迟加载,去关联查询,达到目标:

不需要关联信息时不查询,需要时再查询。好处:提高数据库的性能。


需求:

查询订单信息,关联查询用户信息。

延迟加载需求:首次只查询订单信息,当需要关联查询用户信息时,再查询用户信息。



使用mybatis的延迟加载


1.打开延迟加载的开关

在SqlMapConfig.xml中配置setting全局参数:


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

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

<!-- 设置延迟加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>


2.定义Mapper.xml

定义statement,只查询订单

<!-- 查询订单信息 -->
<select id="findOrdersList" resultMap="lazyLoad">
SELECT * FROM orders
</select>


resultMap

<!-- 订单及用户的resultMap,实现延迟加载 -->
<resultMap type="orders" id="lazyLoad">
<!-- 配置订单的映射 -->
<id column="id" property="id"/>
<result column="user_id" property="user_id"/>
<result column="order_number" property="order_number"/>

<!--
配置延迟的 用户信息
select:延迟加载是调用的statement,垮空间需要加上namespace
column:传到statement的参数
在这里需要将user_id传去将对应的用户信息查出
-->
<association property="user" javaType="com.mo.pojo.User"
select="com.mo.mapper.UserMapper.findUserById" column="user_id">

</association>
</resultMap>


3.在UserMapper.xml写statement,当需要用户的信息时,上面的定义的resultMap会传一个user_id过来

<!-- 根据订单ID来查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM USER WHERE id=#{id}
</select>



4.写Mapper.java

public interface OrdersMapperCustom {
List<Orders> findOrderslazyLoadUser();
}




5.单元测试


public class TestDao {

//这里需要创建sqlSessionFactory工厂,因为创建新的UserDaoImpl需要注入会话工厂
private SqlSessionFactory sqlSessionFactory;

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


@Test
public void test4(){
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
List<Orders> list = ordersMapperCustom.findOrderslazyLoadUser();//在这里只会执行查询订单的sql
System.out.println(list.size());
for (Orders order : list) {
User user = order.getUser();//这里需要用户的信息,就会执行懒加载,将用户的信息查询出来
}
}
}






举报

相关推荐

0 条评论