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