MyBatis分步查询及懒加载

分步查询

两个pojo类:

package com.itlike.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter@Getter@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;

@Setter@Getter@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

猜你喜欢

转载自blog.csdn.net/weixin_43014205/article/details/85263135
今日推荐