版权声明:转载请注明原始链接 https://blog.csdn.net/sswqzx/article/details/83820227
1、概述
立即加载:不管用不用,马上查询。
延迟加载:等到用的时候才真正发起查询。
一对一查询时、当查询Order表时和User或OrderDetail表查询分开、只有当我们需要Order中的User或OrderDetail时、
才会去查询User或OrderDetail
2、延时加载使用方式一(assocation实现)
2.1、Dao层接口UserMapperTable.java
package com.sswblog.dao;
import com.sswblog.domain.Order;
import org.apache.ibatis.annotations.Param;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 21:16 2018/11/6
*/
public interface UserMapperTable {
/**
* 延时加载
* @param orderNumber
* @return
*/
public Order findOrderUserByNumberLazy(@Param("orderNumber")String orderNumber);
}
2.2、持久层接口映射文件UserMapperTable.xml
<?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.sswblog.dao.UserMapperTable">
<!--延时加载-->
<resultMap id="userMap4" type="Order" autoMapping="true">
<id column="id" property="id" />
<!--mybatis主配置文件没有开启驼峰、这里就要加上result-->
<result column="order_number" property="orderNumber"/>
<!--association:一对一映射-->
<!--property:order类中关联的另一个属性名-->
<!--javaType:order类中关联的另一个属性的类型-->
<!--autoMapping:开启自动映射-->
<!-- 也可以这么写。对应的接口里添加findById -->
<!--select: 填写我们要调用的 select 映射的 id column : 填写我们要传递给 select 映射的参数-->
<!--<association property="user" javaType="user" select="com.sswblog.dao.UserMapperTable.findById" column="uid">-->
<!--</association>-->
<association property="user" javaType="User" autoMapping="true" column="user_id" select="queryUser">
<id column="user_id" property="id" />
<result column="user_name" property="userName" />
</association>
</resultMap>
<!--根据订单号查询订单信息以及订单所属的用户/一对一查询tb_order和tb_user表-->
<select id="findOrderUserByNumberLazy" resultMap="userMap4">
select * from tb_order where order_number = #{orderNumber}
</select>
<select id="queryUser" resultType="User">
select * from tb_user where id = #{id}
</select>
<!--对应接口中findById-->
<!--<select id="findById" resultType="User">-->
<!--select * from tb_user where id = #{uid}-->
<!--</select>-->
</mapper>
2.3、mybatis核心配置文件mybatis-config.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>
<!--引入外部属性资源文件-->
<properties resource="jdbc.properties"/>
<settings>
<!--开启驼峰、让实体类的属性和数据库中的键一一映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--开启延时加载-->
<setting name="lazyLoadingEnabled" value="true" />
</settings>
<!--开启别名-->
<typeAliases>
<!--<typeAlias type="com.sswblog.domain.User" alias="User" />-->
<package name="com.sswblog.domain"/>
</typeAliases>
<!--
environments标签:用于配置多个环境(测试环境、生产环境)
default属性:默认环境的id
environment标签:配置一个具体的环境
id属性:一个具体环境的id
transactionManager标签:指定事务的类型
type属性:可以取的值有:JDBC|MANAGED
JDBC:表示从数据源获取数据库连接来提交或回滚事务
MANAGED:表示把事务交给容器来管理,一般不用
dataSource标签:配置数据源
type属性:指定数据源类型,可以取的值有:UNPOOLED|POOLED|JNDI
UNPOOLED:无连接池的数据源,每次都重新获取数据库连接,使用完后关闭连接
POOLED:带连接池的数据源
JNDI:使用JNDI数据源
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--指定驱动类名-->
<property name="driver" value="${jdbc.driverClass}"/>
<!-- 指定连接地址 -->
<property name="url" value="${jdbc.url}"/>
<!-- 指定用户名 -->
<property name="username" value="${jdbc.username}"/>
<!-- 指定密码 -->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="UserMappers.xml"></mapper>
<mapper resource="UserDaoMappers.xml"></mapper>
<mapper resource="CommonSql.xml"></mapper>
<mapper resource="UserMapperTable.xml"></mapper>
<!--<mapper resource="UserMapper.xml"></mapper>-->
</mappers>
</configuration>
2.3、测试类
package com.sswblog.test;
import com.sswblog.dao.UserMapperTable;
import com.sswblog.domain.Order;
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 java.io.IOException;
import java.io.InputStream;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 21:16 2018/11/6
*/
public class UserMapperTableTest {
private UserMapperTable userMapperTable = null;
@Before
public void setup() throws IOException {
//读取mybatis核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//
userMapperTable = sqlSession.getMapper(UserMapperTable.class);
}
/**
* 延时加载
*/
@Test
public void findOrderUserByNumberLazy(){
Order order = userMapperTable.findOrderUserByNumberLazy("20140921002");
System.out.println(order.getOrderNumber());
System.out.println(" ============= ");
System.out.println(order.getUser());
}
}