【08】Mybatis笔记--延时加载

【08】Mybatis笔记–延时加载

一、概念:

1)延时加载
  • 只有在需要数据的时候才进行查询,不用的时候不查询。(懒加载
  • 比如:当只需查询所有商品的分类时,不必把分类对象里面的商品集合全都查出来

2)立即加载
  • 就是方法一调用,就会立刻查询出对象内所有数据

3)各种表关系中,一般采用哪种加载?
  1. 一对多,多对多:通常采用延时加载
  2. 多对一,一对一:通常采用立即加载

二、Mybatis如何配置延时加载?

  • 一对一
  • 一对多
1)一对一关系配置:

步骤:

1 先在主配置文件里面开启延时加载

<!--开启延时加载-->
<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

2 环境准备:

数据表:用户表(User),账户表(Account)。 一个用户可有多个账户

要求:查询所有账户,并且查询出账户所属用户(延时

映射配置文件:AccountDao.xml

<association>标签内配置select属性,属性值:是指获取用户唯一标识的方法。

column属性中配置的是select配置的方法所需要的参数值。

注,这里要查询账户,账户里面的User对象是延时加载,然后,select配置的就是UserDao中获取User对象的方法。

UserDao.java和Account.java

public interface UserDao {

    /**
     * 查询所有用户,同时获取用户下所有账户信息
     * 一对多:延时加载
     * @return
     */
    List<User> list();

    /**
     * 查询用户根据id
     * @param id
     * @return
     */
    User get(Integer id);
}

//为显示方便,就放在一起了。实际是单独的文件
public interface AccountDao {

    /**
     * 查询所有账户
     * @return
     */
    List<Account> list();

    /**
     * 根据id获取
     * @param id
     * @return
     */
    Account get(Integer id);

    /**
     * 根据uid获取账户集
     */
    List<Account> findByUid(Integer uid);
}


映射配置文件:

<?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="indi.xu.dao.AccountDao">
    
    <resultMap id="AccountMap" type="Account">
        <!--主键字段对应-->
        <id property="id" column="id"></id>
        <!--非主键字段对应-->
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>

        <!--一对一的关系映射,配置封装user的内容-->
        <!--就是在副表里面添加主表对象,以获取主表内容
            column:指的是与主表关联的外键
            javaTyep:指的是主表对应的实体类
            property:副表实体类里面主表对象名

            配置延时加载
            select:获取用户唯一标识的方法。在UserDao中。
            column:提供的能获取User的id值   (用户根据id查询时,所需要的参数的值
        -->
        <association property="user" column="uid" javaType="user" select="indi.xu.dao.UserDao.get">
        </association>
    </resultMap>

    <!--查询所有账户同时包含用户名和地址信息-->
    <select id="list" resultMap="AccountMap">
        select * from account
    </select>

    <select id="get" resultType="Account" parameterType="int">
        select * from account where uid = #{uid}
    </select>

</mapper>

测试类:

( 这里只调用list()方法的时候,只会执行select * from account这条SQL语句,在account.getUser(),就会根据上面配置的column中的值查询User对象,这就是延时加载)

@org.junit.Test
    public void testAccount(){
        List<Account> list = accountDao.list();
        /*for (Account account : list) {
            System.out.println(account.getUser());
        }*/
    }


2)一对多关系配置:

要求:查询所有用户,及其所拥有的账户(延时

步骤上面类似

<collection>标签里面配置select属性。是获取Account对象的方法

UserDao.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="indi.xu.dao.UserDao">

    <resultMap id="userAccountMap" type="user">
        <id property="id" column="id"></id>

        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>

        <!--主附表一对多体现-->
        <!--配置user对象中accounts集合的映射
            ofType:指的是集合元素类型,要写全限定类名。(这里使用了别名
            column:使用的是用户的id去查找
        -->
        <collection property="accounts" ofType="account" select="indi.xu.dao.AccountDao.findByUid" column="id">
        </collection>
    </resultMap>

    <!-- 查询所有-->
    <select id="list" resultMap="userAccountMap">
        SELECT * from user;
    </select>

    <!--查询一个-->
    <select id="get" parameterType="Integer" resultType="user">
        select * from user where id = #{id}
    </select>

</mapper>


三、总结:

延时加载就是 在需要数据的时候,使用对方配置文件中的获取唯一对象的<select>配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值