1.什麼是延遲載入
#resultMap可以實現高階映射(使用association、collection實作一對一及一對多映射),association、collection具備延遲載入功能。
需求:
如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢用戶資訊時再查下用戶資訊。把對使用者資訊的按需去查詢就是延遲載入。
延遲載入:先從單表查詢、需要時再從關聯表去關聯查詢,大幅提升資料庫效能,因為查詢單表要比關聯查詢多張表速度快。
查詢訂單並且關聯查詢使用者資訊
##需要定義兩個mapper的方法對應的statement。
(1)只查詢訂單資訊
SELECT * FROM orders
在查詢訂單的statement中使用association去延遲載入(執行)下邊的statement(關聯查詢使用者資訊)。
<!-- 查询订单关联查询用户 --><select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">SELECT * FROM orders</select>
(2)關聯查詢使用者資訊
透過上邊查詢到的訂單資訊中user_id去關聯查詢使用者資訊
使用UserMapper.xml中的findUserById
<select id="findUserById" parameterType="int" resultType="user">select * from user where id=#{value}</select>
上邊先去執行findOrdersUserLazyLoading,當需要去查詢使用者的時候再去執行fingUserById,透過resultMap的定義將延遲載入執行配置起來。
使用association中的select指定延遲載入去執行的statement的id。
<!-- 延迟加载的resultMap --><resultMap type="joanna.yan.mybatis.entity.Orders" id="OrdersUserLazyLoadingResultMap"><!-- 1.对订单信息进行映射配置 --><id 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"/><!-- 2.实现对用户信息进行延迟加载 --><!-- select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement) 要使用UserMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询, 如果findUserById不在本mapper中需要前边加namespace。 column:订单信息中关联用户信息查询的列,是user_id 关联查询的sql理解为: SELECT orders.*, (SELECT username FROM USER WHERE orders.user_id = user.id)username, (SELECT sex FROM USER WHERE orders.user_id = user.id)sex FROM orders--><association property="user" javaType="joanna.yan.mybatis.entity.User"select="joanna.yan.mybatis.mapper.UserMapper.findUserById" column="user_id"></association></resultMap>
//查询订单关联查询用户,用户信息时延迟加载public List<Orders> findOrdersUserLazyLoading() throws Exception;
(1)執行上邊mapper方法(findOrdersUserLazyLoading),內部去呼叫joanna.yan.mybatis.mapper.OrdersCustomMapper中findOrdersUserLazyLoading只查詢orders資訊(單表)。
(2)在程式中去遍歷上一步驟查詢出的List
(3)延遲加載,去呼叫UserMapper.xml中findUserById這個方法取得使用者資訊。
mybatis預設沒有開啟延遲加載,需要在SqlMapConfig.xml中setting配置。
在mybatis核心設定檔中設定:
lazyLoadingEnabled、aggressiveLazyLoading
設定項目 |
#描述 |
允許值 |
#預設值 |
lazyLoadingEnabled | 全域性設定懶載入。如果設為‘false’,則所有相關聯的都會被初始化載入。 | true | false | |
aggressiveLazyLoading
|
當設定為'true'的時候,懶載入的物件可能會被任何懶屬性全部載入。否則,每個屬性都按需載入。 | true | false |
<!-- 全局配置参数,需要时再设置 --> <settings> <!-- 打开延迟加载的开关 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 将积极加载改为消极加载即按需要加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
@Testpublic void findOrdersUserLazyLoadingTest() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); OrdersCustomMapper ordersCustomMapper=sqlSession.getMapper(OrdersCustomMapper.class); List<Orders> list=ordersCustomMapper.findOrdersUserLazyLoading();for (Orders orders : list) {//执行getUser()去查询用户信息,这里实现按需加载User user=orders.getUser(); System.out.println(user); } sqlSession.close(); }
以上是MyBatis延遲載入實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!