SpringBoot--Easycode外掛自定義模板
最近準備做個專案,在配置專案環境的時候,使用Easycode外掛生成entity,controller,service,dao,mapper,前面只是單純地介紹了Easycode外掛的整合,但由於使用的是Easycode外掛預設的模板,導致最終生成的檔案與自己想要的效果有所差別。
所以花了一下午的時間研究如何自定義模板,最終設計出了一套比較完整的模板。
資料型別對映
首先開啟idea——Settings——OtherSettings——EasyCode
如圖所示,Type Mapper是資料型別對映,簡單點來說就是資料庫的欄位的型別與實體類屬性的型別相對應,基本上都預設的對應規則,這其實沒什麼好說的,如果生成實體類的時候提示某個屬性沒有找到對應的資料型別,就照貓畫虎新增上去就行了。
自定義模板
實體類entity.java
首先,這裡使用lombok外掛來代替Getter、Setter方法;按照模板預設的生成也可以。(複製貼上替換預設的就行)
1 ##引入巨集定義 2 $!define 3 4 ##使用巨集定義設定回撥(儲存位置與檔案字尾) 5 #save("/entity", ".java") 6 7 ##使用巨集定義設定包字尾 8 #setPackageSuffix("entity") 9 10 ##使用全域性變數實現預設包匯入 11 $!autoImport 12 import java.io.Serializable; 13 importView Codelombok.Data; 14 ## 15 ####使用巨集定義實現類註釋資訊 16 ###tableComment("實體類") 17 @Data 18 public class $!{tableInfo.name} implements Serializable { 19 private static final long serialVersionUID = $!tool.serial(); 20 #foreach($column in $tableInfo.fullColumn) 21 #if(${column.comment})/** 22 * ${column.comment}23 */ 24 #end 25 26 private $!{tool.getClsNameByFullName($column.type)} $!{column.name}; 27 ## private $!{tool.getClsNameByFullName($column.type)} $!{tool.firstUpperCase($column.name)}; 28 #end 29 30 31 ##若沒有使用lombok外掛,該段不要註釋,按照預設的模板 32 ###foreach($column in $tableInfo.fullColumn) 33 ####使用巨集定義實現get,set方法 34 ###getSetMethod($column) 35 ###end 36 37 }
測試
生成效果(註釋對應資料庫,摺疊起來就行)
DAO層dao.java
1 ##定義初始變數 2 #set($tableName = $tool.append($tableInfo.name, "Dao")) 3 ##設定回撥 4 $!callback.setFileName($tool.append($tableName, ".java")) 5 $!callback.setSavePath($tool.append($tableInfo.savePath, "/dao")) 6 7 ##拿到主鍵 8 #if(!$tableInfo.pkColumn.isEmpty()) 9 #set($pk = $tableInfo.pkColumn.get(0)) 10 #end 11 12 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}dao; 13 14 import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; 15 import java.util.List; 16 17 /** 18 * $!{tableInfo.comment}($!{tableInfo.name})表資料庫訪問層 19 * @author 北林 20 */ 21 22 public interface $!{tableName} { 23 24 //通過ID查詢 25 $!{tableInfo.name} selectById($!pk.shortType $!pk.name); 26 27 //查詢所有資料 28 List<$!{tableInfo.name}> selectAll(); 29 30 ## //通過實體作為篩選條件查詢 31 ## List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); 32 33 //新增資料 34 int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); 35 36 //修改資料 37 int updateById($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); 38 39 //通過主鍵id刪除資料 40 int deleteById($!pk.shortType $!pk.name); 41 42 }View Code
生成效果
對映檔案mapper.xml
1 ##引入mybatis支援 2 $!mybatisSupport 3 4 ##設定儲存名稱與儲存位置 5 $!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml")) 6 $!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper")) 7 8 ##拿到主鍵 9 #if(!$tableInfo.pkColumn.isEmpty()) 10 #set($pk = $tableInfo.pkColumn.get(0)) 11 #end 12 13 <?xml version="1.0" encoding="UTF-8"?> 14 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 15 <mapper namespace="$!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao"> 16 17 <resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}" id="$!{tableInfo.name}Map"> 18 #foreach($column in $tableInfo.fullColumn) 19 <result property="$!{column.name}" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/> 20 #end 21 </resultMap> 22 23 <sql id="BaseResult"> 24 #allSqlColumn() 25 </sql> 26 27 <!--根據id查詢--> 28 <select id="selectById" resultType="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}"> 29 select<include refid="BaseResult"/> 30 from $!tableInfo.obj.name 31 where $!pk.obj.name = #{$!pk.name} 32 </select> 33 34 <!--查詢所有資料--> 35 <select id="selectAll" resultMap="$!{tableInfo.name}Map"> 36 select<include refid="BaseResult"/> 37 from $!tableInfo.obj.name 38 </select> 39 ## 40 ## <!--通過實體作為篩選條件查詢--> 41 ## <select id="queryAll" resultMap="$!{tableInfo.name}Map"> 42 ## select<include refid="BaseResult"/> 43 ## from $!tableInfo.obj.name 44 ## <where> 45 ###foreach($column in $tableInfo.fullColumn) 46 ## <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end"> 47 ## and $!column.obj.name = #{$!column.name} 48 ## </if> 49 ###end 50 ## </where> 51 ## </select> 52 53 <!--新增所有列--> 54 <insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true"> 55 insert into $!{tableInfo.obj.name}(<include refid="BaseResult"/>) 56 values (#null,#foreach($column in $tableInfo.otherColumn)#{$!{column.name}}#if($velocityHasNext), #end#end) 57 </insert> 58 59 <!--通過主鍵id修改資料--> 60 <update id="updateById"> 61 update $!{tableInfo.obj.name} 62 <set> 63 #foreach($column in $tableInfo.otherColumn) 64 <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end"> 65 $!column.obj.name = #{$!column.name}, 66 </if> 67 #end 68 </set> 69 where $!pk.obj.name = #{$!pk.name} 70 </update> 71 72 <!--通過主鍵id刪除--> 73 <delete id="deleteById"> 74 delete from $!{tableInfo.obj.name} where $!pk.obj.name = #{$!pk.name} 75 </delete> 76 77 </mapper>View Code
生成效果(部分截圖)
這裡需要注意的是對映檔案中的id跟dao層的方法名是一一對應的,如果修改了dao層的方法名,對映檔案的id也需要修改。
Service層service.java
1.首先新增分頁外掛的依賴
1 <dependency> 2 <groupId>com.github.pagehelper</groupId> 3 <artifactId>pagehelper-spring-boot-starter</artifactId> 4 <version>1.2.5</version> 5 </dependency>
2.設計service.java模板
1 ##定義初始變數 2 #set($tableName = $tool.append($tableInfo.name, "Service")) 3 ##設定回撥 4 $!callback.setFileName($tool.append($tableName, ".java")) 5 $!callback.setSavePath($tool.append($tableInfo.savePath, "/service")) 6 7 ##拿到主鍵 8 #if(!$tableInfo.pkColumn.isEmpty()) 9 #set($pk = $tableInfo.pkColumn.get(0)) 10 #end 11 12 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service; 13 14 import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; 15 import java.util.List; 16 import com.github.pagehelper.PageInfo; 17 18 19 /** 20 * $!{tableInfo.comment}($!{tableInfo.name})表服務介面 21 * @author 北林 22 */ 23 public interface $!{tableName} { 24 25 //通過ID查詢 26 $!{tableInfo.name} selectById($!pk.shortType $!pk.name); 27 28 //查詢所有資料並分頁 29 PageInfo<$!{tableInfo.name}> selectAll(int pageNum, int pageSize); 30 31 ## //通過實體作為篩選條件查詢 32 ## List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); 33 34 //新增資料 35 int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); 36 37 //修改資料 38 int updateById($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); 39 40 //通過主鍵id刪除資料 41 int deleteById($!pk.shortType $!pk.name); 42 43 }View Code
生成效果
Service層實現類serviceImpl.java
1 ##定義初始變數 2 #set($tableName = $tool.append($tableInfo.name, "ServiceImpl")) 3 ##設定回撥 4 $!callback.setFileName($tool.append($tableName, ".java")) 5 $!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl")) 6 7 ##拿到主鍵 8 #if(!$tableInfo.pkColumn.isEmpty()) 9 #set($pk = $tableInfo.pkColumn.get(0)) 10 #end 11 12 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl; 13 14 import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; 15 import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao; 16 import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service; 17 import org.springframework.stereotype.Service; 18 import org.springframework.beans.factory.annotation.Autowired; 19 import org.springframework.transaction.annotation.Transactional; 20 import com.github.pagehelper.PageHelper; 21 import com.github.pagehelper.PageInfo; 22 23 import javax.annotation.Resource; 24 import java.util.List; 25 26 /** 27 * $!{tableInfo.comment}($!{tableInfo.name})表服務實現類 28 * @author 北林 29 */ 30 @Service 31 @Transactional 32 public class $!{tableName} implements $!{tableInfo.name}Service { 33 @Autowired 34 private $!{tableInfo.name}Dao $!tool.firstLowerCase($!{tableInfo.name})Dao; 35 36 /** 37 * 通過ID查詢單條資料 38 * @param $!pk.name 主鍵 39 * @return 例項物件 40 */ 41 @Override 42 public $!{tableInfo.name} selectById($!pk.shortType $!pk.name) { 43 return $!{tool.firstLowerCase($!{tableInfo.name})}Dao.selectById($!pk.name); 44 } 45 46 /** 47 * 查詢多條資料 48 * @param pageNum 查詢起始位置 49 * @param pageSize 查詢條數 50 * @return 物件列表 51 */ 52 @Override 53 public PageInfo selectAll(int pageNum, int pageSize) { 54 PageHelper.startPage(pageNum,pageSize); 55 List<$!{tableInfo.name}> dataList = $!{tool.firstLowerCase($!{tableInfo.name})}Dao.selectAll(); 56 PageInfo<$!{tableInfo.name}> page = new PageInfo<$!{tableInfo.name}>(dataList); 57 return page; 58 } 59 60 /** 61 * 新增資料 62 * @param $!tool.firstLowerCase($!{tableInfo.name}) 例項物件 63 * @return 例項物件 64 */ 65 @Override 66 public int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) { 67 return $!{tool.firstLowerCase($!{tableInfo.name})}Dao.insert($!tool.firstLowerCase($!{tableInfo.name})); 68 } 69 70 /** 71 * 修改資料 72 * @param $!tool.firstLowerCase($!{tableInfo.name}) 例項物件 73 * @return 例項物件 74 */ 75 @Override 76 public int updateById($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) { 77 return $!{tool.firstLowerCase($!{tableInfo.name})}Dao.updateById($!tool.firstLowerCase($!{tableInfo.name})); 78 } 79 80 /** 81 * 通過主鍵id刪除資料 82 * @param $!pk.name 主鍵 83 */ 84 @Override 85 public int deleteById($!pk.shortType $!pk.name) { 86 return $!{tool.firstLowerCase($!{tableInfo.name})}Dao.deleteById($!pk.name); 87 } 88 }View Code
生成效果(部分截圖)
controller的模板就沒有必要設計了,因為需要結合前端以及具體的業務需求。
總結
這樣一來,就可以根據資料庫的表來使用Easycode外掛一鍵生成entity,controller,service,dao,mapper,包含了單表的最基本方法——增刪改查,service使用了分頁外掛,整體下來可以減輕大量的重複工作。當然,新手的話,不建議過早地使用外掛!
ps:若理解有誤,請指正,共同學習進步!