mybatis学习教程中级(八)延迟加载

  1. 云栖社区>
  2. 博客>
  3. 正文

mybatis学习教程中级(八)延迟加载

ycy蓝码 2015-09-10 10:50:10 浏览481
展开阅读全文

1 引言

查询数据库时候,尽量使用单表查询提示性能,快啊~~~~~但是如果有多表联合和,那就可以使用延迟记载。首先说,在没得余地的情况下试用,是有点优势。
可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。
例子:一开始查询单表Student ,当需要班级class时候,再查询class信息

2、实现mybatis延迟加载

 2.1设置延迟加载

设置项

描述

允许值

默认值

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

true | false

false

aggressiveLazyLoading

当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载

true | false

true

mybatis提供延迟加载,通过配置resultMap实现
 2.2mapper.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">
<!--命名空间:分类管理sql隔离,方便管理-->
<mapper namespace="com.ycy.mybatis.dao.OrdersCustomMapper">
    <!--查询订单  一对多关联(订单与订单详情)-->
    <select id="findOrderAndUserLazyLoding" resultMap="orderAndUserLazyLodingMap" >
        SELECT
        o.*
        FROM
        orders o
    </select>
    <!--查询订单-用户 延迟加载  一对多关联(订单与订单详情)-->
    <resultMap id="orderAndUserLazyLodingMap" type="com.ycy.mybatis.module.Orders">
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <association property="user" select="com.ycy.mybatis.dao.UserMapper.getUserById" column="user_id">
        </association>
    </resultMap>
</mapper>

UserMapper的查询方法

<?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">
<!--命名空间:分类管理sql隔离,方便管理-->
<mapper namespace="com.ycy.mybatis.dao.UserMapper">
   
    <!--id标示一个sql语句,一个Statement,封装为一个MapperStatement-->
    <!--parameterType:传入参数类型;resultType:输出结果类型,指定映射的pojo-->
    <select id="getUserById" parameterType="int" resultType="User">
         SELECT  * FROM USER WHERE id=#{id}
        </select>
  
</select>
  

</mapper>


2.2mapper.java

package com.ycy.mybatis.dao;
import com.ycy.mybatis.module.Orders;
import java.util.List;
/**
 * Created by Administrator on 2015/9/9 0009.
 */
public interface OrdersCustomMapper {
   //一对一延迟加载
   public List<Orders> findOrderAndUserLazyLoding() throws  Exception;

}
 2.3延迟加载测试

在测试时候断点到输出11的地方,看看里面是否加载user,然后再往下走,看看是否加载user。直达你加载user的时候才会调用延迟加载,另外开始查询。

package com.ycy.mybatis.test;

import com.ycy.mybatis.dao.OrdersCustomMapper;
import com.ycy.mybatis.module.Orderdetail;
import com.ycy.mybatis.module.Orders;
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;
import java.util.List;

/**
 * Created by Administrator on 2015/8/31 0031.
 */
public class MybatisTest8 {
    private SqlSessionFactory sqlSessionFactory = null;
    @Before
    public void  before() throws IOException {
        String resource="SqlMapConfig.xml";
        InputStream in = Resources.getResourceAsStream(resource);
        sqlSessionFactory= new SqlSessionFactoryBuilder().build(in);
    }
    //一对一 订单-用户详情
    @Test
    public  void findOrderAndDetail() throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        OrdersCustomMapper ordersCustomMapper=     sqlSession.getMapper(OrdersCustomMapper.class);
        List<Orders>  ordersList=  ordersCustomMapper.findOrderAndUserLazyLoding();
        System.out.println(11);
        for (Orders ordersCustom : ordersList) {
            System.out.println(ordersCustom.getUser().getUsername());
        }
        sqlSession.close();
    }
}

2、resultMap、ResultType、延迟加载总结

1、延迟加载:延迟加载实现的方式多种多样,在只查询单表就能满足需求时候,再查询其他信息,提供数据库查询性能时候使用延迟加载。一般在mvc的service层实现。例如:假想一个OrderService,查询用户信息时候使用延迟加载,这样就避免开启多个查询去查询user信息。但是:然并卵,你也可以一起把你需要的信息直接联合查询出来。

        List<Orders>  ordersList=  ordersCustomMapper.findOrderAndUserLazyLoding();
        System.out.println(11);
        for (Orders ordersCustom : ordersList) {
            System.out.println(ordersCustom.getUser().getUsername());
        }

2、resultType

作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历listlist中是pojo)即可。

3、resultMap

使用associationcollection完成一对一和一对多高级映射

association作用:将关联查询信息映射到一个pojo类中。

场合:为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。

collection作用:将关联查询信息映射到一个list集合中。

场合:为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list


网友评论

登录后评论
0/500
评论
ycy蓝码
+ 关注