威海招聘网:Mybatis详解系列(五)--Mybatis Generator和全注解气概的MyBatis3DynamicSql

admin 4周前 (05-04) 科技 8 0

简介

Mybatis Generator (MBG) 是 Mybatis 官方提供的代码天生器,通过它可以在项目中自动天生简朴的 CRUD 方式,甚至“无所不能”的高级条件查询(MyBatis3DynamicSql ),让我们制止了举行数据库交互时需要手动建立工具和设置 Mybatis 映射等基础事情。

另外,MBG 有很好地扩展性,它提供了大量的接口和插件用来给我们自界说天生的代码应该是什么样子,例如我们可以自界说注释、代码花样化、添加 toString 方式等。本文将解说若何使用这些接口。

本文内容大致如下,由于篇幅较长,可选择阅读:

  1. 若何使用 MBG 天生代码;
  2. 详解 MBG 的设置,将设置使用自界说注释天生器、实体类中添加 toString/equals/hashCode方式等。
  3. MyBatis3DynamicSql 气概(无 XML) API 的使用。

通过本文的学习,你将能够通过简朴革新 MBG 来天生自己想要的代码,另外,我们也将熟悉壮大的 MyBatis3DynamicSql 气概(它提供的条件类使用 Lambda 解耦,全注解,支持单表查询、多表查询、分页、排序、分组等等)。

关于 MBG 天生代码的气概

MBG 支持天生差别气概、差别语言的代码,例如,MBG 能够天生 JAVa 或 Kotlin 代码。另外,MBG 支持天生旧版的 MyBatis3 气概(我们常用的 xml 设置属于 MyBatis3 气概,官方以为这种气概已经过时),也支持新版的 MyBatis3DynamicSql 的气概(MyBatis3DynamicSql 气概为官方推荐)。几种气概的对比如下:

代码气概 形貌
MyBatis3DynamicSql 默认气概,官方推荐
Java代码
全注解,不天生 XML 文件
天生的高级条件查询灵活性较大,使用 lambda 表达式制止条件工具渗透到上一层
一个表天生一个实体类
MyBatis3Kotlin Kotlin 代码,本文不涉及
MyBatis3 早期气概
Java代码
能够天生 MyBatis3 兼容的 xml 或 全注解
天生的高级条件查询灵活性较小,条件类渗透到上一层,而且 sql 和代码耦合度较高
一个表除了天生基本类,可能还会天生主键类和BLOB类(若是指定的话)
MyBatis3Simple MyBatis3 的简易版
Java代码
能够天生 MyBatis3 兼容的 xml 或 全注解
不天生 "by example" 或 "selective" 的方式
一个表天生一个实体类

由于 MyBatis3 气概天生的 Example 类存在的问题现实项目中建议使用 MyBatis3Simple 气概或官方推荐的 MyBatis3DynamicSql 气概

关于 MBG 文件笼罩的问题

当我们在迭代开发环境中使用 MBG,需要注重文件笼罩的问题,默认情形下,文件笼罩规则如下:

  1. 若是 XML 已经存在,MBG 会接纳文件合并的方式。

    它不会修改你自界说的节点,然则会更新原来天生的 CRUD 节点(若是表发生变化)。文件合并有个条件,就是原来天生的 CRUD 节点必须包罗 @mbg.generated 的默认注释。否则,当再次运行 MBG 时,它将无法识别哪些是它天生过的节点,于是会出现下图的情形,即 CRUD 节点被重复插入。

![https://img2020.cNBlogs.com/blog/1731892/202005/1731892-20200502235440091-1666766703.png)

  1. 若是 Java 或 Kotlin 文件已经存在,MBG 可以笼罩现有文件或使用其他唯一名称保留新天生的文件,这取决于你若何设置<overwrite>false</overwrite>

那么,下面最先详细先容若何使用 MBG。

项目环境的说明

工程环境

JDK:1.8.0_231(要求 JDK8 及以上)

maven:3.6.1

IDE:Spring Tool Suites4 for Eclipse 4.12

mysql:5.7.28

数据库剧本

详细的 sql 剧本也提供好了(剧本路径)。

maven设置

pom.xml设置

MBG 支持使用Java 代码、maven 插件、Eclipse 插件等方式运行,本文使用 maven 插件方式,以是需要在 build/plugins 节点引入 MBG 插件,并加入其它依赖项,例如 mybatis、mysql 驱动等。另外,由于本文也需要用到 Java 程序来运行 MBG(当使用自界说类时),以是把插件的依赖项从 build/plugins/plugin 节点中单独取出来。

    <dependencies>
        <!-- mybatis-generator -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.4.0</version>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>
        <!-- dynamic-sql 用于测试MyBatis3DynamicSql天生的代码-->
        <dependency>
            <groupId>org.mybatis.dynamic-sql</groupId>
            <artifactId>mybatis-dynamic-sql</artifactId>
            <version>1.1.4</version>
        </dependency>
        <!-- jdbc驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <!-- logback -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
            <type>jar</type>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.0</version>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <phase>package</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <confIGuration>
                    <verbose>true</verbose>
                    <contexts>default</contexts>
                    <overwrite>false</overwrite>
                    <configurationFile>${basedir}/src/mAIn/resources/generatorConfig.xml</configurationFile>
                    <includeCompiledependencies>true</includeCompileDependencies>
                </configuration>
            </plugin>
        </plugins>
    </build>

插件参数详解

plugin/configuration 节点可以设置影响 MBG 行为的参数,如下:

参数 表达式 类型 形貌
configurationFile ${mybatis.generator.configurationFile} java.io.File 设置文件路径。
默以为${basedir}/src/main/resources/generatorConfig.xml
contexts ${mybatis.generator.contexts} java.lang.String 指定使用设置文件中的哪个context
多个用逗号离隔
jdbcDriver ${mybatis.generator.jdbcDriver} java.lang.String JDBC 驱动
jdbcPassword ${mybatis.generator.jdbcPassword} java.lang.String JDBC 密码
jdbcURL ${mybatis.generator.jdbcURL} java.lang.String JDBC URL
jdbcUserId ${mybatis.generator.jdbcUserId} java.lang.String JDBC 用户名
outputDirectory ${mybatis.generator.outputDirectory} java.io.File MBG 文件输出路径。只有在设置文件中设置targetProject="MAVEN"(区分大小写),才会使用这个路径。
默以为${project.build.directory}/generated-sources/mybatis-generator
overwrite ${mybatis.generator.overwrite} boolean 是否笼罩已经存在的同名Java文件。
若是为true,Java文件将被笼罩。 若是为false,MBG会将新天生唯一名称的Java文件(例如MyClass.java.1,MyClass.java.2)
默以为false
sqlScript ${mybatis.generator.sqlScript} java.lang.String 天生代码之前需要运行的SQL剧本路径。
若是指定,则必须提供jdbcDriver,jdbcURL、jdbcUserId、jdbcPassword。
tableNames ${mybatis.generator.tableNames} java.lang.String 需要天生代码的表
多个用逗号离隔
verbose ${mybatis.generator.verbose} boolean 是否打印日志
默以为false
includeCompileDependencies ${mybatis.generator.includeCompileDependencies} boolean 若是为true,则作用域为“ compile”,“ provided”和“ system”的依赖将添加到天生器的类路径中。
默以为false
includeAllDependencies ${mybatis.generator.includeAllDependencies} boolean 若是为true,则所有作用域的依赖将添加到天生器的类路径中。
默以为false
skip ${mybatis.generator.skip} boolean 项目启动时跳过 MBG。
默认false

代码天生规则设置

使用 maven 插件的方式不需要编写代码,只要将规则设置到 generatorConfig.xml 文件就行,设置内容主要为:

  1. 若何毗邻到数据库
  2. 天生什么工具,以及若何天生它们
  3. 哪些表将用于工具天生

下面先给一个简朴版的,后面再详细解说这些参数的意义:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
	<!--导入设置 -->
	<properties resource="jdbc.properties"></properties>
    
	<!-- context 一样平常是一个数据源一个context -->
	<context id="default" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <!-- 插件 -->
        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin">
            <property name="useEqualsHashCodeFromRoot" value="true"/>
        </plugin>
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin">
            <property name="useToStringFromRoot" value="true"/>
        </plugin>
    
        <!-- 注释 -->
        <commentGenerator type="cn.zzs.mybatis.generator.MyCommentGenerator">
            <property name="addRemarkComments" value="true"/>
            <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
        </commentGenerator>
        
		<!--jdbc的数据库毗邻 -->
		<jdbcConnection 
			driverClass="${jdbc.driver}"
			connectionURL="${jdbc.url}" 
			userId="${jdbc.username}"
			password="${jdbc.password}">
		</jdbcConnection>
        
        <!-- 类型剖析器 -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="true"/>
        </javaTypeResolver>
        
		<!-- 实体类 -->
		<javaModelGenerator 
			targetPackage="cn.zzs.mybatis.entity"
			targetProject=".\src\main\java">
            <!-- <property name="rootClass" value="cn.zzs.mybatis.entity.EntityClass"/> -->
            <property name="trimStrings" value="true"/>
		</javaModelGenerator>

		<!-- xml -->
		<sqlMapGenerator 
			targetPackage="cn.zzs.mybatis.mapper"
			targetProject=".\src\main\resources">
		</sqlMapGenerator>

		<!-- Mapper接口 -->
		<javaClientGenerator type="XMLMAPPER" 
			targetPackage="cn.zzs.mybatis.mapper" 
			targetProject=".\src\main\java">
            <!-- <property name="rootInterface" value="cn.zzs.mybatis.entity.BaseMapper"/> -->
		</javaClientGenerator>
		
		<!-- 指定数据库表 --> 
        <table tableName="demo_%" >
            <domainObjectRenamingRule searchString="^Demo" replaceString=""/>
        </table>
	</context>
</generatorConfiguration>

下令执行

maven 插件的运行方式

maven build,输入mybatis-generator:generate,天生乐成。

Java程序的运行方式

通常情形下,我们都是使用 maven 插件的方式,然则,当我们在 MBG 中指定了自界说的实现,使用 maven 插件可能会报错,这个时刻就需要通过 Java 程序的方式运行 MBG,详细方式如下:

    public static void main(String[] args) throws Exception {
        
        // LogFactory.forceSlf4jLogging();
        // System.setProperty("user.name", "zzs");
        // 这个聚集记录着天生、合并、笼罩文件的信息
        List<String> warnings = new ArrayList<String>();
        InputStream in = MybatisGenerator.class.getClassLoader().getResourceAsStream("generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(in);
        
        // 不笼罩 Java 文件
        boolean overwrite = false;
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        
        // 天生文件
        myBatisGenerator.generate(null);
        // 打印信息
        warnings.forEach(System.err::println);
    }

天生规则详解

generatorConfig.xml 的顶层结构如下:

  • generatorConfiguration(设置)
    • classPathEntry(JDBC驱动路径)
    • properties(properties文件路径)
    • context(天生工具的环境)
      • property(Context作用域参数)
      • jdbcConnection(JDBC毗邻)
      • connectionFactory(JDBC毗邻工厂)
      • commentGenerator(注释天生器)
      • javaModelGenerator(实体工具天生器)
      • javaClientGenerator(Mapper 接口或实现类天生器)
      • sqlMapGenerator(xml 天生器)
      • table(用于天生工具的表)
      • javaTypeResolver(Java 类型处置器)
      • plugin(插件)

下面选择部门节点睁开剖析:

context*

<context>节点用于指定天生一系列工具的环境。我们可以在设置文件中设置多个<context>节点来实现从差别数据源或接纳差别天生参数天生工具。

属性

这里最主要的属性是targetRuntime,它直接决议该环境下天生的代码气概,常用的气概为 MyBatis3DynamicSql 和 MyBatis3Simple。

属性 形貌
id 用于唯一标识指定环境。必选属性
defaultModelType 指定实体工具的类型。包罗三种:
flat:一个表天生一个实体类;
conditional:和 hierarchical 差不多,区别在于若是表只有一个主键,不会单独去天生一个主键类;
hierarchical:除了天生基本类,若是表中包罗主键或 BLOB 列,都市单独再天生一个主键类或BLOB类
默以为 conditional,若是 targetRuntime 为 "MyBatis3Simple"、"MyBatis3DynamicSql"或"MyBatis3Kotlin",则该属性忽略
targetRuntime 用于指定天生代码的气概。默以为 MyBatis3DynamicSql
introspecteDColumnImpl 指定org.mybatis.generator.api.IntrospectedColumn实现类。该类可以看成是某一列的所有信息

子节点

<context>包罗以下子节点:

  • <property> (0..N)
  • <plugin> (0..N)
  • <commentGenerator> (0 or 1)
  • <connectionFactory>/<jdbcConnection> (1 RequiRed)
  • <javaTypeResolver> (0 or 1)
  • <javaModelGenerator> (1 Required)
  • <sqlMapGenerator> (0 or 1)
  • <javaClientGenerator> (0 or 1)
  • <table> (1..N)

其中,<property>支持以下参数。其中,针对 mysql 数据库,可以将定界符修改为反单引号。若是想要使用自界说的代码花样或 XML 花样,可以设置自界说实现。

参数名 Property Values
autoDelimitKeywords 若是数据库关键字被作为列名使用,MBG 是否需要对其举行定界。
默以为false
beginningDelimiter 指定定界符的开头,默以为"
endingDelimiter 指定定界符的末端,默以为"
javaFileEncoding 指定处置 Java 文件使用的编码
javaFormatter 指定天生 Java 代码使用的花样化器。
若是自界说的话需要实现org.mybatis.generator.api.JavaFormatter 接口并提供无参组织,默以为org.mybatis.generator.api.dom.DefaultJavaFormatter
targetJava8 指定天生 Java 代码使用的 JDK 版本
kotlinFileEncoding 不涉及
kotlinFormatter 不涉及
xmlFormatter 指定天生 XML 文件使用的花样化器。若是自界说的话需要实现org.mybatis.generator.api.XmlFormatter 接口并提供无参组织,默以为org.mybatis.generator.api.dom.DefaultXmlFormatter

jdbcConnection

<jdbcConnection>节点用于指定 MBG 举行数据库交互所用的 JDBC 毗邻。注重,<jdbcConnection><jdbcConnection>节点只要一个就行了

属性

属性 形貌
driverClass JDBC 驱动。必选属性
connectionURL JDBC URL。必选属性
userId 用户名
password 密码

子节点

<property> (0..N):用于界说 JDBC 驱动所需的一些参数,较少用到。

connectionFactory

<jdbcConnection>节点用于指定和设置 MBG 举行数据库交互时获取 JDBC 毗邻的工厂。注重,<jdbcConnection><jdbcConnection>节点只要一个就行了

属性

属性 形貌
type 用于指定 毗邻工厂的类。必选属性
若是自界说的话需要实现org.mybatis.generator.api.ConnectionFactory 接口并提供无参组织,默以为org.mybatis.generator.internal.JDBCConnectionFactory

子节点

<jdbcConnection>的子节点为<property> (0..N),参数如下表。若是是使用默认的毗邻工厂,这几个参数必须凭据下表的提供,然则,若是是自界说的毗邻工厂,需要提供什么参数由你自己决议。

参数 形貌
driverClass JDBC 驱动
connectionURL JDBC URL
userId 用户名
password 密码

若何使用HikariCP作为 MBG 的毗邻工厂

这里我简朴的实现了一个毗邻工厂:

public class HikariConnectionFactory implements ConnectionFactory {
    
    private DataSource dataSource;
    
    public HikariConnectionFactory() {
        super();
        HikariConfig config = new HikariConfig("/hikari.properties");
        dataSource = new HikariDataSource(config);
    }
    @Override
    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    @Override
    public void addConfigurationProperties(Properties properties) {
        // do nothing
    }
}

将它设置到 XML 文件中,这时我们不需要添加任何的<property>子节点。

        <connectionFactory type="cn.zzs.mybatis.factory.HikariConnectionFactory"/>

使用 Java 程序运行 MBG,可以看到代码可以正常天生。

commentGenerator*

<commentGenerator>节点用于指定和设置 Java 代码或 XML 文件中使用的注释天生器。默认的注释天生器对照鸡肋,一样平常我们都市思量自己实现

属性

属性 形貌
type 用于指定注释天生器的类。
若是自界说的话需要实现org.mybatis.generator.api.CommentGenerator接口并提供无参组织,默以为org.mybatis.generator.internal.DefaultCommentGenerator

子节点

<commentGenerator>的子节点为<property> (0..N),参数如下表。注重,这些参数是针对默认注释天生器的,若是是自界说的,需要提供什么参数由你自己决议。

Property Name Property Values
suppressAllComments 是否不天生任何注解。
默以为false。注重,前面提到过,MBG 通过注释中的@mbg.generated来判断某个元素是不是通过 MBG 天生,若是不天生注解的话,XML 的文件笼罩功效会受到影响。
suppressdate 是否在注释中不包罗时间
默以为false。
addRemarkComments 是否在注释中包罗列的注释
默以为false
dateFormat 指定时间花样
例如:yyyy-MM-dd HH:mm:ss

自界说注释天生器

想要自界说注释天生器需要实现org.mybatis.generator.api.CommentGenerator接口并提供无参组织,在本项目中,我在DefaultCommentGenerator的基础上革新了一个注释天生器,感兴趣的可以移步到项目源码。

注重,编写自界说注解天生器时应该思量在xml节点的注释中加入@mbg.generated来维持 MBG 文件合并的功效

下面简朴举个例子,MBG 天生的实体类属性的注解是这样的:

    /**
     * Database Column Remarks:
     *   员工id
     *
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column demo_employee.id
     *
     * @mbg.generated Sat May 02 12:52:28 CST 2020
     */
    private String id;

然则,我不想要这种注释,这时,我们可以革新以下方式:

    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable,
            IntrospectedColumn introspectedColumn) {
        if (suppressAllComments) {
            return;
        }

        field.addJavaDocLINE("/**"); 
		
        // 获取列注释并加入到注解中
        String remarks = introspectedColumn.getRemarks();
        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
            String[] remarkLines = remarks.split(System.getProperty("line.separator")); 
            for (String remarkLine : remarkLines) {
                field.addJavaDocLine(" * <p>" + remarkLine + "</p>"); 
            }
        }

        field.addJavaDocLine(" */"); 
    }

而且在 XML 中举行如下设置:

        <!-- 注释 -->
        <commentGenerator type="cn.zzs.mybatis.generator.MyCommentGenerator">
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>

使用 Java 程序运行 MBG,可以看到实体类属性的注释酿成我们想要的样子。

    /**
     * <p>员工id</p>
     */
    private String id;

javaTypeResolver

<javaTypeResolver> 节点用于指定和设置 Java 类型剖析器。默认的剖析器可能会将数据库类型 decimal 或 numberic 剖析为ShortIntegerLong等 Java 类型,若是我们不希望这样剖析,就需要使用到这个节点。

Java 类型剖析器使用默认的就行,一样平常不会去重写它。

属性

Attribute Description
type 用于指定Java 类型剖析器的类。
若是自界说的话需要实现org.mybatis.generator.api.JavaTypeResolver并提供无参组织,默以为org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl,它会将数据库类型 decimal 或 numberic 剖析为 Integer 的 Java 类型

子节点

<javaTypeResolver>的子节点为<property> (0..N),参数如下表。注重,这些参数是针对默认注释天生器的,若是是自界说的,需要提供什么参数由你自己决议。

Property Name Property Values
forceBigDecimals 是否强制将数据库类型 decimal 或 numberic 剖析为 BigDecimal 类型。
默以为false,会凭据数据的小数点位数和长度来决议使用 Short、Integer、Long 或 BigDecimal。
useJSR310Types 是否不强制将数据库类型 date, time 和 timestamp 剖析为 Date
默以为false,若是为true,剖析规则将酿成:date -> LocalDate,time -> LocalTime,timestamp -> LocalDateTime

javaModelGenerator

<javaModelGenerator>节点用于设置实体类天生器。实体类天生器不支持自界说。

属性

Attribute Description
targetPackage 指定存放天生类的包路径。必选属性
targetProject 指定 targetPackage 的源文件夹。必选属性
注重,若是该文件夹不存在,将会报错

子节点

<javaModelGenerator>的子节点为<property> (0..N),参数如下表。用的对照多的是 rootClass 和 trimStrings。

Property Name Property Values
constructorBased 是否天生包罗所有参数的组织方式。
默以为false。当为true时,除了天生指定组织,还会天生对应的 resultMap。
enableSubPackages 是否在targetPackage基础上天生子包。
默以为false。当为true时,会将表所在 schema 名作为子包名
exampleTargetPackage 指定 Example 条件类的天生路径
默认和 targetPackage 相同
exampleTargetProject 指定 exampleTargetPackage 的源文件夹
默认和 targetProject 相同
immutable 若是为 true,天生的实体类将不包罗 setter 方式,但会提供包罗所有参数的组织。
默以为 false
rootClass 指定实体类需要继续的父类。
trimStrings 在setter方式中是否对传入字符串举行 trim 操作
默以为 false。

javaClientGenerator

<javaClientGenerator>节点用于指定和设置客户端类天生器。这个节点是可选的,若是不指定,则不会天生客户端类。客户端类一样平常指的是 Mapper 接口及 Mapper 接口的一些辅助类,例如SqlProvider

属性

下面的 type 属性仅针对 MyBatis3Simple 和 MyBatis3 气概生效,而且 MyBatis3Simple 气概不支持 MIXEDMAPPER。

属性 形貌
type 用于指定使用客户端类天生器的类。
若是自界说的话需要实现org.mybatis.generator.codegen.AbstractJavaClientGenerator并提供无参组织,MBG 为我们提供了以下几种:
1. ANNOTATEDMAPPER:包罗 Mapper 接口和 SqlProvider 辅助类,全注解,不包罗 XML 文件;
2. XMLMAPPER:包罗 Mapper 接口和 XML 文件,不包罗注解;
3. MIXEDMAPPER:包罗 Mapper 接口和 XML 文件,简朴的 CRUD 使用注解,高级条件查询使用 XML 文件。
targetPackage 指定存放天生类的包路径。必选属性
targetProject 指定存放天生类的包路径。必选属性

子节点

<javaClientGenerator>的子节点为<property> (0..N),参数如下表。注重,这些参数是针对默认注释天生器的,若是是自界说的,需要提供什么参数由你自己决议。

Property Name Property Values
enableSubPackages 是否在 targetPackage 基础上天生子包。
默以为 false。当为 true 时,会将表所在 schema 名作为子包名
rootInterface 指定 Mapper 接口需要实现的父接口。
useLegacyBuilder 是否使用过时的SqlBuilder来组织动态语句。
默以为 false

sqlMapGenerator

<sqlMapGenerator> 节点用于设置 XML 天生器,不支持自界说。

属性

Attribute Description
targetPackage 指定存放天生 XML 的包路径。必选属性
targetProject 指定存放天生 XML 的包路径。必选属性

子节点

<sqlMapGenerator>的子节点为<property> (0..N),参数如下表。

Property Name Property Values
enableSubPackages 是否在targetPackage基础上天生子包。
默以为false。当为true时,会将表所在 schema 名作为子包名

table*

<table> 节点用于指定需要用于天生工具的表以及设置某些天生规则。这个节点相比前面提到的,要加倍庞大一些。

属性

<table> 节点支持的属性许多,一样平常保持默认就可以了。

Attribute Description
tableName 需要用于天生工具的表名。必选属性
允许使用 SQL 通配符,例如:demo_%
schema 指定数据库 schema
允许使用 SQL 通配符
catalog 指定数据库 catalog
alias 指定查询时字段别名前缀。
若是指定,天生的 select 语句将使用alias_actualColumnName的别名
domainObjectName 指定实体类的类名。
默认情形下使用驼峰命名规则
mapperName 指定 Mapper 接口名
默以为实体类名+Mapper
sqlProviderName 指定 SqlProvider 接口名
默以为实体类名+SqlProvider
enableInsert
enableSelectByPrimaryKey
enableSelectByExample
enableUpdateByPrimaryKey
enableDeleteByPrimaryKey
enableDeleteByExample
enableCountByExample
enableUpdateByExample
是否天生指定语句
默以为true
selectByPrimaryKeyQueryId
selectByExampleQueryId
若是指定,在select 语句中将添加 'value' as QUERYID
modelType 指定实体工具的类型。context节点中已先容过了
escapeWildcards 当 schema 或 tableName 包罗 SQL 通配符时,在搜素列时是否对其举行转义
delimitIdentifiers 是否在 SQL 中对表名使用定界符而且使用确定的表名大小写
默以为false
delimitAllColumns 是否在 SQL 中对所有列名都添加定界符
默以为false

子节点

<table> 的子节点如下:

<property> (0..N)
<generatedKey> (0 or 1)
<domainObjectRenamingRule> (0 or 1)
<columnRenamingRule> (0 or 1)
<columnOverride> (0..N)
<ignoreColumn> (0..N)
<ignoreColumnsByRegex> (0..N)

这几个子节点中,常用到的是<domainObjectRenamingRule>,其他的用的对照少。下面挑几个来剖析下:

property

<property>设置的大部门参数都是为了笼罩全局的设置,并不常用。

Property Name Property Values
constructorBased 是否天生包罗所有参数的组织方式。
默以为false。当为true时,除了天生指定组织,还会天生对应的 resultMap。
ignoreQualifiersAtRuntime 在天生的 SQL 中,表名前是否不添加 schema 或 catalog
默以为 false
immutable 若是为 true,天生的实体类将不包罗 setter 方式,但会提供包罗所有参数的组织。
默以为 false
modelOnly 是否只天生实体类
默以为 false
rootClass 指定实体类需要继续的父类。
rootInterface 指定 Mapper 接口需要实现的父接口。
runtimeCatalog 指定 SQL 中使用的 catalog
runtimeSchema 指定 SQL 中使用的 schema
runtimeTableName 指定 SQL 中使用的 tableName
selectAllOrderByClause 指定selectAll方式中加入order by 'value'
trimStrings 在实体类的 setter 方式中是否对传入字符串举行 trim 操作
默以为 false。
useActualColumnNames 是否直接使用表名作为实体类类名。
默以为false
useColumnIndexes 是否在 resultMap 中使用索引而不使用列名举行映射
useCompoundPropertyNames 是否将“列名+列注释”作为实体类的属性名

domainObjectRenamingRule/columnRenamingRule

<domainObjectRenamingRule>节点一样平常用于重命名实体类类名。

例如,在没有指定 domainObjectName 的情形下,demo_employee 的表将天生实体类 DemoEmloyee,但我希望去掉前面的 Demo 前缀,则可以这样处置:

        <table tableName="demo_%" >
            <!-- replaceString属性可以省略 -->
            <domainObjectRenamingRule searchString="^Demo" replaceString=""/>
        </table>

另一个子节点<columnRenamingRule>也是相同的用法。

        <table tableName="demo_%" >
            <columnRenamingRule searchString="^Employee_" replaceString="" />
        </table>

ignoreColumnsByRegex/ignoreColumn

<ignoreColumnsByRegex><ignoreColumn>节点用于告诉 MBG 天生代码时忽略某些列。使用方式如下。

    <table tableName="Foo">
      <ignoreColumnsByRegex pattern="(?i)col.*">
        <except column="col01"/>
        <except column="col13"/>
      </ignoreColumnsByRegex>
    </table>

plugin*

<plugin>节点用于界说和设置插件。这个节点只有一个 type 属性,用于指定使用哪个插件,并通过子节点 property 来为这个插件设置参数。

若是自界说的话需要实现org.mybatis.generator.api.Plugin接口,并提供无参组织。MBG 为我们提供了许多好用的插件,如下:

插件 形貌
org.mybatis.generator.plugins.SerializablePlugin 用于在实体类中实现java.io.Serializable接口
org.mybatis.generator.plugins.ToStringPlugin 用于在实体类中添加 toString 方式
org.mybatis.generator.plugins.EqualsHashCodePlugin 用于在实体类中添加 equals 和 hashCode 方式。
org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin 用于指定不合并 XML 文件,这时 MBG 将 接纳处置 Java 文件的方式来处置 XML 文件
org.mybatis.generator.plugins.CachePlugin 用于在 xml 文件中加入cache节点
org.mybatis.generator.plugins.CaseInsensitiveLikePlugin 用于在 Example 类中天生不区分大小写的Like
org.mybatis.generator.plugins.dsql.DisableDeletePlugin 禁用 MyBatisDynamicSQLV2 气概的所有删除方式
org.mybatis.generator.plugins.dsql.DisableInsertPlugin 禁用 MyBatisDynamicSQLV2 气概的所有插入方式
org.mybatis.generator.plugins.dsql.DisableUpdatePlugin 禁用 MyBatisDynamicSQLV2 气概的所有更新方式
org.mybatis.generator.plugins.FluentBuilderMethodsPlugin 用于在实体类中添加MyDomainClass withValue(Object v)方式。通过它可以实现如下赋值方式:
new Employee().withAddress("北京").withDeleted(false).withName("zzs001");
org.mybatis.generator.plugins.MapperAnnotationPlugin 用于在 Mapper 接口中添加@Mapper接口
org.mybatis.generator.plugins.MapperConfigPlugin 用于天生 Mybatis 的主设置文件 MapperConfig
org.mybatis.generator.plugins.RenameExampleClassPlugin 用于重命名 Example 类
org.mybatis.generator.plugins.RowBoundsPlugin 用于在 Mapper 接口的 selectByExample 方式参数中加入 RowBounds 参数,用于支持分页
org.mybatis.generator.plugins.VirtualPrimaryKeyPlugin 用于指定表的主键

插件的设置方式异常简朴,如下:

        <!-- 插件 -->
        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin">
            <property name="useEqualsHashCodeFromRoot" value="true"/>
        </plugin>
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin">
            <property name="useToStringFromRoot" value="true"/>
        </plugin>

运行 Java 程序,可以看到实体类中天生类 toString 、hashCode 和 equals 方式。

以上,基本讲完 MBG 的使用方式,涉及到的内容可以知足现实使用需求。

MyBatis3DynamicSql 气概 API 的使用

在研究 MBG 之前,实在我并没有听说过 MyBatis3DynamicSql 气概,由于项目里一直使用的是 Mybatis3Simple,网上也很少人提起。

Mybatis3Simple 可以天生简朴的 CRUD,然则针对高级条件查询就无能为力了,现实项目中,我们有时必须手动地去编写高级查询的代码,固然,我们也可以自界说代码天生器来天生,然则这也只能针对单表,涉及到多表时,就不尽人意了。

MyBatis3DynamicSql 气概抛弃了 XML 文件,使用全注解形式并搭配几个条件辅助类,刚接触时,我照样对照抗拒,由于前面MyBatis3 中也尝试过全注解和条件类,当遇到某些庞大场景时,照样需要 XML,而且天生器提供的条件类会渗透到服务

直到最先使用 MyBatis3DynamicSql,我才发现它的壮大。它可以做到:

  1. 单表高级查询。包罗 Equal/NotEqual、Like/NotLike、In/NotIn、Between/NotBetween、IsNull/IsNotNull 等等,而且还可以判空设置条件。
  2. 联表查询。你可以像给单表一样给关联表设置条件。
  3. 分组、排序、分页
  4. 只返回你要的字段

下面这个例子,涉及到了关联查询、排序、分页,而 MyBatis3DynamicSql 都能帮我们处置,而且它行使 Lambda表达式来解耦条件类

    @Test
    public void testSelect() {
        // 注重,当查询效果多于1时会报错
        List<Employee> lsit = baseMapper.select(c ->
                                        c.leftJoin(DepartmentDynamicSqlSupport.department)
                                        .on(departmentId, new EqualTo(DepartmentDynamicSqlSupport.id))
                                        .where(name, isLikeWhenPresent("zzs%"), or(name, isLikeWhenPresent("zzf%")))
                                        .and(status, isEqualTo((byte)1))
                                        .and(address, isIn("北京", "广东"))
                                        .and(DepartmentDynamicSqlSupport.name, isEqualToWhenPresent("质控部"))
                                        .orderBy(gmtCreate.descending())
                                        .limit(3)
                                        .offset(1)
                                      );
        lsit.forEach(System.err::println);
    }

我信赖,MyBatis3DynamicSql 气概会被更多开发者使用,这里就不长篇大论的解说若何使用它,由于它的 API 并不难操作。感兴趣的同伙可以移步到项目源码阅读:测试例子

参考资料

MyBatis Generator官方文档

相关源码请移步:mybatis--generator

本文为原创文章,转载请附上原文出处链接:https://www.cnblogs.com/ZhangZiSheng001/p/12820344.html

,

sunbet安卓下载

欢迎进入sunbet安卓下载!Sunbet 申博提供申博开户(sunbet开户)、SunbetAPP下载、Sunbet客户端下载、Sunbet代理合作等业务。

皇冠APP下载声明:该文看法仅代表作者自己,与本平台无关。转载请注明:威海招聘网:Mybatis详解系列(五)--Mybatis Generator和全注解气概的MyBatis3DynamicSql

网友评论

  • (*)

最新评论

文章归档