歡迎使用開源的代碼生成器Code-Builder

背景

原本code-builder是專門爲MyBatis Enhance來編寫的一塊代碼生成器,不過僅僅使用到Enhance卻沒有什麼新鮮感,因此把生成這塊分離出來提供給你們使用,但願能夠對提升項目研發效率提供一些幫助。java

code-builder能夠用來作什麼?

code-builder是一款代碼生成maven mojo插件,經過簡單的配置就能夠完成數據庫內Table轉換Entity或者其餘實體類,想怎麼生成徹底根據你的我的業務邏輯,code-builder儘量的完善的提供數據庫內的一些定義的信息,讓你更方便更靈活的來生成Java文件。mysql

歡迎關注公衆號

微信公衆號
關注微信公衆號,回覆 加羣,獲取交流羣羣號。

源碼地址

歡迎去碼雲進行Issue、喜歡的給我來個Star吧git

使用環境

  • Maven構建的項目
  • JDK 1.6以上版本

實現方式

是怎麼獲取到的數據庫信息?

code-builder內部採用了java.sql.ConnectionMetaData元數據的方式來獲取數據庫內TableColumn等信息,MetaData是不侷限於任何的數據庫類型的,因此code-builder在基礎設計上是能夠在任何數據庫類型中來完成它的生成任務的,不過第一版本僅支持了MySQLMariaDB這兩種數據庫類型,在code-builder後期更新版本中會把主流的數據庫進行添加。github

生成模板選型

目前code-builder內部採用了freemarker模板來完成實體類的自動生成,模板由使用者來自定義編寫,內部預留了使用其餘模板的方式,若是你須要使用別的模板,如:Velocity,對應添加生成的實現業務邏輯便可。spring

怎麼配置?

SpringBoot 方式配置

1.0.3.RELEASE版本添加了集成SpringBootstarter,依賴以下所示:sql

  • 使用Maven構建工具時,複製下面的內容到pom.xml配置文件內
<dependency>
    <groupId>com.gitee.hengboy</groupId>
    <artifactId>code-builder-spring-boot-starter</artifactId>
    <version>1.0.3.RELEASE</version>
</dependency>
複製代碼
  • 若是你是用的Gradle構建工具,那麼複製下面的內容到你的build.gradle
compile group: 'com.gitee.hengboy', name: 'code-builder-spring-boot-starter', version: '1.0.3.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
複製代碼

每一個參數的具體介紹請往下看。bash

Maven Plugin 方式配置

因爲code-builderMaven mojo插件的形式建立的,因此咱們只須要在項目的pom.xml文件內添加plugin插件配置,以下所示:微信

<plugin>
    <groupId>com.gitee.hengboy</groupId>
    <artifactId>code-builder-maven-plugin</artifactId>
    <version>1.0.3.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>
		         <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數據庫的依賴app

.....
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
</dependencies>
.....
複製代碼

僅僅在使用Maven-Plugin形式添加數據驅動依賴

生成的控制開關

並非每一次的編譯或者打包時都須要生成對應的實體,針對這種狀況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_infoapp_order_record等表。

  • 指定後綴匹配
<generatorByPattern>%order</generatorByPattern>
複製代碼

示例:將會匹配出app_good_orderapp_exchange_order等表。

  • 包含匹配
<generatorByPattern>%order%</generatorByPattern>
複製代碼

示例:將會匹配出app_order_infoapp_good_order等表。

生成指定表

code-builder支持指定單個或者多個表來生成,只須要配置tables參數便可,以下所示:

<tables>
    <table>app_shop_type</table>
    <table>app_user_exchange_good</table>
</tables>
複製代碼

上面的配置是本次生成僅操做app_shop_typeapp_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>
複製代碼
  • namefreemarker目錄下模板的名稱,必填
  • 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.Booleantrue:主鍵,false:非主鍵
  • foreignKey 是否爲外鍵,數據類型:java.lang.Booleantrue:外鍵,false:非外鍵
  • size 列長度,數據類型:java.lang.Integer
  • decimalDigits 小數點精度,數據類型:java.lang.Integer
  • nullable 列是否爲空,數據類型:java.lang.Booleantrue:爲空,false:非空
  • autoincrement 是否自增,數據類型:java.lang.Booleantrue:自增列,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}使用

怎麼自定義模板?

下面提供一個簡單的模板示例,根據上面的內置參數能夠任意自定義生成文件的內容。

<#if (packageName)??>
package ${packageName};
</#if>
import lombok.Data;

<#if (table.hasSqlDate)>
import java.sql.Date;
</#if>
<#if (table.hasTimeStamp)>
import java.sql.Timestamp;
</#if>
<#if (table.hasBigDecimal)>
import java.math.BigDecimal;
</#if>
/**
 * <p>本類代碼由code-builder自動生成</p>
 * <p>表名: ${table.tableName} - ${table.remark}</p>
 * ===============================
 * Created with code-builder.
 * User:恆宇少年
 * Date:${.now}
 * 簡書:http://www.jianshTu.com/u/092df3f77bca
 * 碼雲:https://gitee.com/hengboy
 * ================================
 */
@Data
public class ${className} {
<#list table.primaryKeys as key>
    /**
     * ${key.columnName} - ${key.remark}
     */
    private ${key.javaType} ${key.javaProperty};
</#list>
<#list table.columns as column>
    <#if (!column.primaryKey)>
    /**
     * ${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;
/**
 * <p>本類代碼由code-builder自動生成</p>
 * <p>表名: app_balance_type - 餘額類型信息表</p>
 * ===============================
 * Created with code-builder.
 * User:恆宇少年
 * Date:Jul 17, 2018 9:09:13 PM
 * 簡書:http://www.jianshTu.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 方式使用

  1. 運行項目就能夠根據配置生成對應的文件

Maven Plugin 方式使用

  1. 執行mvn clean命令用於清空target目錄下的內容
  2. 執行mvn compile命令編譯項目而且生成實體類

爲何SpringBoot方式不用配置數據庫信息?

Maven Plugin方式是經過配置的數據庫鏈接信息以及數據庫鏈接驅動獲取數據庫鏈接對象Connection後來操做JDBC元數據

SpringBoot方式則是直接使用項目中配置的DataSource對象實例來進行獲取的Connection數據庫鏈接對象後來操做JDBC元數據

注意:若是你是多數據源項目,默認會使用primary數據源實例。

相關文章
相關標籤/搜索