最近准备做个项目,在配置项目环境的时候,使用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也可以,但要注意格式
ps:若理解有误,请指正,共同学习进步!