写点什么

MyBatis 延迟加载代码详解

作者:千锋IT教育
  • 2022-11-18
    北京
  • 本文字数:1087 字

    阅读完需:约 4 分钟

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

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

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

第一步,编写 log.properties 文件

log4j.rootLogger=DEBUG,Consolelog4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%nlog4j.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>复制代码
复制代码

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

@Repositorypublic 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 语句



用户头像

国内IT培训机构良心品牌 2022-08-02 加入

学习资料下载获取,添加QQ:3547925594

评论

发布
暂无评论
MyBatis 延迟加载代码详解_千锋IT教育_InfoQ写作社区