Mybatis配置延迟加载

本文介绍了如何在Mybatis中配置延迟加载,包括全局配置、mapper配置、依赖cglib包的引入,以及通过测试验证延迟加载的效果,并提供了相关参考文章链接。

全局配置:

<?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>
	<!-- 加载资源文件 -->
	<properties resource="jdbc.properties"/>
	
	<!-- 全局配置,驼峰规则,默认不开启,结果值null -->
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
		<!-- 打开延迟加载的开关 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		<!-- 将积极加载改为消息加载即按需加载 -->
	 	<setting name="aggressiveLazyLoading" value="false"/>
	</settings>

	<!-- 简化类,起别名 -->
	<typeAliases>
		<typeAlias type="com.swliu.yhmis.pojo.Order" alias="Order"/>
		<typeAlias type="com.swliu.yhmis.pojo.Door" alias="door"/>
		<typeAlias type="com.swliu.yhmis.pojo.OrderDetail" alias="OrderDetail"/>
	</typeAliases>
	
	<!-- 配置环境、事务、数据源、映射文件 -->
	<environments default="test">
		<environment id="test">
			<!-- 支持两种类型:JDBC/MANAGE -->
			<transactionManager type="JDBC"/>
			<!-- 数据源:POOLED/UNPOOLED/JNDI -->
			<dataSource type="POOLED">
				<property name="driver" value="${driver}"/>
				<property name="url" value="${url}"/>
				<property name="username" value="${username}"/>
				<property name="password" value="${password}"/>
			</dataSource>
		</environment>
	</environments>
	
	<!-- 告诉mybatis映射文件存在 -->
	<mappers>
		<mapper class="com.swliu.yhmis.pojo.OrderMapper"/>
	</mappers>
</configuration>

 mapper配置:

<?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="com.swliu.yhmis.pojo.OrderMapper">
	<!-- 订单的映射 autoMapping自动映射和驼峰规则全局设定来配合 -->
	<resultMap type="Order" id="orderResultMap" autoMapping="true">
		<!-- 主键 -->
		<id property="id" column="id"/>
		<!-- 对一,一个订单所属一个门店
			property 关联对象中声明的名称
			javaType 关联对象它对应对象类
			select 指的另外查询标签id
			column 当前表中对应外键
		 -->
		<association property="door" select="getDoorInfo" column="door_id" javaType="Door" autoMapping="true"/>
		<!-- 对多,一个订单有多个订单详情
			property pojo中配置的属性名称
			ofType 集合元素类型
			个人感觉:orderDetails无主表order的外键不适用于懒加载
			<collection property="orderDetails"  ofType="OrderDetail" autoMapping="true"/>
		 -->
		
	</resultMap>
	<!-- 查询某个订单,包含门店信息,包含订单详情信息 -->
	<select id="get" parameterType="int" resultMap="orderResultMap">
		select id,door_id,order_no,order_type,person_num,
			   cashier,create_time,end_time,payment_type,price
		from tb_order where id=#{pid}	
	</select>
	<!-- 查询某个订单对应门店信息 -->
	<select id="getDoorInfo" parameterType="int" resultType="door">
		select * from tb_door where id=#{id}	
	</select>
	
</mapper>




 导入cglib包:

<dependency>
	<groupId>cglib</groupId>
	<artifactId>cglib</artifactId>
	<version>3.1</version>
</dependency>		

测试延迟加载:

package yhmis;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.swliu.yhmis.pojo.Door;
import com.swliu.yhmis.pojo.Order;
import com.swliu.yhmis.pojo.OrderDetail;
import com.swliu.yhmis.pojo.OrderMapper;

public class OrderTest {
	//成员变量,线程安全的
	private SqlSessionFactory factory;
	
	@Before	//获取factory
	public void init() throws IOException{
		InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
		factory = new SqlSessionFactoryBuilder().build(is);
	}
	
	@Test	//查询某个订单
	public void get(){
		SqlSession session = factory.openSession();
		OrderMapper mapper = session.getMapper(OrderMapper.class);
		Order order = mapper.get(10);
		System.out.println("订单信息:"+order.getId()+" "+order.getDoorId());
		Door door = order.getDoor();
		System.out.println("门店信息:"+door.getId()+" "+door.getName());
//		List<OrderDetail> orderDetails = order.getOrderDetails();
//		for (OrderDetail orderDetail : orderDetails) {
//			System.out.println("订单详情信息:"+orderDetail.getId()+" "+orderDetail.getItem());
//		}
		System.out.println("订单汇总信息:"+order);
	}
}





 

 打印信息:

2022-07-08 12:55:51,441 [main] DEBUG [com.swliu.yhmis.pojo.OrderMapper.get] - ==>  Preparing: select id,door_id,order_no,order_type,person_num, cashier,create_time,end_time,payment_type,price from tb_order where id=? 
2022-07-08 12:55:51,513 [main] DEBUG [com.swliu.yhmis.pojo.OrderMapper.get] - ==> Parameters: 10(Integer)
2022-07-08 12:55:51,685 [main] DEBUG [com.swliu.yhmis.pojo.OrderMapper.get] - <==      Total: 1
订单信息:10 null
2022-07-08 12:55:51,685 [main] DEBUG [com.swliu.yhmis.pojo.OrderMapper.getDoorInfo] - ==>  Preparing: select * from tb_door where id=? 
2022-07-08 12:55:51,685 [main] DEBUG [com.swliu.yhmis.pojo.OrderMapper.getDoorInfo] - ==> Parameters: 1(Integer)
2022-07-08 12:55:51,701 [main] DEBUG [com.swliu.yhmis.pojo.OrderMapper.getDoorInfo] - <==      Total: 1
门店信息:1 永和大王(北三环西路店)
订单汇总信息:Order [door=Door [id=1, name=永和大王(北三环西路店), tel=110-62112313], orderDetails=null, id=10, doorId=null, orderNo=P000011, orderType=堂食, personNum=1, cashier=张静, createTime=Fri Jun 15 11:25:11 CST 2018, endTime=Tue Apr 17 07:24:38 CST 2018, paymentType=微支付, price=8.0]

参考文章:MyBatis懒加载(延迟加载)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值