1.延遲加載:使用在關聯查詢中
提高系統性能,減少數據庫壓力。
//查詢訂單信息,延時加載用戶信息
//全局配置文件
<settings>
<!--開啓延遲加載-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--按需延遲加載-->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 開啓二級緩存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
//映射文件
<mapper namespace="com.neuedu.mapper.OrdersMapperCustom">
<resultMap type="com.neuedu.pojo.Orders" id="OrdersUserLazyLoadingResultMap">
<!--對訂單信息進行映射配置 -->
<id column="id" property="id"/>
<result column="userid" property="userId"/>
<result column="orderid" property="orderId"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<association property="user" javaType="com.neuedu.pojo.User"
select="com.neuedu.mapper.OrdersMapperCustom.findUserById" column="userid">
</association>
</resultMap>
<!-- 查詢訂單關聯查詢用戶,用戶信息需要延遲加載 -->
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
SELECT * FROM orders
</select>
<!-- 用戶信息需要延遲加載 -->
<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM T_USER WHERE id=#{value}
</select>
</mapper>
//接口
public interface OrdersMapperCustom {
//查詢訂單關聯查詢用戶,用戶信息是延遲加載
public List<Orders> findOrdersUserLazyLoading() throws Exception;
//根據id查詢用戶信息
public User findUserById(int id) throws Exception;
}
//測試類
@Test
public void testFindOrdersUserLazyLoading() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();// 創建代理對象
OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
// 查詢訂單信息(單表)
List<Orders> list = ordersMapperCustom.findOrdersUserLazyLoading();
for (Orders orders : list) {
// 執行getUser()去查詢用戶信息,這裏實現按需加載,通過debug調試可以查看
User user = orders.getUser();
System.out.println(user);
}
}
2、緩存
查詢時先找緩存中是否有需要的對象,如果沒有再去數據庫中查詢,並將結果存放到緩存中。
提高系統性能。
一級緩存:默認是開啓的,作用域一次session會話
@Test
public void getUserById() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();// 創建代理對象
OrdersMapperCustom dao = sqlSession.getMapper(OrdersMapperCustom.class);
User u1=dao.findUserById(6);
User u2=dao.findUserById(6)
sqlSession.close();
System.out.println(u1==u2);//true 執行一次sql語句
}
二級緩存:默認關閉的,作用域是一個命名空間,也就是一個命名空間共享一份緩存
二級緩存的使用:
(1)在全局配置文件中
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
(2)在映射文件中
<cache/>
(3)pojo類序列化
public class User implements Serializable {}
@Test
public void getUserById() throws Exception{
SqlSession sqlSession1 = sqlSessionFactory.openSession();// 創建代理對象
OrdersMapperCustom dao1 = sqlSession1.getMapper(OrdersMapperCustom.class);
SqlSession sqlSession2 = sqlSessionFactory.openSession();// 創建代理對象
OrdersMapperCustom dao2 = sqlSession2.getMapper(OrdersMapperCustom.class);
User u1=dao1.findUserById(6);
sqlSession1.close();
User u2=dao2.findUserById(6)
sqlSession2.close();
System.out.println(u1==u2);//false sql也執行一次Cache Hit Ratio [com.neuedu.mapper.OrdersMapperCustom]: 0.5
}