MyBatis——MyBatis的延迟加载

本文介绍了MyBatis框架中如何在一对一关联查询时启用延迟加载,以提高性能。通过User类和Account类的示例,展示了如何在UserMapper.xml中配置懒加载,并在测试中展示其效果。

MyBatis的延迟加载(一对多查询案例)

1.什么是延迟加载?

开启延迟加载后,在真正使用数据的时候才发起级联查询,不用的时候不查询。

2.pojo

User类:

package com.wt.pojo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    //加入List<Account>存储用户所拥有的账户
    private List<Account> accounts;

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

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

    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 + '\'' +
                ", accounts=" + accounts +
                '}';
    }
}

Account类:略

3.mapper

UserDao:

public interface UserDao {
    public List<User> findAll();
}

AccountDao:

public interface AccountDao {
    Account findAccountById(Integer id);
}

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="com.wt.dao.UserDao">
    <resultMap type="User" id="findAllResultMap">
        <id column="id" property="id"></id>
        <result column="username" property="username"/>
        <result column="address" property="address"/>
        <result column="sex" property="sex"/>
        <result column="birthday" property="birthday"/>
         <!--
          property:属性名
          ofType:泛型
          select: 要调用的 select 映射的 id
          column : 传递给 select 映射的参数
          fetchType="lazy":懒加载,默认情况下是没有开启延迟加载的
         -->
        <collection property="accounts" ofType="Account"
                    select="com.by.dao.AccountDao.findAccountById" column="id"
                    fetchType="lazy">	
        </collection>
    </resultMap>

    <select id="findAll" resultMap="findAllResultMap">
      select * from user
    </select>
</mapper>

AccountDao.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.wt.dao.AccountDao">
    <select id="findAccountById" parameterType="int" resultType="account">
        select * from account where uid = #{id}
    </select>
</mapper>

4.测试

    @Test
    public void testFindAll() {
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.findAll();
        for(User user : userList){
            System.out.println(user.getUsername());//不查询account
            System.out.println(user.getAccounts());//查询account
        }
    }

5.结果

不查询Account:
在这里插入图片描述
查询Account:
在这里插入图片描述

【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学与科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本原理与编程实现方法,重点聚焦于直流最优潮流模型的构建与求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现与学习。此外,文档还列举了大量与电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本原理与Matlab实现方法;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路与技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码与工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方法,并通过复现文中提到的多个案例,加深对电力系统优化问题建模与求解的理解。
### MyBatis 延迟加载配置及使用方法 #### 1. 全局延迟加载配置 MyBatis 提供了一个全局配置项来启用或禁用延迟加载功能。该配置位于 `mybatis-config.xml` 文件中,主要涉及两个参数:`lazyLoadingEnabled` 和 `aggressiveLazyLoading`。 - **`lazyLoadingEnabled`**: 控制是否开启延迟加载,默认值为 `false`。如果设置为 `true`,则会激活延迟加载机制。 - **`aggressiveLazyLoading`**: 当前已被废弃,在较新的版本中默认关闭激进模式。此参数决定属性未被访问时是否会触发加载操作[^1]。 以下是全局配置的示例: ```xml <settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings> ``` #### 2. 局部延迟加载配置 除了全局配置外,还可以针对具体的 SQL 映射文件进行局部调整。这通常通过 `<association>` 或 `<collection>` 标签内的 `fetchType` 属性完成: - **`fetchType="lazy"`**: 启用特定字段的延迟加载。 - **`fetchType="eager"`**: 关闭指定字段的延迟加载并立即执行查询。 下面是一个典型的 XML 配置片段展示如何定义关联对象以及其加载方式: ```xml <select id="selectUserWithPosts" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> <resultMap type="Post" id="postResultMap"> <id property="id" column="postId"/> <result property="title" column="postTitle"/> </resultMap> <association property="posts" javaType="List<Post>" resultMap="postResultMap" fetchType="lazy"/> ``` 上述代码表示当获取用户信息时不立刻加载帖子列表,而是在真正调用 `user.getPosts()` 方法时才发起额外请求去数据库读取相关内容[^2]。 #### 3. 加载顺序与注意事项 为了确保程序逻辑正确运行,开发者需要注意以下几个方面: - 如果存在复杂的嵌套关系,则可能需要多次网络交互才能完全填充整个对象图谱;因此建议仅对那些确实有必要减少初始加载量的部分实施懒加载策略。 - 某些情况下可能会遇到代理类生成失败或者无法序列化等问题,这时就需要重新审视设计方案是否存在不合理之处[^3]。 #### 示例代码演示 假设有一个简单的博客系统模型——每篇文章属于某个作者,并且每位作者可以撰写多篇文章。我们可以这样编写对应的 Mapper 接口和映射规则以支持文章详情页显示的同时按需加载评论区数据: ```java public interface ArticleMapper { @Select("SELECT * FROM articles WHERE article_id=#{articleId}") @Results({ @Result(id=true,property="articleId",column="article_id"), @Result(property="comments",column="article_id", many=@Many(select="findCommentsByArticleId",fetchType=FetchType.LAZY)) }) public Article getArticleById(int articleId); } @Select("SELECT * FROM comments WHERE article_id=#{articleId}") public List<Comment> findCommentsByArticleId(@Param("articleId") int articleId); ``` 以上 Java 注解形式同样实现了基于条件的选择性延后处理某些子集资源的需求[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值