EasyCode實現數據庫到Swagger全自動化


摘自:https://www.cnblogs.com/keatsCoder/p/11968704.html

EasyCode實現數據庫到Swagger全自動化

 

簡介

EasyCode是基於IntelliJ IDEA開發的代碼生成插件,通過自定義生成模板可以完成定制化的 Mapper Service Controller 生成,結合數據庫 Comment還可以實現從數據庫到 Swagger 的一鍵配置,非常的強大與方便,項目地址:EasyCode--碼雲 這里推薦大家使用

安裝

和一般的Idea插件安裝方式一樣,點擊 File -> Setting -> Plugins 搜索 EasyCode 點擊 Install 安裝即可,安裝之后需要重啟,當然如果是Idea最新的2019.3版本支持插件熱安裝就不需要重啟了。

image-20191201215718734

連接數據庫

安裝之后需要使用Idea連接數據庫,在Idea的右側有個DataBase選項卡,點擊之后選擇對應的數據庫。這邊我使用的是 Mysql 數據庫

image-20191201215907808

配置好連接名稱,連接路徑,賬號密碼和數據庫測試連接,測試通過后點擊OK,就可以成功的連接到數據庫,這里Idea的數據庫圖形化界面做的也挺好的。

image-20191201220127365

配置EasyCode的模板

1. 配置作者名稱

同樣是 File -> Settings -> other Settings 選擇 EasyCode 或者直接搜索 EasyCode 進行編輯,首先鍵入作者名稱,這樣在生成的類上面就會加上你的名字,時間等信息。

image-20191201220618628

2. Type Manager 映射類型管理

此頁面是用來建立數據庫字段類型與Java變量類型關系的,其中已經預先定義好了很多對應關系,但對於 tinyint((\d+))? unsigned (無符號的byte)類型卻沒有進行預定義,如果不進行手動配置,在進行逆向生成的時候會將其映射成 Java Object 類型,所以需要我們進行手動的添加關聯關系

image-20191201223534232

3. Template Setting 模板設置

image-20191201221538903

這個頁面就是我們主要需要配置的頁面了,我們可以自己新建一個模板組,也可以直接在原來模板文件的基礎上進行修改。這里我已經對原有的模板進行了自定義的修改,保留了 entity.java mapper.java mapper.xml service.java controller.java 去掉了原有的 dao serviceImpl.具體的模板內容如下,需要的朋友可以直接復制修改。

當然也可以點擊配置作者名稱頁面的導入模板按鈕,輸入對應的 Token 進行一鍵替換由於token只能保持6個小時,所以我就不在這里貼上了。

entity.java

實體類模板改動如下

  1. 刪除了原本的 Getter/Setter 采用 lombok 的 @Data 注解替換之
  2. 類添加 @ApiModel("$tableInfo.comment") 注解,讀取 Mysql 中表的注釋作為類在Swagger中的解釋
  3. 字段添加 @ApiModelProperty("$column.comment") 注解,讀取 Mysql 中字段的注釋作為對應參數在Swagger中的注釋
##引入宏定義
$!define

##使用宏定義設置回調(保存位置與文件后綴)
#save("/entity", ".java")

##使用宏定義設置包后綴
#setPackageSuffix("entity")

##使用全局變量實現默認包導入
$!autoImport
import java.io.Serializable;
import io.swagger.annotations.*;
import lombok.Data;

##使用宏定義實現類注釋信息
#tableComment("實體類")
@Data
@ApiModel("$tableInfo.comment")
public class $!{tableInfo.name} implements Serializable {
    private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
    #if(${column.comment})/**
    * ${column.comment}
    */#end
    
    @ApiModelProperty("$column.comment")
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
    
#end
}

mapper.java

Mapper接口改動如下

  1. 添加 @Mapper @Repository 注解
##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "Mapper")) ##設置回調 $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper")) ##拿到主鍵 #if(!$tableInfo.pkColumn.isEmpty()) #set($pk = $tableInfo.pkColumn.get(0)) #end #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}mapper; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; /** * $!{tableInfo.comment}($!{tableInfo.name})表數據庫訪問層 * * @author $!author * @since $!time.currTime() */ @Mapper @Repository public interface $!{tableName} { /** * 通過ID查詢單條數據 * * @param $!pk.name 主鍵 * @return 實例對象 */ $!{tableInfo.name} queryById($!pk.shortType $!pk.name); /** * 查詢指定行數據 * * @param offset 查詢起始位置 * @param limit 查詢條數 * @return 對象列表 */ List<$!{tableInfo.name}> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit); /** * 通過實體作為篩選條件查詢 * * @param $!tool.firstLowerCase($!{tableInfo.name}) 實例對象 * @return 對象列表 */ List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); /** * 新增數據 * * @param $!tool.firstLowerCase($!{tableInfo.name}) 實例對象 * @return 影響行數 */ int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); /** * 修改數據 * * @param $!tool.firstLowerCase($!{tableInfo.name}) 實例對象 * @return 影響行數 */ int update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); /** * 通過主鍵刪除數據 * * @param $!pk.name 主鍵 * @return 影響行數 */ int deleteById($!pk.shortType $!pk.name); }

mapper.xml

##引入mybatis支持
$!mybatisSupport

##設置保存名稱與保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))

##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="$!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper"> <resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}" id="$!{tableInfo.name}Map"> #foreach($column in $tableInfo.fullColumn) <result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/> #end </resultMap> <!--查詢單個--> <select id="queryById" resultMap="$!{tableInfo.name}Map"> select #allSqlColumn() from $!{tableInfo.obj.parent.name}.$!tableInfo.obj.name where $!pk.obj.name = #{$!pk.name} </select> <!--查詢指定行數據--> <select id="queryAllByLimit" resultMap="$!{tableInfo.name}Map"> select #allSqlColumn() from $!{tableInfo.obj.parent.name}.$!tableInfo.obj.name limit #{offset}, #{limit} </select> <!--通過實體作為篩選條件查詢--> <select id="queryAll" resultMap="$!{tableInfo.name}Map"> select #allSqlColumn() from $!{tableInfo.obj.parent.name}.$!tableInfo.obj.name <where> #foreach($column in $tableInfo.fullColumn) <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end"> and $!column.obj.name = #{$!column.name} </if> #end </where> </select> <!--新增所有列--> <insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true"> insert into $!{tableInfo.obj.parent.name}.$!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($velocityHasNext), #end#end) values (#foreach($column in $tableInfo.otherColumn)#{$!{column.name}}#if($velocityHasNext), #end#end) </insert> <!--通過主鍵修改數據--> <update id="update"> update $!{tableInfo.obj.parent.name}.$!{tableInfo.obj.name} <set> #foreach($column in $tableInfo.otherColumn) <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end"> $!column.obj.name = #{$!column.name}, </if> #end </set> where $!pk.obj.name = #{$!pk.name} </update> <!--通過主鍵刪除--> <delete id="deleteById"> delete from $!{tableInfo.obj.parent.name}.$!{tableInfo.obj.name} where $!pk.obj.name = #{$!pk.name} </delete> </mapper>

service.java

服務方法改動如下,這里我省略了 service 接口,而直接生成實現類。如果習慣於接口+實現類的使用方法可以保留接口和實現類,將@Servcie注解添加到接口上, Controller中繼續注入接口

##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "Service")) ##設置回調 $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/service")) ##拿到主鍵 #if(!$tableInfo.pkColumn.isEmpty()) #set($pk = $tableInfo.pkColumn.get(0)) #end #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; import $!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper; import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; /** * $!{tableInfo.comment}($!{tableInfo.name})表服務實現類 * * @author $!author * @since $!time.currTime() */ @Service("$!tool.firstLowerCase($!{tableInfo.name})Service") public class $!{tableName} { @Autowired private $!{tableInfo.name}Mapper $!tool.firstLowerCase($!{tableInfo.name})Mapper; /** * 通過ID查詢單條數據 * * @param $!pk.name 主鍵 * @return 實例對象 */ public $!{tableInfo.name} queryById($!pk.shortType $!pk.name) { return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.queryById($!pk.name); } /** * 查詢多條數據 * * @param offset 查詢起始位置 * @param limit 查詢條數 * @return 對象列表 */ public List<$!{tableInfo.name}> queryAllByLimit(int offset, int limit) { return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.queryAllByLimit(offset, limit); } /** * 新增數據 * * @param $!tool.firstLowerCase($!{tableInfo.name}) 實例對象 * @return 實例對象 */ public $!{tableInfo.name} insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) { this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.insert($!tool.firstLowerCase($!{tableInfo.name})); return $!tool.firstLowerCase($!{tableInfo.name}); } /** * 修改數據 * * @param $!tool.firstLowerCase($!{tableInfo.name}) 實例對象 * @return 實例對象 */ public $!{tableInfo.name} update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) { this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.update($!tool.firstLowerCase($!{tableInfo.name})); return this.queryById($!{tool.firstLowerCase($!{tableInfo.name})}.get$!tool.firstUpperCase($pk.name)()); } /** * 通過主鍵刪除數據 * * @param $!pk.name 主鍵 * @return 是否成功 */ public boolean deleteById($!pk.shortType $!pk.name) { return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.deleteById($!pk.name) > 0; } }

controller.java

控制層主要做了如下改動,

  1. 類上添加 @Api(tags = "$!{tableInfo.comment}($!{tableInfo.name})") 以在 Swagger 中顯示表注釋
  2. selectOne 方法添加 @ApiOperation(value = "根據id查詢 $!{tableInfo.comment}")
  3. 修改接口為 RestFul 格式調用,並添加對應的注解
##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "Controller")) ##設置回調 $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/controller")) ##拿到主鍵 #if(!$tableInfo.pkColumn.isEmpty()) #set($pk = $tableInfo.pkColumn.get(0)) #end #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service; import org.springframework.web.bind.annotation.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; /** * $!{tableInfo.comment}($!{tableInfo.name})表控制層 * * @author $!author * @since $!time.currTime() */ @Api(tags = "$!{tableInfo.comment}($!{tableInfo.name})") @RestController @RequestMapping("$!tool.firstLowerCase($tableInfo.name)") public class $!{tableName} { /** * 服務對象 */ @Autowired private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service; /** * 通過主鍵查詢單條數據 * * @param id 主鍵 * @return 單條數據 */ @ApiOperation(value = "根據id查詢 $!{tableInfo.comment}") @GetMapping("selectOne/{id}") public $!{tableInfo.name} selectOne(@ApiParam(value = "$!pk.comment ID") @PathVariable("id") $!pk.shortType id) { return this.$!{tool.firstLowerCase($tableInfo.name)}Service.queryById(id); } }

說明

說明文檔:
屬性
$author 設置中的作者 java.lang.String
$encode 設置的編碼 java.lang.String
$modulePath 選中的module路徑 java.lang.String
$projectPath 項目絕對路徑 java.lang.String

對象
$tableInfo 表對象
    obj 表原始對象 com.intellij.database.model.DasTable
    name 表名(轉換后的首字母大寫)java.lang.String comment 表注釋 java.lang.String fullColumn 所有列 java.util.List<ColumnInfo> pkColumn 主鍵列 java.util.List<ColumnInfo> otherColumn 其他列 java.util.List<ColumnInfo>,除主鍵以外的列 savePackageName 保存的包名 java.lang.String savePath 保存路徑 java.lang.String saveModelName 保存的model名稱 java.lang.String columnInfo 列對象 obj 列原始對象 com.intellij.database.model.DasColumn name 列名(首字母小寫) java.lang.String comment 列注釋 java.lang.String type 列類型(類型全名) java.lang.String shortType 列類型(短類型) java.lang.String custom 是否附加列 java.lang.Boolean ext 附加字段(Map類型) java.lang.Map<java.lang.String, java.lang.Object> $tableInfoList java.util.List<TableInfo>所有選中的表 $importList 所有需要導入的包集合 java.util.Set<java.lang.String> 回調 &callback setFileName(String) 設置文件儲存名字 setSavePath(String) 設置文件儲存路徑,默認使用選中路徑 工具 $tool firstUpperCase(String name) 首字母大寫方法 firstLowerCase(String name) 首字母小寫方法 getClsNameByFullName(String fullName) 通過包全名獲取類名 getJavaName(String name) 將下划線分割字符串轉駝峰命名(屬性名) getClassName(String name) 將下划線分割字符串轉駝峰命名(類名) append(Object... objs) 多個數據進行拼接 newHashSet(Object... objs) 創建一個HashSet對象 newArrayList(Object... objs) 創建一個ArrayList對象 newLinkedHashMap() 創建一個LinkedHashMap()對象 newHashMap() 創建一個HashMap()對象 getField(Object obj, String fieldName) 獲取對象的屬性值,可以訪問任意修飾符修飾的屬性.配合debug方法使用. call(Object... objs) 空白執行方法,用於調用某些方法時消除返回值 debug(Object obj) 調式方法,用於查詢對象結構.可查看對象所有屬性與public方法 serial() 隨機獲取序列化的UID service(String serviceName, Object... param)遠程服務調用 parseJson(String) 將字符串轉Map對象 toJson(Object, Boolean) 將對象轉json對象,Boolean:是否格式化json,不填時為不格式化。 $time currTime(String format) 獲取當前時間,指定時間格式(默認:yyyy-MM-dd HH:mm:ss) $generateService run(String, Map<String,Object>) 代碼生成服務,參數1:模板名稱,參數2:附加參數。

4. 一鍵生成

點擊Idea右邊的DataBase選項卡,選擇剛剛連接的數據庫,選好對應的表格,點擊右鍵選擇 EasyCode -> Generate Code, 如果出現下面的提示,就復制類型后面的字段,到第2步進行配置

image-20191201224527473

配置完成后重新點擊 Generate Code 會出現如下的配置框,選好路徑后點擊OK,就會生成對應的代碼。

image-20191201224658375

之后啟動項目,訪問Swagger路徑就可以看到對應的配置已經完全自動化生成。這樣我們只需要在創建表的時候對字段進行注釋,就可以實現 Entity中和前后端交互時的自動化注釋。非常方便

image-20191201225214326

我是 Keats @后青春期的Keats ,一個熱愛技術的程序員,鑒於技術有限,如果本文有什么紕漏或者兄台還有其他更好的建議/實現方式,歡迎留言評論,謝謝您!

 
分類:  框架


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM