1. 延遲加載
l 創建一個客戶類Customer和訂單類Order
l 創建客戶表t_customer和訂單表t_order
1.1 當查詢客戶時延遲加載訂單
第一步:在sqlMapConfig.xml中配置開啓延遲加載功能:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />
</settings>
<typeAliases>
<typeAlias type="mybatis.entity.TCustomer" alias="TCustomer" />
<typeAlias type="mybatis.entity.TOrder" alias="TOrder" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_day1" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/entity/TCustomerMapper.xml" />
<mapper resource="mybatis/entity/TOrderMapper.xml" />
</mappers>
</configuration>
第二步:在CustomerMapper.xml中配置第一個sql:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.dao.TCustomerMapper">
<resultMap id="BaseResultMap" type="TCustomer">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="age" jdbcType="INTEGER" property="age" />
</resultMap>
<resultMap type="TCustomer" id="customerWithOrder" extends="BaseResultMap">
<collection property="orders" ofType="TOrder" column="id"
select="mybatis.dao.TOrderMapper.queryByCustomerId" />
</resultMap>
<sql id="Base_Column_List">
id, name, age
</sql>
<select id="queryCustomerById" resultMap="customerWithOrder">
select
<include refid="Base_Column_List" />
from t_customer where id=#{id}
</select>
</mapper>
第三步:在OrderMapper.xml中配置第二個sql(延遲加載的sql)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.dao.TOrderMapper">
<resultMap id="BaseResultMap" type="TOrder">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="orderNumber" jdbcType="VARCHAR" property="ordernumber" />
<result column="price" jdbcType="DOUBLE" property="price" />
<result column="customer_id" jdbcType="INTEGER" property="customerId" />
</resultMap>
<sql id="Base_Column_List">
id, orderNumber, price, customer_id
</sql>
<select id="queryByCustomerId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"></include>
from t_order where customer_id=#{customer_id}
</select>
</mapper>
第四步:調用api查詢
@Test
public void queryCustomerTest() {
TCustomer customer = sqlSession.selectOne("mybatis.dao.TCustomerMapper.queryCustomerById", 1);
System.out.println(customer);
Set<TOrder> orders = customer.getOrders();
System.out.println(orders);
sqlSession.close();
}
1.2 當查詢訂單時延遲加載客戶
第一步:在sqlMapConfig.xml中開啓延遲加載功能
<settings>
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />
</settings>
第二步:在OrderMapper.xml中配置第一個sql,根據id查詢訂單表
<resultMap type="TOrder" id="orderWithCustomer" extends="BaseResultMap">
<association property="customer" column="customer_id" select="mybatis.dao.TCustomerMapper.queryById"/>
</resultMap>
<select id="queryByOrderId" resultMap="orderWithCustomer">
select
<include refid="Base_Column_List"></include>
from t_order where customer_id=#{customer_id}
</select>
第三步:在CustomerMapper.xml中配置第二個sql(延遲加載的sql)
<select id="queryById" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_customer where id=#{id}
</select>
第四步:使用api查詢:
@Test
public void queryOrderTest() {
TOrder order = sqlSession.selectOne("mybatis.dao.TOrderMapper.queryByOrderId", 1);
System.out.println(order);
TCustomer customer = order.getCustomer();
System.out.println(customer);
sqlSession.close();
}