MyBatis代码生成器Gradle插件分享

      这是一个MyBatis代码的代码生成器。阅读本文或使用本文代码可能需要一定的Gradle技术基础。

      现在使用Gradle来管理的项目越来越多,这个使用Gradle操作的代码生成器插件写了很久了,最近整理项目发现也算比较实用,就拿出来分享一下,记得之前在网上参考了许多配置,关于使用Gradle配置的MyBatisGenerator很少,也或者自己可能不是很满意,所以就动手写了一个。功能很简单,操作也比较自由。

   特点:

  1. 可以自定义配置生成基于注解或者XML的Mapper

  2. 支持使用Lombok的@Data@Builder,支持分页插件的嵌入

  3. 自定义包名类名等等,你所常见的自定义功能

 插件依赖如下:

dependencies {
    //官方代码生成Core
    generatorComplie("org.mybatis.generator:mybatis-generator-core:${mybatisGeneratorCoreVersion}")
    //MySQL数据库
    generatorComplie("mysql:mysql-connector-java")
    //通用Mapper
    generatorComplie("tk.mybatis:mapper:${mybatisMapperVersion}")
    //支持生成Lombok注解
    generatorComplie("com.softwareloop:mybatis-generator-lombok-plugin:${generatorLomBokVersion}")
}

对应版本定义:

mybatisGeneratorCoreVersion = "1.3.7"
mybatisMapperVersion = "4.1.2"
generatorLomBokVersion = "1.0"

工具包含三个文件配置:

        generatorConfig.xml        此为生成器的基本配置文件

        generatorConfigParam.gradle        此为自定义参数配置文件

        build.gradle        此为定义插件代码执行主文件

代码中注释比较详细,不做过多赘述,build.gradle插件代码如下:

/**
 * @author VeChar
 * Description: generator独享的配置文件,其他配置请走根配置
 * Createtime: 2018年12月20日20:36:22
 * Copyright: Copyright (C) 2018 All Rights Reserved.
 */
apply plugin: MyBatisGeneratorPlugin

apply from: 'src/main/resources/generatorConfigParam.gradle'

/**
 * 定义gennerator插件依赖
 */
configurations {
    generatorComplie
}

dependencies {
    //官方代码生成Core
    generatorComplie("org.mybatis.generator:mybatis-generator-core:${mybatisGeneratorCoreVersion}")
    //MySQL数据库
    generatorComplie("mysql:mysql-connector-java")
    //通用Mapper
    generatorComplie("tk.mybatis:mapper:${mybatisMapperVersion}")
    //支持生成Lombok注解
    generatorComplie("com.softwareloop:mybatis-generator-lombok-plugin:${generatorLomBokVersion}")
}

class MyBatisGeneratorPlugin implements Plugin<Project> {

    void apply(Project project) {

        project.task('generator') {
            group = "generator"
            description = "Mybatis Generator plugins"

            doFirst {
                println(project.name)
                logger.log(LogLevel.INFO, "* MyBatisGenerator任务,只建议在vnion-repository工程下执行,Ofcourse,理论情况下," +
                        "如果执行Task的Proejct下存在符合规则的相关配置(eg. 'generatorConfig.xml generatorConfigParam.gradle generator Folder')" +
                        "也可以执行成功,但我不建议你那样做。")
                logger.log(LogLevel.INFO, "* 使用MyBatisGenerator任务工具请先按照规范修改vnion-repository Project 下的 " +
                        "generatorConfigParam.gradle配置文件中数据库连接信息," +
                        "生成文件的包名称,实体类名称,后缀,对应的的表,字段,主键,等配置信息")
                logger.log(LogLevel.INFO, "* 任务执行完毕后请在 vnion-repository/src/main/resources/generator/ 文件夹下查看")
                logger.log(LogLevel.INFO, "By:VeChar,  Good luck to you!")
            }

            doLast {
                def datasource = project.ext.datasource
                def generator = project.ext.generator

                ant.properties['username'] = datasource.username
                ant.properties['password'] = datasource.password
                ant.properties['url'] = datasource.url
                ant.properties['driverClass'] = datasource.driverClass

                ant.properties['resourcesProject'] = generator.resourcesProject
                ant.properties['javaProject'] = generator.javaProject
                ant.properties['mapperPackage'] = generator.mapperPackage
                ant.properties['modelPackage'] = generator.modelPackage
                ant.properties['xmlPackage'] = generator.xmlPackage
                ant.properties['mapperSuffix'] = generator.mapperSuffix
                ant.properties['mapperName'] = generator.mapperName
                ant.properties['mapperType'] = generator.mapperType

                ant.properties['tableName'] = generator.tableName
                ant.properties['objectName'] = generator.objectName
                ant.properties['generatedKey'] = generator.generatedKey
                ant.taskdef(
                        name: 'mbgenerator',
                        classname: 'org.mybatis.generator.ant.GeneratorAntTask',
                        classpath: project.configurations.generatorComplie.asPath
                )
                /**
                 * TODO say: 'Hi,Gradle ! WQNMLGB! then,hit the hay!'
                 *
                 * @author VeChar
                 * @LastUpdatetime 2018年12月23日02:15:29
                 */
                //加载配置文件
                File configFile = new File('src/main/resources/generatorConfig.xml')
                if (configFile.exists() && configFile.isFile()) {
                    ant.mbgenerator(overwrite: true,
                            configfile: configFile, verbose: true) {
                        propertyset {
                            propertyref(name: 'username')
                            propertyref(name: 'password')
                            propertyref(name: 'url')
                            propertyref(name: 'driverClass')

                            propertyref(name: 'resourcesProject')
                            propertyref(name: 'javaProject')
                            propertyref(name: 'mapperPackage')
                            propertyref(name: 'modelPackage')
                            propertyref(name: 'xmlPackage')
                            propertyref(name: 'mapperSuffix')
                            propertyref(name: 'mapperName')
                            propertyref(name: 'mapperType')

                            propertyref(name: 'tableName')
                            propertyref(name: 'objectName')
                            propertyref(name: 'generatedKey')
                        }
                    }
                } else {
                    logger.log(LogLevel.WARN, "[Mybatis Generator plugins]: Folder does not exist...")
                }
            }
        }

        //定义清理代码的Task
        project.task("cleanCode") {
            group = "generator"
            description = "Clean Mybatis Generator plugins Folder"

            doLast {
                clean("src/main/resources/generator/")
            }
        }
    }

    /**
     * 清理代码生成器目录下的文件
     * @param folderPath 目录
     */
    private void clean(String folderPath) {
        File folder = new File(folderPath)
        if (folder.exists() && folder.isDirectory()) {
            def files = folder.listFiles()
            files.each {
                if (it.isDirectory()) {
                    clean(it.getAbsolutePath())
                }
                //排除README.MD文件
                if (it.name != "README.MD") {
                    it.delete()
                }
            }
            println("[Mybatis Generator plugins]: Folder has been cleaned up...")
        } else {
            println("[Mybatis Generator plugins]: Folder does not exist or non-target task folder... ")
        }
    }
}

generatorConfig.xml

<?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>
    <!-- mybatis-generator:generate -->
    <!--targetRuntime="MyBatis3"-->
    <context id="MysqlTables" targetRuntime="tk.mybatis.mapper.generator.TkMyBatis3Impl">

        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 格式化java代码-->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!--生成实体类带Lombok注解-->
        <plugin type="com.softwareloop.mybatis.generator.plugins.LombokPlugin">
            <!-- 是否开启builder注解 -->
            <!--<property name="builder" value="false"/>-->
            <!-- annotation's option(boolean) -->
            <!--<property name="builder.fluent" value="false"/>-->
            <!-- annotation's option(String) -->
            <!--<property name="builder.builderMethodName" value="myBuilder"/>-->

            <!--<property name="accessors" value="true"/>-->
            <!-- annotation's option(array of String) -->
            <!--<property name="accessors.prefix" value="m_, _"/>-->

            <!-- 禁用的注解 -->
            <!--<property name="allArgsConstructor" value="false"/>-->
        </plugin>

        <!--生成实体类带数据库中文注释-->
        <!-- 格式化XML代码 -->
        <!--<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>-->
        <!-- 去掉生成出来的代码的注解 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>
        <!--定义生成数据库中的中文注释,关闭,编译会有问题,可以写完生成jar进行依赖-->
        <!--<commentGenerator type="com.var.im.commons.plugins.generator.MyBatisCommentGenerator">
        </commentGenerator>-->

        <jdbcConnection driverClass="${driverClass}"
                        connectionURL="${url}"
                        userId="${username}"
                        password="${password}"/>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="true"/>
        </javaTypeResolver>

        <javaModelGenerator targetPackage="${modelPackage}"
                            targetProject="${javaProject}">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <sqlMapGenerator
                targetPackage="${xmlPackage}"
                targetProject="${resourcesProject}">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <javaClientGenerator
                targetPackage="${mapperPackage}"
                targetProject="${javaProject}"
                type="${mapperType}"
        >

        </javaClientGenerator>
        <!-- 这里设置表的相关信息 -->
        <table tableName="${tableName}" domainObjectName="${objectName}" mapperName="${mapperName}"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false" modelType="flat">
            <property name="useActualColumnNames" value="false"/>
            <generatedKey column="${generatedKey}" sqlStatement="Mysql" identity="true"/>
            <!--sqlStatement="SELECT LAST_INSERT_ID()" />-->
        </table>
    </context>

</generatorConfiguration>

generatorConfigParam.gradle

ext {
    datasource = [
            /**
             * 数据库信息
             */
            driverClass: 'com.mysql.cj.jdbc.Driver',
            url        : 'jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF8',
            username   : 'test',
            password   : '0kcEOmUA1dboIca^'
    ]

    generator = [
            /**
             * 生成文件存放路径
             */
            resourcesProject: 'src/main/resources/generator/',
            javaProject     : 'src/main/resources/generator/',
            mapperPackage   : 'com.vcens.commons.repository.mapper',
            modelPackage    : 'com.vcens.commons.model.entity',
            xmlPackage      : 'com.vcens.commons.repository.mapper',
            mapperSuffix    : 'Mapper',
            mapperName    : '',
            mapperType      : 'ANNOTATEDMAPPER',
//            mapperType    : 'XMLMAPPER',

            /**
             * 生成文件配置
             */
            tableName       : 't_sys_config',
            objectName      : 'SysConfig',
            generatedKey    : 'id',
    ]

}

        代码中配置是默认生成注解的Mapper,如果需要调整为XML形式的Mapper,请修改generatorConfigParam.gradle配置文件中的generator.mapperType 字段值为XMLMAPPER  即可.

        为了方便实战操作,项目结构如下图:

 

        一切配置准备完成之后,IDEA中参见如下图可见新增generator插件并展开两个功能,执行generator即可完成代码生成。

转载于:https://my.oschina.net/vechar/blog/3053141

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值