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使用了分頁插件,整體下來可以減輕大量的重復工作。當然,新手的話,不建議過早地使用插件!

 

 最后附上個人測試后的整體項目結構、pom文件以及applicatio.properties設置

 

 pom.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>2.2.4.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.beilin</groupId>
12     <artifactId>beilin_oa</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>beilin_oa</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19     </properties>
20 
21     <dependencies>
22         <dependency>
23             <groupId>org.springframework.boot</groupId>
24             <artifactId>spring-boot-starter-web</artifactId>
25         </dependency>
26 
27         <dependency>
28             <groupId>org.mybatis.spring.boot</groupId>
29             <artifactId>mybatis-spring-boot-starter</artifactId>
30             <version>2.1.3</version>
31         </dependency>
32         <dependency>
33             <groupId>mysql</groupId>
34             <artifactId>mysql-connector-java</artifactId>
35             <version>8.0.15</version>
36         </dependency>
37         <!--  分頁插件 -->
38           <dependency>
39             <groupId>com.github.pagehelper</groupId>
40             <artifactId>pagehelper-spring-boot-starter</artifactId>
41             <version>1.2.5</version>
42         </dependency>
43 
44         <dependency>
45             <groupId>org.springframework.boot</groupId>
46             <artifactId>spring-boot-devtools</artifactId>
47             <scope>runtime</scope>
48             <optional>true</optional>
49         </dependency>
50          <dependency>
51             <groupId>org.projectlombok</groupId>
52             <artifactId>lombok</artifactId>
53             <optional>true</optional>
54         </dependency>
55         <dependency>
56             <groupId>org.springframework.boot</groupId>
57             <artifactId>spring-boot-starter-test</artifactId>
58             <scope>test</scope>
59             <exclusions>
60                 <exclusion>
61                     <groupId>org.junit.vintage</groupId>
62                     <artifactId>junit-vintage-engine</artifactId>
63                 </exclusion>
64             </exclusions>
65         </dependency>
66     </dependencies>
67 
68     <build>
69         <plugins>
70             <plugin>
71                 <groupId>org.springframework.boot</groupId>
72                 <artifactId>spring-boot-maven-plugin</artifactId>
73             </plugin>
74         </plugins>
75         <resources>
76             <resource>
77                 <directory>src/main/java</directory>
78                 <includes>
79                     <include>**/*.xml</include>
80                 </includes>
81             </resource>
82         </resources>
83     </build>
84 
85 </project>
View Code

 

applicatio.properties 

 1 spring.http.encoding.force=true
 2 spring.http.encoding.charset=UTF-8
 3 spring.http.encoding.enabled=true
 4 server.tomcat.uri-encoding=UTF-8
 5 #分頁插件
 6 pagehelper.helper-dialect=mysql
 7 pagehelper.reasonable=true
 8 pagehelper.support-methods-arguments=true
 9 pagehelper.params=count=countSql
10 
11 #配置Mysql連接
12 spring.datasource.url=jdbc:mysql://localhost:3306/beilin_oa?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC
13 spring.datasource.username=root
14 spring.datasource.password=root
15 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
16 #配置mybatis
17 #配置實體類別名
18 mybatis.type-aliases-package=com/beilin/entity
19 #配置xml映射路徑
20 mybatis.mapper-locations=classpath*:com/beilin/mapper/**.xml
21 #開啟駝峰命名法
22 mybatis.configuration.map-underscore-to-camel-case=true
View Code

 

個人喜歡默認的applicatio.properties,當然applicatio.yml也可以,但要注意格式

 

ps:若理解有誤,請指正,共同學習進步!


免責聲明!

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



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