Mybatis学习(延迟加载)

延迟加载

延迟加载
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.
好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速
度要快。
坏处:
因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗
时间,所以可能造成用户等待时间变长,造成用户体验下降。

需求:

查询账户(Account)信息并且关联查询用户(User)信息。如果先查询账户(Account)信息即可满足要
求,当我们需要查询用户(User)信息时再查询用户(User)信息。把对用户(User)信息的按需去查询就是延迟加
载。

实现

实体类

//用户实体类
public class User implements Serializable {
    private  Integer id;
    private  String username;
    private Date birthday;
    private  String sex;
    private  String address;

    private List<Account> accounts;

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }

    public User() {
        super();
    }

    public User(Integer id, String username, Date birthday, String sex, String address) {
        this.id = id;
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

//账户实体类
public class Account implements Serializable {
    private Integer aid;
    private  Integer uid;
    private double  money;
    private  User user;
    public Integer getAid() {
        return aid;
    }
    public void setAid(Integer aid) {
        this.aid = aid;
    }
    public Integer getUid() {
        return uid;
    }
    public void setUid(Integer uid) {
        this.uid = uid;
    }
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String toString() {
        return "Account{" +
                "aid=" + aid +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}

持久层dao


public interface AccountMapper {
    //查询所有账户信息
    List<Account> findAll();
    //根据用户id,来查询与之对应的账户信息
    List<Account> findByUid(Integer uid);
}

配置

mybatis-config.xml

	<settings>
        <!--开启mybatis支持全局延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

    <typeAliases >
    <typeAlias type="zlb.domain.User" alias="user"></typeAlias>
        <typeAlias type="zlb.domain.Account" alias="account"></typeAlias>
</typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--mysql8以上版本url:需添加如下代码-->
                <!--?useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC-->
                <property name="url"    value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC"/>
                <property name="username"   value="root"/>
                <property name="password" value="151630"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="zlb/dao/UserMapper.xml"></mapper>

        <mapper resource="zlb/dao/AccountMapper.xml"></mapper>
    </mappers>

AccountMapper.xml

<mapper namespace="zlb.dao.AccountMapper">
    <!--定义Account的ResultMap-->
    <resultMap id="accountUserMap" type="zlb.domain.Account">
       <id property="aid" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <association property="user" column="uid" javaType="user" select="zlb.dao.UserMapper.findById">
        </association>
    </resultMap>
    <!--查询所有-->
    <select id="findAll" resultMap="accountUserMap">
        select  * from account
    </select>
	 <!--根据用户id查询账户信息-->
    <select id="findByUid" resultType="account" parameterType="int">
        select * from account where UID=#{uid}
    </select>

</mapper>

测试

@Test
    public  void test01() {
        List<Account> accounts = mapper.findAll();
        for (Account account : accounts) {
            System.out.println("每个count对应的信息");
            System.out.println("账户 "+account);
            System.out.println("账户对应的用户 "+account.getUser());
            System.out.println("=========");
        }
        sqlSession.close();
    }

没开启延迟配置结果
在这里插入图片描述
开始延迟配置后结果
在这里插入图片描述

UserMapper.xml

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="zlb.dao.UserMapper">
    <resultMap id="userMap" type="user">
        <!--定义User的ResultMap-->
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
          <!--配置User中的accounts集合的映射-->
        <collection property="accounts" ofType="account"
                    select="zlb.dao.AccountMapper.findByUid" column="id">
        </collection>
    </resultMap>
    <!--一对多查询-->
    <!--查询所有-->
    <select id="findAll" resultMap="userMap">
        select * from user
    </select>
    <!--根据id查询一个-->
    <select id="findById" resultType="user" parameterType="int">
        select  * from user where id=#{id}
    </select>
</mapper>

测试

 @Test
    public  void test01() {
        List<User> users = mapper.findAll();
        for (User user : users) {
            System.out.println("每个用户的信息");
            System.out.println("用户 "+user);
            System.out.println("用户所有的账户 "+user.getAccounts());
            System.out.println("============");
        }
        sqlSession.close();
    }

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值