这是一个MyBatis代码的代码生成器。阅读本文或使用本文代码可能需要一定的Gradle技术基础。
现在使用Gradle来管理的项目越来越多,这个使用Gradle操作的代码生成器插件写了很久了,最近整理项目发现也算比较实用,就拿出来分享一下,记得之前在网上参考了许多配置,关于使用Gradle配置的MyBatisGenerator很少,也或者自己可能不是很满意,所以就动手写了一个。功能很简单,操作也比较自由。
特点:
插件依赖如下:
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即可完成代码生成。