在我们的实际开发中,会面临各种各样的查询操作。如果单表查询能满足业务需求。尽量用单表查询,因为单表查询的效率比多表关联查询快。
那么当业务需求需要用到的数据来源于多张表的时候,单表查询无法解决,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 语句
评论