1. 程式人生 > 實用技巧 >SpringBoot--Easycode外掛自定義模板

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 import
lombok.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 }
View Code

測試

生成效果(註釋對應資料庫,摺疊起來就行)

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:若理解有誤,請指正,共同學習進步!