MyBatis 延迟加载代码详解

在我们的实际开发中,会面临各种各样的查询操作。如果单表查询能满足业务需求。尽量用单表查询,因为单表查询的效率比多表关联查询快。

那么当业务需求需要用到的数据来源于多张表的时候,单表查询无法解决,Mybatis 为我们引入了延迟加载的概念。

操作前,我们需要先把 log4j 整合到 mybatis 上,我们需要如下的一些操作。

第一步,编写 log.properties 文件

log4j.rootLogger=DEBUG,Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO
复制代码

第二步,在 mybatis 核心配置文件中配置 log4j

<settings>
    <setting name="logImpl" value="LOG4J" />
</settings>
复制代码

第三步,导入 log4j 的依赖

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
</dependency>
复制代码

先来看一下我们的表结构,两张表,一张表是用户登录的信息表,结构如下:  
一张是发贴表,结构如下:  
登陆表的 username 字段作为发帖表的 uid 的外键。

接下来,我们来操作延迟加载,场景是根据主键查询发贴表,级联查询登陆表中的登陆用户的信息。

第一步,在 mybatis 核心配置文件中配置延迟加载

<settings>
    <!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--关闭积极加载-->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
复制代码

第二步,在查询接口中添加添加方法

@Repository
public interface LoginDao {
    public TieInfo getTieInfoById(Integer id);
复制代码

第三步,在 mapper.xml 文件中配置查询

<select id="getTieInfoById" parameterType="integer" resultMap="tieInfoPro">
    select * from tieInfo where id = #{id}
</select>

<resultMap id="tieInfoPro" type="tieInfo">
    <id column="id" property="id"></id>
    <result column="theme" property="theme"></result>

    <association property="loginUser" column="uid" select="selectUser"></association>
</resultMap>

<select id="selectUser" resultType="loginuser">
    select * from loginuser where username = #{uid}
</select>
复制代码

接下来,我们进行查询,如果只进行发贴表对象或者是其中的部分对象,我们发现 sql 语句只会执行一条,即外部查询

如果查询的对象或者字段来源于两个对象,那么 sql 就会按照延迟加载的方案,执行两个 sql 语句

posted @   可爱的小锋  阅读(159)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示