【MyBatis框架】MyBatis中的延时加载和逆向工程

MyBatis中的延时加载

在操作数据库时,尽量查询单表,因为查询单表的效率最高。但很多时候难免要进行多表查询,这时使用延迟加载,就可以提高关联查询的效率。并且延迟加载只能使用resultMap。

配置延时加载

在全局配置XML文件的setting配置中开启懒加载模式

<settings>
    <!--懒加载配置-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
设置名描述有效值默认值
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。true / falsefalse
aggressiveLazyLoading开启时,任一方法的调用都会加载该对象的所有延迟加载属性.否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。true / falsefalse (在 3.4.1 及之前的版本中默认为 true)
  • 这里有一个小技巧:如果要在一个XML文件中引用另外一个XML文件中的SQL语句,就需要使用另一个XML文件的命名空间.id号。

我们主要是使用resultMap标签配置延时加载,因为resultMap在进行高级映射时使用associationcolletion实现一对一和一对多映射,而associationcollection具备延时加载功能。因此我们只能使用resultMap进行配置延时加载。它的主要查询步骤是:先进行单表查询,需要时再从关联表中查询数据,这样能大大提高数据库的性能,因为单表查询要比多表查询快。

测试延迟加载

在resultMap中使用association为例进行说明:

  • 场景:博客MyBatis高级映射中一对一映射所使用的场景。
  • 使用到association中的select标签加载Statement的ID。
  • 查询语句如下:
<select id="getOrdersByNumber" parameterType="java.lang.String" resultMap="OrderUserResultMap">
      select * from orders where number= #{number};
</select>
  • XML配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper:根标签,namespace命令空间,随便写,一般保证命名空间唯一 -->
<mapper namespace="com.tulun.dao.OrdersMapper">
    <resultMap id="OrdersResultMap" type="com.tulun.Mybatis_Demo.Orders">
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
        <result column="note" property="note"/>
    </resultMap>

    <resultMap id="OrderUserResultMap" extends="OrdersResultMap" type="com.tulun.Mybatis_Demo.Orders">
        <!--association的resultMap属性执行已存在的Map的全路径名-->
        <association property="user" column="id={user_id}" select="com.tulun.dao.UserMapper.getUserById"/>
    </resultMap>

    <select id="getOrdersByNumber" parameterType="java.lang.String" resultMap="OrderUserResultMap">
        select * from orders where number= #{number};
    </select>
</mapper>

在这里插入图片描述

  • 执行结果:进行单表查询

在这里插入图片描述

MyBatis中的逆向工程

MyBatis是目前很流行的持久层框架,其逆向工程更是大大缩减了我们的开发时间。所谓MyBatis逆向工程,就是MyBatis会根据我们设计好的数据表,自动生成pojo、mapper以及mapper.xml等相关的代码,从而极大的减少了开发人员的工作量。

  • MyBatis-Generator是MyBatis和IBatis的代码生成器,可以生成简单CRUD操作的XML配置文件,Mapper的接口文件(Mapper接口)、实体类(POJO类),可以有效的减少开发者的工作量,减少写手动写SQL的过程,减少出错的风险。

  • 思想:需要先将数据库中表生成,包含字段,字段属性可以来映射生成pojo类以及基本的额Mapper的XML文件和Mapper接口文件。

  • Generator的官网:http://mybatis.org/generator/index.html

Generator的使用步骤
1、引入依赖
<!--generator的依赖-->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.2</version>
</dependency>
2、配置逆向工程的XML配置文件
<!DOCTYPE generatorConfiguration PUBLIC
        "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!--配置生成器-->
<generatorConfiguration>
    <!--
       context生成一组对象环境
       id:必填,上下文的ID,用于在生成错误时提示
       targetRuntime:
          Mybatis3:用于生成mybatis 3.0以上版本的内容,包含XXXBySample
          Mybatis3Simple:类似于mybatis3,但是不生成XXXBySample
    -->
    <context id="simple" targetRuntime="MyBatis3Simple">
        <!--
           数据库连接的信息:驱动类,连接的地址,账号,密码
        -->
        <jdbcConnection 
            driverClass="com.mysql.jdbc.Driver" 
            connectionURL="jdbc:mysql://localhost:3306/mybatis"
            userId="root"
            password="123456"/>

        <!--
           生成pojo类信息
           targetPackage:生成pojole类的包路径
           targetProject:生成pojo类的位置
        -->
        <javaModelGenerator targetPackage="com.tulun.pojo" targetProject="src/main/java">
            <!--
               enableSubPackages:是否生成schema作为包的后缀
            -->
            <property name="enableSubPackages" value="false" />
            <!--
               trimStrings:从数据库返回的值清理前后的空格
            -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!--
           生成Mapper.xml文件的配置信息
        -->
        <sqlMapGenerator targetPackage="com.tulun.mapper" targetProject="src/main/resources"/>

        <!--
           生成Mapper的接口文件的配置
        -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.tulun.mapper" targetProject="src/main/java"/>

        <!--指定数据库的表-->
        <table tableName="user" />
    </context>
</generatorConfiguration>
3、通过Java代码生成相关代码
import org.apache.ibatis.io.Resources;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class GeneratorDemo {
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        //读取配置文件的
        File configFile = Resources.getResourceAsFile("Generator.xml");
//        File configFile = new File("mybatis-generator.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}
  • 执行结果:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值