Mybatis 的使用 (6) 延遲加載

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();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章