背景
本來code-builder是專門為MyBatis Enhance來編寫的一塊代碼生成器
code-builder可以用來做什麼?
code-builder是一款代碼生成maven mojo插件,通過簡單的配置就可以完成數據庫內Table轉換Entity或者其他實體類,想怎麼生成完全根據你的個人業務邏輯,code-builder儘可能的完善的提供數據庫內的一些定義的信息,讓你更方便更靈活的來生成Java文件。
使用環境
- Maven構建的項目
- JDK 1.6以上版本
實現方式
是怎麼獲取到的數據庫信息?
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,依賴如下所示:
- 使用Maven構建工具時,複製下面的內容到pom.xml配置文件內
<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>xxxx/<dbname>
<dbusername>xxxx/<dbusername>
<dbpassword>xxxxx/<dbpassword>
<dburl>jdbc:mysql://xxx.xx.xx.xx: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>
\t\t <templates>
\t\t <template>
\t\t <name>entity.ftl/<name>
\t\t <packagename>model/<packagename>
\t\t /<template>
\t\t <template>
\t\t <name>service.ftl/<name>
\t\t <packagename>service/<packagename>
\t\t <filesuffix>Service/<filesuffix>
\t\t /<template>
\t\t <template>
\t\t <name>mapper.ftl/<name>
\t\t <packagename>mapper/<packagename>
\t\t <filesuffix>Mapper/<filesuffix>
\t\t /<template>
\t\t /<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參數來控制開啟與關閉。
- true:開啟自動生成
- false:關閉自動生成
數據庫類型配置
執行自動生成前需要配置數據庫的相關配置信息
- dbType:數據庫類型,默認使用MySQL數據庫類型。
- dbDriverClassName:數據庫驅動類名,根據不用的數據庫類型配置不同的驅動類名,默認根據dbType使用內部定義的類名,如需自定義可以設置。(僅maven-plugin使用)
數據庫基本信息配置 (僅maven-plugin使用)
- dbName:數據庫名稱
- dbUserName:數據庫用戶名
- dbPassword:數據庫密碼
- dbUrl:數據庫連接路徑,連接路徑不需要填寫數據庫名,正確示例如:jdbc:mysql://localhost:3306
生成表名符合規則的表
根據表達式來創建表,表達式與模糊查詢語句表達式一般無二,配置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參數
- tableName 表名,數據類型:java.lang.String
- remark 表備註信息,數據類型:java.lang.String
- entityName 實體類名稱,如:user_info轉換為userInfo,數據類型:java.lang.String
- columns 列列表,數據類型:java.util.List<column>
- primaryKeys 主鍵列表,數據類型:java.util.List<column>
- hasSqlDate 是否存在java.sql.Date類型,true:存在,false:不存在,數據類型:java.lang.Boolean
- hasTimeStamp 是否存在java.sql.TimeStamp類型,true:存在,false:不存在,數據類型:java.lang.Boolean
- hasBigDecimal 是否存在java.math.BigDecimal類型,true:存在,false:不存在,數據類型:java.lang.Boolean
使用方式
freemarker模板:${table.xxx},如表名的使用為${table.tableName}
Column參數
- columnName 列名,如:user_id,數據類型:java.lang.String
- primaryKey 是否為主鍵,數據類型:java.lang.Boolean,true:主鍵,false:非主鍵
- foreignKey 是否為外鍵,數據類型:java.lang.Boolean,true:外鍵,false:非外鍵
- size 列長度,數據類型:java.lang.Integer
- decimalDigits 小數點精度,數據類型:java.lang.Integer
- nullable 列是否為空,數據類型:java.lang.Boolean,true:為空,false:非空
- autoincrement 是否自增,數據類型:java.lang.Boolean,true:自增列,false:普通列
- defaultValue 默認值,數據類型:java.lang.String
- remark 列備註,數據類型:java.lang.String
- jdbcType JDBC類型,對應java.sql.Types內類型,數據類型:java.lang.Integer
- jdbcTypeName JDBC類型名稱,數據類型:java.lang.String
- javaProperty 格式化後的屬性名稱,如:userId,數據類型:java.lang.String
- javaType Java數據類型短名,如:TimeStamp,數據類型:java.lang.String
- fullJavaType Java數據類型全名,如:java.sql.TimeStamp,數據類型:java.lang.String
使用方式
freemarker模板:${column.xxx},如列名的使用為${column.columnName}
基礎參數
- className:Class名稱,freemarker指定模板生成文件的類名,模板內配置${className}使用
- packageName:Package名稱,freemarker指定模板生成文件的包名,模板內配置${packageName}使用
怎麼自定義模板?
下面提供一個簡單的模板示例,根據上面的內置參數可以任意自定義生成文件的內容。
package ${packageName};
#if>
import lombok.Data;
import java.sql.Date;
#if>
import java.sql.Timestamp;
#if>
import java.math.BigDecimal;
#if>
/**
*本類代碼由code-builder自動生成
*表名: ${table.tableName} - ${table.remark}
* ===============================
* Created with code-builder.
* User:恆宇少年
* Date:${.now}
* 簡書:http://www.jianshu.com/u/092df3f77bca
* 碼雲:https://gitee.com/hengboy
* ================================
*/
@Data
public class ${className} {
/**
* ${key.columnName} - ${key.remark}
*/
private ${key.javaType} ${key.javaProperty};
#list>
/**
* ${column.columnName} - ${column.remark}
*/
private ${column.javaType} ${column.javaProperty};
#if>
#list>
}
上面是一個數據實體的freemarker模板內容,把這個模板存放到freemarker目錄下,對應在templates標籤內添加配置就可以完成數據實體的自動創建,創建後的數據實體內容如下所示:
package com.code.builder.sample.model;
import lombok.Data;
import java.sql.Timestamp;
/**
*本類代碼由code-builder自動生成
*表名: app_balance_type - 餘額類型信息表
* ===============================
* Created with code-builder.
* User:恆宇少年
* Date:Jul 17, 2018 9:09:13 PM
* 簡書:http://www.jianshu.com/u/092df3f77bca
* 碼雲:https://gitee.com/hengboy
* ================================
*/
@Data
public class BalanceTypeEntity {
/**
* BT_ID - 餘額類型主鍵
*/
private String btId;
/**
* BT_NAME - 餘額類型名稱
*/
private String btName;
/**
* BT_FLAG - 餘額類型標識
*/
private String btFlag;
/**
* BT_CREATE_TIME - 添加時間
*/
private Timestamp btCreateTime;
/**
* BT_MARK - 餘額類型備註信息
*/
private String btMark;
}
創建的實體類去了哪裡?
創建的實體類會在target/generated-sources/java目錄下,如果你配置packagePrefix參數,會自動在生成目錄下創建packagePrefix配置值的子目錄。 如:
<packageprefix>com.code.builder.sample/<packageprefix>
則最終創建的生成根目錄為:target/generated-sources/java/com/code/builder/sample
怎麼使用?
SpringBoot 方式使用
- 運行項目就可以根據配置生成對應的文件
Maven Plugin 方式使用
- 執行mvn clean命令用於清空target目錄下的內容
- 執行mvn compile命令編譯項目並且生成實體類
為什麼SpringBoot方式不用配置數據庫信息?
Maven Plugin方式是通過配置的數據庫連接信息以及數據庫連接驅動獲取數據庫連接對象Connection後來操作JDBC元數據。
而SpringBoot方式則是直接使用項目中配置的DataSource對象實例來進行獲取的Connection數據庫連接對象後來操作JDBC元數據。
注意:如果你是多數據源項目,默認會使用primary數據源實例。
私信回覆"code-builder"獲取鏈接地址,喜歡的點個關注,一起學習探討新技術。
閱讀更多 儒雅程序員 的文章