MyBatis懶載入
阿新 • • 發佈:2019-02-09
resultMap可以實現高階對映,即使用association和collection實現一對一、一對多的對映,association和collection具備懶載入的功能。懶載入可以提高資料庫效能,MyBatis延遲載入的策略是先從單表查詢然後再從關聯表查詢,這樣可以大大提高資料庫效能,單表查詢要比關聯查詢多張錶速度要快。
1、資料庫設計
user使用者表
orders訂單表
orders訂單表外來鍵
2、需求
查詢訂單表,並且關聯使用者資訊
3、SQL語句
4、實現
4.1、在MyBatis配置檔案SqlMapConfig.xml中新增全域性引數
4.2、在OrdersMapper.xml檔案中新增resultMap<settings> <!-- 開啟延遲載入的開關 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 將積極載入改為消極載入即按需要載入 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
4.3、select中引用resultMap<!-- 延遲載入的resultMap --> <resultMap type="org.mybatis.demo.po.Orders" id="OrdersUserLazyLoadingResultMap"> <!--對訂單資訊進行對映配置 --> <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" /> <!-- 實現對使用者資訊進行延遲載入 select:指定延遲載入需要執行的statement的id(是根據user_id查詢使用者資訊的statement) ,如果findUserById不在本mapper中需要前邊加namespace column:訂單資訊中關聯使用者資訊查詢的列,是user_id,即外來鍵--> <association property="user" javaType="org.mybatis.demo.po.User" select="org.mybatis.demo.mapper.OrdersMapper.findUserById" column="user_id"> </association> </resultMap>
4.4、建立OrdersMapper介面關聯OrdersMapper.xml<select id="findUserById" parameterType="int" resultType="org.mybatis.demo.po.User"> SELECT * FROM USER WHERE id=#{value} </select> <!-- 查詢訂單關聯查詢使用者,使用者資訊需要延遲載入 --> <select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap"> SELECT * FROM orders </select>
package org.mybatis.demo.mapper;
import java.util.List;
import org.mybatis.demo.po.Orders;
public interface OrdersMapper {
public List<Orders> findOrdersUserLazyLoading();
}
4.5、測試package org.mybatis.demo.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.demo.mapper.OrdersMapper;
import org.mybatis.demo.po.Orders;
public class TestMyBatis {
private SqlSessionFactory sessionFactory;
@Before
public void createSqlSessionFactory() throws IOException {
//引入配置檔案
String resource = "SqlMapConfig.xml";
InputStream ins = Resources.getResourceAsStream(resource);
//建立SqlSession物件
sessionFactory = new SqlSessionFactoryBuilder().build(ins);
}
@Test
public void test1() {
SqlSession session = null;
try {
session = sessionFactory.openSession();
OrdersMapper mapper = session.getMapper(OrdersMapper.class);
List<Orders> list = mapper.findOrdersUserLazyLoading();
for(Orders order : list){
System.out.println(order.getUser().getUsername() + " 在 " +order.getCreatetime() + " 提交了訂單");
}
} finally {
if(session != null){
session.close();
}
}
}
}
4.6、原始碼