代码编程软件生成器(编程代码自动生成)
代码编程软件生成器(编程代码自动生成)
背景
本来code-builder是专门为MyBatis Enhance来编写的一块代码生成器
code-builder可以用来做什么?
code-builder是一款代码生成maven mojo插件,通过简单的配置就可以完成数据库内Table转换Entity或者其他实体类,想怎么生成完全根据你的个人业务逻辑,code-builder尽可能的完善的提供数据库内的一些定义的信息,让你更方便更灵活的来生成Java文件。
使用环境
实现方式
是怎么获取到的数据库信息?
code-builder内部采用了java.sql.Connection的MetaData元数据的方式来获取数据库内Table、Column等信息,MetaData是不局限于任何的数据库类型的,所以code-builder在基础设计上是可以在任何数据库类型中来完成它的生成任务的,不过初版本仅支持了mysql、MariaDB这两种数据库类型,在code-builder后期更新版本中会把主流的数据库进行添加。
生成模板选型
目前code-builder内部采用了freemarker模板来完成实体类的自动生成,模板由使用者来自定义编写,内部预留了使用其他模板的方式,如果你需要使用别的模板,如:Velocity,对应添加生成的实现业务逻辑即可。
怎么配置?
SpringBoot 方式配置
在1.0.5.RELEASE版本添加了集成SpringBoot的starter,依赖如下所示:
<dependency> <groupId>com.gitee.hengboy</groupId> <artifactId>code-builder-spring-boot-starter</artifactId> <version>1.0.5.RELEASE</version></dependency>如果你是用的Gradle构建工具,那么下面的内容到你的build.gradle
compile group: 'com.gitee.hengboy', name: 'code-builder-spring-boot-starter', version: '1.0.5.RELEASE'
那么我们在application.yml或者application.properties配置文件内该怎么配置相关的参数呢?
hengboy: code: builder: execute: true configuration: package-prefix: com.code.builder.sample.codebuildersample templates: - name: entity.ftl packageName: model fileSuffix: Entity - name: service.ftl packageName: service fileSuffix: Service - name: controller.ftl packageName: controller fileSuffix: Controller generator-by-pattern: '%app_user_info%' db-type: mysql engine-type-enum: freemarker builder-dir: classes.templates.builder target-dir: generated-sources.java tables: - app_shop_type - app_user_exchange_good ignore-class-prefix: App
每个参数的具体介绍请往下看。
Maven Plugin 方式配置
由于code-builder是Maven mojo插件的形式创建的,所以我们只需要在项目的pom.xml文件内添加plugin插件配置,如下所示:
<plugin> <groupId>com.gitee.hengboy</groupId> <artifactId>code-builder-maven-plugin</artifactId> <version>1.0.5.RELEASE</version> <executions> <execution> <goals> <goal>generator</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> </dependencies> <configuration> <execute>true</execute> <dbType>MySQL</dbType> <dbDriverClassName>com.mysql.jdbc.Driver</dbDriverClassName> <dbName> </dbName> <dbUserName> </dbUserName> <dbPassword> x</dbPassword> <dbUrl>jdbc:mysql:// x. . . :3306</dbUrl> <tables> <table>app_shop_type</table> <table>app_user_exchange_good</table> </tables> <engineType>FREEMARKER</engineType> <generatorByPattern>%app_user_info%</generatorByPattern> <ignoreClassPrefix>App</ignoreClassPrefix> <builderDir>classes.templates.builder</builderDir> <builder> <packagePrefix>com.code.builder.sample</packagePrefix> <templates> <template> <name>entity.ftl</name> <packageName>model</packageName> </template> <template> <name>service.ftl</name> <packageName>service</packageName> <fileSuffix>Service</fileSuffix> </template> <template> <name>mapper.ftl</name> <packageName>mapper</packageName> <fileSuffix>Mapper</fileSuffix> </template> </templates> </builder> </configuration></plugin>
数据库驱动依赖添加
code-builder不局限你使用的数据库类型,所以在生成时需要使用者添加对应数据类型的依赖,如上面的配置中则是添加了MySQL数据库的依赖
.....<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency></dependencies>.....
生成的控制开关
并不是每一次的编译或者打包时都需要生成对应的实体,针对这种情况code-builder添加了execute参数来控制开启与关闭。
数据库类型配置
执行自动生成前需要配置数据库的相关配置信息
数据库基本信息配置 (仅maven-plugin使用)
生成表名符规则的表
根据表达式来创建表,表达式与模糊查询语句表达式一般无二,配置generatorByPattern参数并设置对应的表达式就可以根据表达式来匹配出参与生成的Table列表。
<generatorByPattern>app_order%</generatorByPattern>
示例:将会匹配出app_order_info、app_order_record等表。
<generatorByPattern>%order</generatorByPattern>
示例:将会匹配出app_good_order、app_exchange_order等表。
<generatorByPattern>%order%</generatorByPattern>
示例:将会匹配出app_order_info、app_good_order等表。
生成指定表
code-builder支持指定单个或者多个表来生成,只需要配置tables参数即可,如下所示:
<tables> <table>app_shop_type</table> <table>app_user_exchange_good</table></tables>
上面的配置是本次生成仅操作app_shop_type、app_user_exchange_good两张表。
注意:tables参数的优先级要高于generatorByPattern参数。
自定义builder所需模板路径
code-builder会自动去找classes/templates/builder下的模板,如果使用默认的freemarker模板来生成,那么模板所存放的位置为classes/templates/builder/freemarker。 如果你想自定义模板的路径可以设置builderDir的地址,在这里因为考虑到了不同操作系统的分隔符不一样(Windows系统分隔符\\,Linux以及O SX分隔符为/)所以这里采用.分隔符配置,code-builder会自动根据操作系统来转换路径,配置如下所示:
<builderDir>classes.code.builder</builderDir>
注意:freemarker文件夹不允许修改,只能修改code-builder加载模板的根路径。
排除生成实体后的前缀
数据库设计有时需要添加前缀,如:app_、sys_等,实际生成实体后前缀则是并不想展示,那么配置参数ignoreClassPrefix就可以自动排除前缀,如下所示:
<ignoreClassPrefix>App</ignoreClassPrefix>
注意:由于替换生成后的类名称所以这里要准守驼峰名规则首字母大写,一次只能配置一个替换前缀。
使用前AppUserInfoEntity,使用后UserInfoEntity。
模板配置
使用templates标签配置自定义的模板列表,一次可以使用单个或者多个模板进行生成,如下配置:
<templates> <template> <name>entity.ftl</name> <packageName>entity</packageName> <fileSuffix>entity</fileSuffix> </template> <template> <name>service.ftl</name> <packageName>service</packageName> <fileSuffix>Service</fileSuffix> </template> <template> <name>mapper.ftl</name> <packageName>mapper</packageName> <fileSuffix>Mapper</fileSuffix> </template></templates>name :freemarker目录下模板的名称,必填packageName:生成该模板文件后的子包名称,非必填fileSuffix:生成文件的后缀,如:配置后缀为Entity,则添加后缀后的文件名为UserInfoEntity,后缀首字母会自动根据驼峰转换成大写
内置参数
模板驱动数据模型内置了部分参数,code-builder准备的每一个参数都是在生成实体类时都可能会用到的。
Table参数
使用方式
freemarker模板:${table. x},如表名的使用为${table.tableName}
Column参数
使用方式
freemarker模板:${column. x},如列名的使用为${column.columnName}
基础参数
怎么自定义模板?
下面提供一个简单的模板示例,根据上面的内置参数可以任意自定义生成文件的内容。
创建的实体类会在target/generated-sources/java目录下,如果你配置packagePrefix参数,会自动在生成目录下创建packagePrefix配置值的子目录。 如:
<packagePrefix>com.code.builder.sample</packagePrefix>
则最终创建的生成根目录为:target/generated-sources/java/com/code/builder/sample
怎么使用?
SpringBoot 方式使用
Maven Plugin 方式使用
为什么SpringBoot方式不用配置数据库信息?
Maven Plugin方式是通过配置的数据库连接信息以及数据库连接驱动获取数据库连接对象Connection后来操作JDBC元数据。
而SpringBoot方式则是直接使用项目中配置的DataSource对象实例来进行获取的Connection数据库连接对象后来操作JDBC元数据。
注意:如果你是多数据源项目,默认会使用primary数据源实例。