分步查询:
两个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