MyBatis 三剑客之一 Mybatis Generator

官方网站:https://mybatis.org/generator/
通用 Mapper 的 MBG:https://github.com/abel533/Mapper/wiki/4.1.mappergenerator
参考:https://blog.csdn.net/q258523454/article/details/82292045

MyBatis Generator 简称 MBG,是 MyBatis 官方发布的代码生成器,它可以根据数据库的表生成对应的实体类,xml文件和mapper接口,提高开发效率,让开发者将更多的精力集中到业务上面。
如果我们使用了通用 Mapper,可以使用通用 Mapper 提供的 MBG,它对 MBG 进行了封装,生成的实体类可以配置包含 lombok 注解,mapper 接口继承通用 mapper 接口。

MBG 运行方式

这里只介绍 maven 插件方式,除了 maven 插件方式,还有 java 客户端方式,但是我决定这种不是业务方面的东西用代码实现感觉很突兀,即使放在 test 下也感觉不好。

<plugin>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-maven-plugin</artifactId>
  <version>1.4.1</version>
</plugin>

该插件包含一个 goal:mybatis-generator:generate
这个 goal 不会被 maven 自动执行,可以用命令 mvn mybatis-generator:generate 来运行,用命令方式的时候,可以传递参数,如 mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate.
你也可以将 MBG 绑定到 maven 的生命周期中,但是并不推荐这么做。

 <plugin>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-maven-plugin</artifactId>
  <version>1.4.1</version>
  <executions>
    <execution>
      <id>Generate MyBatis Artifacts</id>
      <goals>
        <goal>generate</goal>
      </goals>
    </execution>
  </executions>
</plugin>

如上示例将 MBG 插件绑定到 mavne 的 generate-sources 阶段,所以它会在 compile 之前执行。

配置参数概述

ParameterExpressionTypeComments
configurationFile${mybatis.generator.configurationFile}java.io.FileXML 配置文件的位置,默认为 ${basedir}/src/main/resourcess/generatorConfig.xml
contexts${mybatis.generator.contexts}java.lang.String在当前运行中使用的以逗号分隔的上下文列表。列表中指定的任何 id 必须与 <context> 配置元素的 id 属性值完全匹配。只有在此列表中指定的 id 才会在此运行中处于活动状态。如果未指定此参数,则所有上下文都将处于活动状态
jdbcDriver${myabtis.generator.jdbcDriver}java.lang.String数据库驱动类名
jdbcPassword${mybatis.generator.jdbcPassword}java.lang.String数据库密码
jdbcURL${mybatis.generator.jdbcURL}java.lang.String数据库的 url
jdbcUserId${mybatis.generator.jdbcUserId}java.lang.String数据库用户名
outputDirectory${mybatis.generator.outputDirectory}java.io.FileMBG 生成的文件将被放置的目录。当配置文件中的 targetProject 属性被指定为 “MAVEN” 时会使用该目录,默认为:${project.build.directory}/generated-sources/mybatis-generator
overwrite${mybatis.generator.overwrite}boolean如果设置为 true,已经存在的 Java 文件会被覆盖,默认值为 false
sqlScript${mybatis.generator.sqlScript}java.lang.String在生成代码之前要运行的 sql 脚本,如果为 null,则不会执行任何脚本,如果设置了该值,则 jdbcDriverjdbcURL 也必须被提供,额外的,jdbcUserIdjdbcPassword 也要被提供如果数据库要求身份验证的话
tableNames${mybatis.generator.tableNames}java.lang.String如果指定,则这是在当前运行中使用的以逗号分隔的表名列表。列表中指定的任何表都必须与 <table>\ 配置元素中指定的完全限定名完全匹配。只有在此列表中指定的表才会在此运行中处于活动状态。如果未指定此参数,则所有表都将处于活动状态。可以指定为 table,schema.table,catalog.table
verbose${mybatis.generator.verbose}boolean如果为 true,MBG 将会输出程序信息到日志中
includeCompileDependencies${mybatis.generator.includeCompileDependencies}boolean如果为 true,scope 为 “compile”,“provided” 和 “system” 的依赖将会被添加到生成器的类路径中
includeAllDependencies${mybatis.generator.iincludeAllDependencies}boolean如果为 true,所有 scope 类型的依赖都会被添加到生成器的类路径中

MBG 配置

配置文件头

<?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>
    <!-- 具体配置内容 -->
</generatorConfiguration>

配置介绍

<generatorConfiguration>
    <!--添加属性文件,一般为数据库连接属性文件,不是必须的,在使用spring框架是数据库交给spring管理,所以该属性一般用不到-->
    <properties resource=""></properties>
    <!--指定驱动类路径,当驱动类不在 classpath 下时才有用,所以一般用不到-->
    <classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/>

    <!--至少有一个该元素,可以配置多个,表示生成器上下文,在通过 maven 插件运行的时候可以通过 id 指定运行哪个上下文
        可配置的属性:
        defaultModelType,该属性定义 MBG 如何生成实体类
            conditional:这是默认值,这个模型和下面的hierarchical类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。
                因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
            flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。**这种模型最简单,推荐使用。**
            hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段,
                则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。
        targetRuntime,此属性用于指定生成的代码的运行时环境
            MyBatis3:*这是默认值*
            MyBatis3Simple:如果你希望不生成和Example查询有关的内容,设置该值
            Ibatis2Java2
            Ibatis2Java5 一般情况下使用默认值即可,有关这些值的具体作用以及区别请查看中文文档的详细内容。
        introspectedColumnImpl,该参数可以指定扩展org.mybatis.generator.api.IntrospectedColumn该类的实现类,一般用不到
    -->
    <context id="default" defaultModelType="flat" targetRuntime="MyBatis3Simple">
        <!--当表名或者字段名为 SQL 关键字的时候,可以设置该属性为 true,MBG会自动给表名或字段名添加**分隔符**-->
        <property name="autoDelimitKeywords" value="true"/>
        <!--指定分隔符,在 mysql 中为反单引号-->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <!--设置要使用的Java文件的编码,默认使用当前平台的编码,只有当生产的编码需要特殊指定时才需要使用,一般用不到-->
        <property name="javaFileEncoding" value="UTF8"/>
        <!--下面两个属性在要使用模板来定制生成的java文件和xml文件的样式时,才有用-->
        <property name="javaFormatter" value=""/>
        <property name="xmlFormatter" value=""/>

        <!--该元素用来定义一个插件。插件用于扩展或修改通过 MyBatis Generator (MBG) 代码生成器生成的代码,
            插件将按在配置中配置的顺序执行-->
        <plugin type=""></plugin>

        <!--MBG 的注释配置,可以修改 MBG默认的注释配置,也可以自定义注释配置
            该元素有一个可选属性 type,该属性用于指定生成注释的实现类,该实现类要实现 `org.mybatis.generator.api.CommentGenerator` 接口
            默认实现是 `org.mybatis.generator.internal.DefaultCommentGenerator`
            默认实现提供了两个可选属性:
                suppressAllComments:**阻止**生成注释,默认为false
                suppressDate:**阻止**生成的注释包含时间戳,默认为false
            一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用**版本控制**的时候每次都会提交,因而一般情况下我们都会屏蔽注释信息-->
        <commentGenerator>
            <!--屏蔽默认实现的注释信息-->
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!--该元素用于配置连接数据库信息-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="123">
            <!--生成指定数据库下的所有表,在 mysql 中,如果 table 标签的 tableName 为 % 表示所有表,如果不设置下面设置会生成所有数据库的所有表-->
            <property name="nullCatalogMeansCurrent" value="true" />
        </jdbcConnection>

        <!--这个元素的配置用来指定JDBC类型和Java类型如何转换,提供了默认的实现 DEFAULT,一般情况下使用默认即可,需要特殊处理的情况可以通过其他元素配置来解决,不建议修改该属性-->
        <javaTypeResolver></javaTypeResolver>
        
        <!--实体类生成设置
            targetPackage:生成实体类存放的包名
            targetProject:指定目标项目路径,可以是绝对路径或相对路径(如 targetProject="src/main/java")-->
        <javaModelGenerator targetPackage="com.monkey.domain" targetProject="src/main/java">
            <!--该属性只对MyBatis3有效,如果true就会使用构造方法入参,如果false就会使用setter方式。默认为false。-->
            <property name="constructorBased" value=""/>
            <!--如果true,MBG会根据catalog和schema来生成子包。如果false就会直接用targetPackage属性。默认为false-->
            <property name="enableSubPackages" value=""/>
            <!--该属性用来配置实体类属性是否可变,如果设置为true,那么constructorBased不管设置成什么,都会使用构造方法入参,
            并且不会生成setter方法。如果为false,实体类属性就可以改变。默认为false。-->
            <property name="immutable" value=""/>
            <!--设置所有实体类的基类-->
            <property name="rootClass" value="com.monkey.domain.BaseEntity"/>
            <!--是否对数据库查询结果进行trim操作,如果设置为true就会生成类似这样
            public void setUsername(String username) {this.username = username == null ? null : username.trim();}的setter方法。默认值为false-->
            <property name="trimStrings" value=""/>
        </javaModelGenerator>

        <!--xml映射文件设置,如果没有配置,那么 MBG 将只生成实体类-->
        <sqlMapGenerator targetPackage="com.monkey.mapper" targetProject="src/main/resources"></sqlMapGenerator>

        <!--mapper接口配置,如果没有配置,就不会生成 Mapper 接口
            type:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator类,
                必须有一个默认的构造方法。 该属性提供了以下预定的代码生成器,
                首先根据<context>的targetRuntime分成三类:
                    MyBatis3:
                        ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
                        MIXEDMAPPER:XML和注解的混合形式,(上面这种情况中的)SqlProvider注解方法会被XML替代。
                        XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
                    MyBatis3Simple:
                        ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
                        XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
                    Ibatis2Java2或**Ibatis2Java5**:
                        IBATIS:生成的对象符合iBATIS的DAO框架(不建议使用)。
                        GENERIC-CI:生成的对象将只依赖于SqlMapClient,通过构造方法注入。
                        GENERIC-SI:生成的对象将只依赖于SqlMapClient,通过setter方法注入。
                        SPRING:生成的对象符合Spring的DAO接口
             implementationPackage:如果指定了该属性,实现类就会生成在这个包中
             rootInterface:用于指定一个所有生成的接口都继承的父接口
        -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.monkey.mapper" targetProject="src/main/java"></javaClientGenerator>

        <!--配置生成的表名,只有配置的才会生成实体类和其他文件
                tableName:指定要生成的表名,可以使用SQL通配符匹配多个表-->
        <table tableName="%"></table>
    </context>
</generatorConfiguration>

通用 Mapper 专用代码生成器

使用专用代码生成器只需要在 MBG 配置文件中添加如下插件

<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
    <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
    <property name="caseSensitive" value="true"/>
    <property name="forceAnnotation" value="true"/>
    <property name="beginningDelimiter" value="`"/>
    <property name="endingDelimiter" value="`"/>
</plugin>

插件配置介绍

mappers

这是最关键的参数,配置后生成的 Mapper 接口都会自动继承上该接口,如果你定义了一个自己的基础接口,例如:

package xxx.base;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * 继承自己的MyMapper
 */
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
    //TODO
    //FIXME 特别注意,该接口不能被扫描到,否则会出错
}

在配置插件时,可以配置为:

<property name="mappers" value="xxx.base.MyMapper"/>
caseSensitive

是否区分大小写,默认值 false。如果数据库区分大小写,这里就需要配置为 true,这样当表名为 USER 时,会生成 @Table(name = "USER") 注解,否则使用小写 user 时会找不到表。

forceAnnotation

是否强制生成注解,默认 false,如果设置为 true,不管数据库名和字段名是否一致,都会生成注解(包含 @Table@Column

beginingDelimiter,endingDelimiter

开始和结束分隔符,对于关键字的情况下适用

usemapperCommentGenerator

是否使用通用 Mapper 提供的注释工具,默认 true 使用,这样在生成代码时会包含字段的注释(目前只有 mysql 和 oracle 支持),设置 false 后会用默认的,或者你可以配置自己的注释插件

generateColumnConsts

在生成的 model 中,增加字段名的常量,便于使用 Example 拼接查询条件的时候调用

lombok

使用该功能版本号要在 4.2.1 以上
增加 model 代码生成时,可以直接生成 lombok 的 @Getter@Setter@ToString@Accessors(chain = true) 四类注解。
使用者在插件配置项中增加 <property name="lombok" value="Getter,Setter,ToString,Accessors" /> 即可生成对应包含注解的 model 类。

插件配置

<plugins>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>${jdk.version}</source>
      <target>${jdk.version}</target>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.6</version>
    <configuration>
      <configurationFile>
        ${basedir}/src/main/resources/generator/generatorConfig.xml
      </configurationFile>
      <overwrite>true</overwrite>
      <verbose>true</verbose>
    </configuration>
    <dependencies>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.29</version>
      </dependency>
      <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper</artifactId>
        <version>4.0.0</version>
      </dependency>
    </dependencies>
  </plugin>
</plugins>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值