Mybatis快速入门--映射文件(四)(优化版)

简介: Mybatis快速入门--映射文件(四)(优化版)

association


使用association定义关联的单个对象的封装规则

1、mapper接口


Account selectByResultMap(Integer id);

2、映射文件

property指定那个对象是联合的对象, javaType指定联合对象的类型(不能省略)


<resultMap id="resultMapTest" type="com.caq.study.entity.Account">
    <id column="id" property="id"></id>
    <result column="name" property="name"></result>
    <result column="money" property="money"></result>
    <association property="dept" javaType="com.caq.study.entity.Dept">
        <id column="id" property="id"></id>
        <result column="dept_name" property="departName"></result>
    </association>
</resultMap>
<select id="selectByResultMap" resultMap="resultMapTest">
    SELECT
        account.`id`,
        account.`name`,
        account.`money`,
        depart.`id`,
        depart.`dept_name`
    FROM
        `account`
            LEFT JOIN `depart` ON account.d_id = depart.id
    WHERE
        account.id = #{id}
</select>

3、测试


@Test
public void testResultMap() throws IOException {
    SqlSession sqlSession = getSqlSessionFactory().openSession();
    AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);
    Account account = accountMapper.selectByResultMap(1);
    System.out.println(account);
    sqlSession.commit();
    sqlSession.close();
}
Account(id=1, name=tom, money=5000.00, dept=Dept(id=1, departName=开发部))

上面这种查询方式可以理解为嵌套查询


分布查询


相当于查询account表的所有数据,查询到所有数据后,

再把和Dept有关联的字段传给DeptMapper接口

通过这种方式实现分布查询


mapper接口:
Account selectAssociate(Integer id);
映射文件:
<resultMap id="AsscociateTest" type="com.caq.study.entity.Account">
    <id column="id" property="id"></id>
    <result column="name" property="name"></result>
    <result column="money" property="money"></result>
    <association property="dept"
                 select="com.caq.study.mapper.DepartMapper.getDeptById"
                 column="d_id">
    </association>
</resultMap>
<select id="selectAssociate" resultMap="AsscociateTest">
    SELECT * from account where id = #{id}
</select>


mapper接口:
Dept getDeptById(Integer id);
映射文件:
<select id="getDeptById" resultType="com.caq.study.entity.Dept">
    select id,dept_name departName from depart where id = #{id}
</select>

测试


@Test
public void testAssociate() throws IOException {
    SqlSession sqlSession = getSqlSessionFactory().openSession();
    AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);
    Account account = accountMapper.selectAssociate(1);
    System.out.println(account);
    System.out.println(account.getDept());
    sqlSession.commit();
    sqlSession.close();
}
Account(id=1, name=tom, money=5000.00, dId=null, dept=Dept(id=1, departName=开发部))
Dept(id=1, departName=开发部)


延迟加载


上面的我们写的查询有什么问题呢?

就是部门信息我们无论需不需要它都会查询,这样很浪费资源

怎么解决这个问题呢?

==延迟加载!==

分段查询的基础上在mybatis主配置文件加上两个配置

显示的指定每个我们需要更改的配置的值,即使他是默认的

log4j

做延迟加载前,为了看效果我们加上log4j查看控制台的日志

1、使用Log4j需要导入相关的jar包 (这里是Maven中的依赖包):


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2、使用log4j


<settings>
    <!--标准日志工厂实现-->
    <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
    <!---Log4j工厂实现-->
    <setting name="logImpl" value="LOG4J"/>
</settings>

3、log4j.properties


log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=./log/Gosion.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=5
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

测试延迟加载

==未开启==

image.png

==开启==


<settings>
    <setting name="logImpl" value="LOG4J"/>
    <setting name="jdbcTypeForNull" value="NULL"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

image.png



相关文章
|
3月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
18天前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
103 5
|
3月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
3月前
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
90 6
|
3月前
|
Java 数据库连接 mybatis
MyBatis篇-映射关系(1-1 1-n n-n)
本文介绍了MyBatis中四种常见关系映射的配置方法,包括一对一、一对多、多对一和多对多。**一对一**通过`resultMap`实现属性与字段的映射;**一对多**以用户-角色为例,使用`&lt;collection&gt;`标签关联集合数据;**多对一**以作者-博客为例,利用`&lt;association&gt;`实现关联;**多对多**则通过引入第三方类(如UserForDept)分别在User和Dept类中添加集合属性,并配置对应的`&lt;collection&gt;`标签完成映射。这些方法解决了复杂数据关系的处理问题,提升了开发效率。
|
6月前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
429 13
|
6月前
|
XML Java 数据库连接
Mybatis映射关系
简介:本文介绍了MyBatis框架中四种常见的关系映射方式,包括一对一、一对多、多对一及多对多。一对一通过简单属性映射实现;一对多通过在主对象中添加集合属性并使用`&lt;collection&gt;`标签映射子对象集合;多对一则利用`&lt;association&gt;`标签在主对象中映射单个子对象;多对多需引入第三方类,分别在两个主对象中添加对方的集合属性,并通过`&lt;collection&gt;`标签实现映射。
125 32
|
7月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
7月前
|
SQL Java 数据库连接
MyBatis-Plus快速入门:从安装到第一个Demo
本文将带你从零开始,快速入门 MyBatis-Plus。我们将首先介绍如何安装和配置 MyBatis-Plus,然后通过一个简单的示例演示如何使用它进行数据操作。无论你是 MyBatis 的新手还是希望提升开发效率的老手,本文都将为你提供清晰的指导和实用的技巧。
2383 0
MyBatis-Plus快速入门:从安装到第一个Demo
|
9月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用