Mybatis --09.mybatis延时加载

版权声明:转载请注明原始链接 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());
    }
}

3、延时加载使用方式二(Collection实现)

猜你喜欢

转载自blog.csdn.net/sswqzx/article/details/83820227