1. 程式人生 > >MyBatis分步查詢及懶載入

MyBatis分步查詢及懶載入

分步查詢

兩個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