一:Mybatis的延时加载
1.一级缓存的介绍:
Mybatis中有一级缓存,一级缓存默认开启的,是sqlSession级别的缓存,例如:当查询用户订单和用户信息时,首先查出来的是三个订单,而三个订单分别属于两个用户,所以在查询出订单的时候,只需要再向数据库发送两条查询用户信息的sql即可,因为其中的两个订单是属于同一个用户的,这就是Mybatis'的一级缓存
2.通过查询用户信息及订单的例子证明一级缓存的存在
a、编写Mapper接口中的方法
//查询所有订单,使用延时加载先不查询用户信息,当需要时再查询
public List<Orders> selectOrdersNoUser();
b、编写Mapper.xml配置文件中的延时加载配置
<!-- 根据用户id获取用户信息 -->
<select id="selectUserById" parameterType="Integer" resultType="User">
select *from user where id = #{id}
</select>
<!-- 手动映射, 获取所有订单信息 -->
<resultMap type="Orders" id="ordersResultMap">
<result 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:调用之前根据Id获取用户信息方法的门牌号
column:select中查询用户信息方法的入参
-->
<association property="user" javaType="User" select="selectUserById" column="user_id">
<result column="id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
</association>
</resultMap>
<!-- 查询所有订单信息的方法,延时加载用户信息 -->
<select id="selectOrdersNoUser" resultMap="ordersResultMap">
select order.* from Orders
</select>
c、编写Junit测试类
//获取所有订单信息,采用延时加载用户的方法
@Test
public void selectOrdersNoUser(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<Orders> orders = userMapper.selectOrdersNoUser();
System.out.println(orders);
}
d、通过直接查询数据库证明订单及用户的关系
e、通过Debug分析数据库sql执行的条数
f、在sqlMapConfig.xml中的setting中配置延时加载开关
<configuration>
<!-- 全局配置参数 -->
<settings>
<!-- 延时加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
二:Mybatis的二级缓存
1.Mybatis的二级缓存是sqlSessionFactory级别的缓存,使用步骤
a、在sqlMapConfig中配置setting群居变量
<configuration>
<!-- 全局配置参数 -->
<settings>
<!-- 延时加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
b、在需要使用二级缓存的Mapper.xml文件中配置使用
<mapper namespace="com.mybatis.mapper.UserMapper">
<!-- 开启本mapper的二级缓存 -->
<cache/>