乐趣区

关于java:MyBatis-Generator-代码自动生成器从此解放你的双手

前言

在日常开发工作中,咱们往往须要本人去构建各种数据表所对应的长久化对象(PO)、用于操作数据库的接口(DAO)以及跟 DAO 所绑定的对应 XML。这都是一些重复性的操作,不须要多大技术含量,这时候咱们不禁会去想,有没有一种工具,可能帮忙咱们去主动生成这些文件呢?答案是:有的!

本文接下来的内容次要实用于应用 MyBatis 来做长久层框架开发的工作,如果不是应用 MyBatis,那么可能本文不太适宜你的开发场景。

MyBatis Generator 简介

作为一个基于 MyBatis 的独立工具,MyBatis Generator 可能满足咱们以上的要求,可能通过简略的配置去帮咱们生成数据表所对应的 PO、DAO、XML 等文件,减去咱们手动去生成这些文件的工夫,无效进步开发效率。MyBatis Generator 运行形式多样,次要能够通过以下几种形式来运行:

  1. 命令行
  2. Ant
  3. Maven
  4. Java
  5. Eclipse

而我平时次要在 Maven 中配置并应用,所以本文次要基于 Maven 环境来进行解说。

筹备工作

引入插件

既然要应用 MyBatis Generator,那么必定咱们的我的项目中曾经配置了数据库和 MyBatis 的相干依赖,如果还没有配置,那么能够在 pom.xml 文件中进行配置,这里次要以 MySQL 数据库为例。

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
</dependencies>

接着咱们持续引入 MyBatis Generator 的相干配置。

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
        </plugin>
    </plugins>
</build>

插件配置

实现上述步骤后,咱们只是实现了 MyBatis Generator 的引入工作,要想让它失常工作,咱们还须要对它进行配置,而 MyBatis Generator 在 pom.xml 中的次要配置次要有以下几点。

  1. 代码生成器的配置文件所在门路

这里次要配置 MyBatis Generator 配置文件所在门路,个别咱们将其放在 resources 门路中,而配置文件的名字则能够自定义,这里我以 mybatis-generator-config.xml 为例,此时须要将如下配置退出到 pom.xml 文件中。

<configuration>
    <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
</configuration>

  1. 是否每次新生成后笼罩已生成的文件

因为我的项目需要,假如咱们的数据库表中有须要新增新的字段,而咱们之前曾经应用过 MyBatis Generator 生成过相干文件。此时,如果咱们想要将新加的字段退出原来生成的文件中,第一种能够采取手动的形式,将旧文件删除,而后从新生成。第二种则是在 MyBatis Generator 中配置,让每次新生成的文件都间接笼罩掉旧文件。具体配置如下,true 则代表笼罩,false 则代表不笼罩。

<configuration>
    <overwrite>true</overwrite>
</configuration>

不过有一点须要留神,就算咱们设置了笼罩旧文件,MyBatis Generator 也只会笼罩原来的 PO、DAO 文件,此时 Mapper 不会被笼罩,而是采取追加的形式,从而保障咱们本人增加的 sql 语句不会被笼罩掉。

  1. 数据库驱动依赖

尽管在我的项目的 pom.xml 文件中咱们曾经配置了数据库的相干依赖,然而在 MyBatis Generator 配置中依然须要对其进行再次配置。此时,这里有两种形式供咱们抉择。

第一种是再次在引入数据库依赖,具体配置形式如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.17</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

第二种则是利用 Maven 的 includeCompileDependencies 属性。一般来讲,咱们的我的项目中必定曾经引入过数据库的相干依赖了,那咱们此时配置 includeCompileDependencies 就好了,具体配置形式如下:

<configuration>
    <includeCompileDependencies>true</includeCompileDependencies>
</configuration>

MyBatis Generator 配置

咱们在上述步骤中曾经引入了 MyBatis Generator,而且也在我的项目配置文件 pom.xml 中配置了 MyBatis Generator 配置文件所在的门路、是否进行文件笼罩以及数据库依赖配置,接下来就该具体来看看,如何对 MyBatis Generator 进行具体配置,配置咱们生成代码中的各种细节。

  1. 内部配置文件

个别咱们须要引入内部文件,次要用于配置我的项目数据库,不便咱们后续的设置,而引入内部配置文件的形式也很简略,具体配置如下:

<generatorConfiguration>
    <!-- 引入配置文件 -->
    <properties resource="generator.properties"/>
</generatorConfiguration>
  1. context 配置

除开内部配置外,context 无疑是 MyBatis Generator 中最重要的配置了。一个 context 配置的具体示例如下:

<context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">
</context>

其中的各个属性含意如下:

  • id:惟一标识,不可反复,能够依据咱们本人的爱好进行自定义。
  • defaultModelType:非必填项,有两个值可选,一个是 conditional,也是默认值,另一个值是 flat,也就是咱们罕用的一个配置,示意数据库中的一张表对应生成一个 PO。
  • targetRuntime:非必填项,这里同样有两个值可选,一个是 MyBatis3,一个是 MyBatis3Simple,两者的最次要区别在于不同配置下所生成的 DAO 和 Mapper 会有所不同,后者生成的 DAO 和 Mapper 会少很多,只含有日常最罕用的。

context 除了下面配置的之外,还有许多子元素须要配置,而且这些子元素的配置的个数以及程序都是规定好的,如果不依照给定的规定进行配置,则会导致谬误,常见子元素及个数配置如下(依照规定的程序进行从上到下排序):

子元素 起码个数 最多个数
property 0 N
plugin 0 N
commentGenerator 0 1
jdbcConnection
javaTypeResolver 0 1
javaModelGenerator 1 N
sqlMapGenerator 0 1
javaClientGenerator 0 1
table 1 N

接下来顺次对各个子元素进行简略的配置解说。

context 子元素配置

  1. property

如果咱们要给咱们的所生成文件的编码类型进行设置,则能够在此处进行配置,具体配置如下:

<property name="javaFileEncoding" value="UTF-8"/>
  1. plugin

默认生成的 PO 中,只蕴含了各个各个属性申明以及各个属性所对应的 setter/getter,如果咱们想要生成对应 PO 的 equalshashCode 办法,则能够通过配置如下插件来实现。

<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>

要生成 toString 办法,则能够应用如下插件:

<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>

为模型生成序列化办法,则应用如下插件:

<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
  1. commentGenerator

该配置次要用于配置生成的正文,默认状况下是会生成正文的,而且会带上工夫戳,如果咱们不须要这些配置,则能够通过如下配置来革除:

<commentGenerator>
    <!-- 是否去除主动生成的正文 true:是:false: 否 -->
    <property name="suppressAllComments" value="true"/>
    <!-- 是否去除主动生成的工夫戳 true:是:false: 否 -->
    <property name="suppressDate" value="true"/>
    <!-- 是否增加数据库表中字段的正文 true:是:false: 否,只有当 suppressAllComments 为 false 时能力失效 -->   
    <property name="addRemarkComments" value="true"/>
</commentGenerator>
  1. jdbcConnection

既然要主动生成对应文件,那必定得链接数据库,所以咱们须要对数据库进行配置,下面咱们讲过导入内部配置文件,咱们能够通过这种形式将数据库的配置定义在内部文件中,而后通过导入该文件进行配置即可,具体能够通过如下具体步骤进行:

<jdbcConnection driverClass="${jdbc.driver-class-name}"
                connectionURL="${jdbc.url}"
                userId="${jdbc.username}"
                password="${jdbc.password}">
    <!-- 高版本的 mysql-connector-java 须要设置 nullCatalogMeansCurrent=true-->
    <property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
  1. javaTypeResolver

次要用于配置 JDBC 和 Java 中的类型转换规定,如果咱们不配置,会采纳默认的一套转换规则,而如果咱们须要自定义,也只能配置 bigDecimalNUMERIC 和工夫类型,不能去配置其余类型,否则会导致出错,具体配置规定如下:

<javaTypeResolver>
    <property name="forceBigDecimals" value="true"/>
    <property name="useJSR310Types" value="false"/>
</javaTypeResolver>
  • forceBigDecimals

该属性默认为 false,此时它会将 JDBC DECIMALNUMERIC 类型解析为 Integer,若该属性为 true,此时将会把 JDBC DECIMALNUMERIC 类型解析为 java.math.BigDecimal

  • useJSR310Types

该属性默认为 false,它会将 JDBC 所有的工夫类型都解析为 java.util.Date,若该属性为 true,则会依照如下规定进行解析:

转换前 转换后
DATE java.time.LocalDate
TIME java.time.LocalTime
TIMESTAMP java.time.LocalDateTime
TIME_WITH_TIMEZONE java.time.OffsetTime
TIMESTAMP_WITH_TIMEZONE java.time.OffsetDateTime
  1. javaModelGenerator

这里次要用于配置主动生成的 PO 所在的包门路和我的项目门路,这里须要依据本人的需要进行配置,这里以我本人的配置为例,比方我的 PO 所在包为 com.cunyu1943.mybatisgeneratordemo.entity,我的项目门路为 src/main/java

<javaModelGenerator targetPackage="com.cunyu1943.mybatisgeneratordemo.entity" targetProject="src/main/java">
    <!-- 是否让 schema 作为包的后缀,默认为 false -->
    <property name="enableSubPackages" value="false"/>
    <!-- 是否针对 String 类型的字段在 set 办法中进行修剪,默认 false -->
    <property name="trimStrings" value="true"/>
</javaModelGenerator>
  1. sqlMapGenerator

配置生成的 Mapper.xml 所寄存的门路,比方咱们要放在 src/main/resources/mapper 门路下,则配置如下:

<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
</sqlMapGenerator>
  1. javaClientGenerator

配置 Mapper 接口所寄存的门路,个别咱们都是寄存在我的项目的 mapper 包下,如我的配置为:

<javaClientGenerator targetPackage="com.cunyu1943.mybatisgeneratordemo.mapper" targetProject="src/main/java"
                     type="XMLMAPPER">
</javaClientGenerator>
  1. table

配置所要主动生成代码的数据库表,这里一张表对应一个 table,如果要生成多张表,则须要配置多个 table,以下为一个具体实例:

<table schema=""tableName="user"domainObjectName="User"enableCountByExample="false"enableDeleteByExample="false"enableSelectByExample="false"enableUpdateByExample="false"selectByExampleQueryId="false">
    <!-- 是否应用理论列名, 默认为 false-->
    <property name="useActualColumnNames" value="false" />
</table>

其中,schema 是数据库名,有的数据库须要配置,有的数据库不须要配置,这里须要具体依据你本人所用的数据库来填写,不过倡议都填上,不便不同数据库也能够实用。tableName 则对应数据库表名;domainObjectName 对应生成的实体类名,默认能够不必配置,不配置时它将依照帕斯卡命名法将表明转换为类名;而 enableXXXByExample 默认为 true,默认会生成一个 Example 帮忙类,不过该配置只有在 targetRuntime="MyBatis3" 时能力失效,当 targetRuntime="MyBatis3Simple" 时,enableXXXByExample 无论如何配置都不起作用。

执行生成

通过上边的配置之后,咱们就失去了整体的 MyBatis Generator 配置,残缺的配置如下,能够依据本人的需要对其中的配置进行批改后即可应用。

<?xml version="1.0" encoding="UTF-8" ?>
<!--mybatis 的代码生成器相干配置 -->
<!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="generator.properties"/>

    <!-- 一个数据库一个 context,context 的子元素必须依照它给出的程序
        property*,plugin*,commentGenerator?,jdbcConnection,javaTypeResolver?,
        javaModelGenerator,sqlMapGenerator?,javaClientGenerator?,table+
    -->
    <context id="myContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <!--        设置生成文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>

        <!-- 这个插件给生成的 Java 模型对象减少了 equals 和 hashCode 办法 -->
        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>
        <!--        减少 toString 办法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
        <!--        生成序列化办法 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <!-- 正文 -->
        <commentGenerator>
            <!-- 是否生成正文 true:否:false: 是 -->
            <property name="suppressAllComments" value="true"/>
            <!-- 是否去除工夫戳 true:是:false: 否 -->
            <property name="suppressDate" value="true"/>
            <!-- 是否增加数据库表中字段的正文 true:是:false: 否,只有当 suppressAllComments 为 false 时能力失效 -->
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>


        <!-- jdbc 连贯 -->
        <jdbcConnection driverClass="${jdbc.driver-class-name}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.username}"
                        password="${jdbc.password}">
            <!-- 高版本的 mysql-connector-java 须要设置 nullCatalogMeansCurrent=true-->
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否应用 bigDecimal,默认 false。false,把 JDBC DECIMAL 和 NUMERIC 类型解析为 Integer
                true,把 JDBC DECIMAL 和 NUMERIC 类型解析为 java.math.BigDecimal-->
            <property name="forceBigDecimals" value="true"/>
            <!-- 默认 false
                false,将所有 JDBC 的工夫类型解析为 java.util.Date
                true,将 JDBC 的工夫类型按如下规定解析
                    DATE                    -> java.time.LocalDate
                    TIME                    -> java.time.LocalTime
                    TIMESTAMP               -> java.time.LocalDateTime
                    TIME_WITH_TIMEZONE      -> java.time.OffsetTime
                    TIMESTAMP_WITH_TIMEZONE    -> java.time.OffsetDateTime
                -->
            <property name="useJSR310Types" value="false"/>
        </javaTypeResolver>

        <!-- 生成实体类地址 -->
        <javaModelGenerator targetPackage="com.cunyu1943.mybatisgeneratordemo.entity" targetProject="src/main/java">
            <!-- 是否让 schema 作为包的后缀,默认为 false -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否针对 string 类型的字段在 set 办法中进行修剪,默认 false -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>


        <!-- 生成 Mapper.xml 文件 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
        </sqlMapGenerator>

        <!-- 生成 XxxMapper.java 接口 -->
        <javaClientGenerator targetPackage="com.cunyu1943.mybatisgeneratordemo.mapper" targetProject="src/main/java"
                             type="XMLMAPPER">
        </javaClientGenerator>


        <!-- schema 为数据库名,oracle 须要配置,mysql 不须要配置。tableName 为对应的数据库表名
             domainObjectName 是要生成的实体类名 (能够不指定,默认按帕斯卡命名法将表名转换成类名)
             enableXXXByExample 默认为 true,为 true 会生成一个对应 Example 帮忙类,帮忙你进行条件查问,不想要能够设为 false
             -->
        <table schema=""tableName="user"domainObjectName="User"enableCountByExample="false"enableDeleteByExample="false"enableSelectByExample="false"enableUpdateByExample="false"selectByExampleQueryId="false">
            <!-- 是否应用理论列名, 默认为 false-->
            <property name="useActualColumnNames" value="false"/>
        </table>
    </context>
</generatorConfiguration>

其中,对于内部文件 generator.properties 的配置具体如下,次要对数据库的相干属性进行配置。

jdbc.username=root
jdbc.password=123456
jdbc.url=jdbc:mysql://localhost:3306/community?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc.driver-class-name=com.mysql.cj.jdbc.Driver

最初,当实现所有配置后,就能够利用 Maven 工具来进行代码生成了。具体操作办法如下,点击我的项目 Maven 配置中的 MyBatis Generator 生成即可。

总结

以上就是利用 Maven 搭配 MyBatis Generator 来配置生成我的项目 PO、Mapper、XXXMapper.xml 的具体搭建过程了。如果你也刚好有这个需要,那连忙去试试吧。搭建过程中如果遇到什么问题,欢送评论区留言交换,我会在看到的第一工夫回复。

最初,对于本示例的相干代码,我曾经传到了 Github,如果有须要的兄弟,能够自取。

🎉🎉🎉 传送门 -> mybatis-generator-demo

退出移动版