最近准备做个项目,在配置项目环境的时候,使用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 }
测试
生成效果(注释对应数据库,折叠起来就行)
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 }
生成效果
映射文件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>
生成效果(部分截图)
这里需要注意的是映射文件中的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 }
生成效果
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 }
生成效果(部分截图)
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>
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
个人喜欢默认的applicatio.properties,当然applicatio.yml也可以,但要注意格式