MyBatis分步查詢及懶載入
阿新 • • 發佈:2018-12-29
分步查詢:
兩個pojo類:
package com.itlike.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@[email protected]@ToString
public class Customer {
private Integer cust_id;
private String cust_name;
private String cust_profession;
private String cust_phone;
private String email;
}
package com.itlike.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@ [email protected]@ToString
public class Order {
private Integer order_id;
private String order_name;
private String order_num;
private Customer customer;
}
資料庫中相對應的表為customer和order order中的外來鍵指向customer中的主鍵
分步查詢:
在OrderMapper介面中定義一個方法:
public Order getOrderWithId(Integer id);
OrderMapper.xml中的SQL語句:
<resultMap id="resultmap2" type="Order"> <id property="order_id" column="order_id"/> <result property="order_name" column="order_name"/> <result property="order_num" column="order_num"/> <!--分步查詢--> <association property="customer" javaType="Customer" select="com.itlike.mapper.CustomerMapper.getCustomerById" column="cust_id" ></association> </resultMap> <select id="getOrderWithId" resultMap="resultmap2"> select * from `order` where order_id=#{id} </select>
隨後在CustomerMapper介面中定義方法
public Customer getCustomerById(Integer id);
在CustomerMapper.xml中寫查詢SQL
<select id="getCustomerById" resultType="com.itlike.domain.Customer">
select * from `customer` where cust_id=#{id};
</select>
注意OrderMapper.xml中的分步查詢id和CustomerMapper.xml中的select id 對應。
懶載入
MyBatis中的分步查詢支援懶載入
在SqlMappingConfig.xml 核心配置檔案中,設定開啟懶載入
<setting name="lazyLoadingEnabled" value="true"/>
在測試類中,查詢一條訂單
public void test3(){
SqlSession sqlSession = MyBatisUtils.openSession();
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
Order order = mapper.getOrderWithId(2);
sqlSession.close();
}
因為只是查詢訂單資訊,並沒有查詢關聯物件的資訊,並且開啟了懶載入,所以MyBatis只向資料庫傳送一條SQL語句
列印結果:
==> Preparing: select * from `order` where order_id=?
==> Parameters: 2(Integer)
<== Columns: order_id, order_name, order_num, cust_id
<== Row: 2, 訂單名稱2, 10002, 3
<== Total: 1
當用到訂單的關聯物件的屬性時,會想資料庫傳送兩條SQL語句。
其次,還有一種屬性設定為: <!--當開啟時,任何方法的呼叫都會載入該物件的所有屬性。否則,每個屬性會按需載入--> <setting name="aggressiveLazyLoading" value="true"/>
設定該屬性後,雖然沒有用到關聯物件的屬性,但只要呼叫了方法,就會載入關聯物件,即傳送兩條SQL語句
public void test3(){
SqlSession sqlSession = MyBatisUtils.openSession();
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
Order order = mapper.getOrderWithId(2);
//只用到了訂單的name,沒有用到關聯物件的屬性
//但是隻要呼叫了方法,就會發送兩條SQL即查詢訂單的關聯物件(客戶)
System.out.println(order.getOrder_name());
sqlSession.close();
}
列印結果:
==> Preparing: select * from `order` where order_id=?
==> Parameters: 2(Integer)
<== Columns: order_id, order_name, order_num, cust_id
<== Row: 2, 訂單名稱2, 10002, 3
<== Total: 1
==> Preparing: select * from `customer` where cust_id=?;
==> Parameters: 3(Integer)
<== Columns: cust_id, cust_name, cust_profession, cust_phone, email
<== Row: 3, 阿軻, 刺客, 18977665997, [email protected]
<== Total: 1
訂單名稱2