- EasyCode是什么
- 安装EasyCode插件
- 在IDEA配置连接数据库
- 开始生成代码
- pom.xml文件
- application.yml文件
- 启动项目
- 分享几个我常用的自定义模板
- set($tableName = $tool.append($tableInfo.name, “Controller”))
- if(!$tableInfo.pkColumn.isEmpty())
- set($pk = $tableInfo.pkColumn.get(0))
- end
- if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;
EasyCode是什么
- 基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml)
- 只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与java类型映射关系配置。
- 支持同时生成生成多张表的代码。每张表有独立的配置信息。完全的个性化定义,规则由你设置。
- 可以直接对数据的表生成entity、controller、service、dao、mapper无需任何编码
安装EasyCode插件

这里使用引入外部插件的方式。首先下载EasyCode插件,下载地址:
https://plugins.jetbrains.com/plugin/10954-easy-code/versions
我的百度云下载地址
链接:https://pan.baidu.com/s/1KupEaa3SXUaA5vhnL-glYA
提取码:r43x
在IDEA配置连接数据库
新建一个springboot项目,接着如下图:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&serverTimezone=GMT%2B8
开始生成代码


完成了代码的生成,其结构如下:
pom.xml文件
<properties><java.version>1.8</java.version><mybatis-plus-spring-boot-starter.version>3.3.2</mybatis-plus-spring-boot-starter.version><mybatisplus.version>2.1.4</mybatisplus.version><druid.version>1.1.10</druid.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--lombok 用来简化实体类--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus-spring-boot-starter.version}</version></dependency><!-- 数据库MySQL驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--阿里Druid连接池集成SpringBoot起步依赖--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><!-- 不增加引依赖:报错Failed to bind properties under 'spring.datasource' to javax.sql.DataSource--><dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>1.7.26</version></dependency></dependencies>
application.yml文件
server:port: 9001spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&serverTimezone=GMT%2B8username: shenguangyangpassword: test12345678# 使用我们自己的druid数据源type: com.alibaba.druid.pool.DruidDataSourcedruid:initialSize: 10 #初始化连接个数minIdle: 5 #最小连接个数maxActive: 500 #最大连接个数maxWait: 60000 #最大等待时间timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 900000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: true# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filters: stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize: 20useGlobalDataSourceStat: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500mybatis-plus:# 扫描mapper.xml文件mapper-locations: classpath:/mapper/*Mapper.xml# 扫描实体类# typeAliasesPackage: com.example.springbootmybatisplus.entity# 主键类型global-config:#0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";id-type: 0#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"field-strategy: 0#驼峰下划线转换db-column-underline: true#刷新mapper 调试神器refresh-mapper: true# 数据库大写下划线转换#capital-mode: true#自定义SQL注入器configuration:map-underscore-to-camel-case: truecache-enabled: true# mybatis-plus配置控制台打印完整带参数SQL语句log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
启动项目
在启动类加上@MapperScan(“com.example.demo.dao”)注解
分享几个我常用的自定义模板
这种情况下生成的代码是比较原始的代码,通常不能满足我们的要求,因为我们项目中可能使用了一些其他框架,并且做了扩展,这时候就需要我们自定义模板来生成我们想要的代码。
首先打开Settings,找到Easy Code的设置,如下图所示
我只写了几个比较常用的功能, 其他具体业务可以根据自己需求添加, 以下模版支持以下几个方法
注意: 参数个人习惯用实体类, 比如User,需要一个id, 前台直接传{id:“123”}后台用User接收, 调用的时候就是user.getId()
Controller支持的方法
- 增
- 删
- 改
- 查
- 分页查询
- 查询全部
Dao, Service, ServiceImpl, Mapper支持的方法
- 增
- 删
- 改
- 查
- 分页查询
- 根据实体类查询
- 查询全部
- 数据总数的查询
Controller层模板
```java定义初始变量
set($tableName = $tool.append($tableInfo.name, “Controller”))
设置回调
$!callback.setFileName($tool.append($tableName, “.java”)) $!callback.setSavePath($tool.append($tableInfo.savePath, “/controller”))拿到主键
if(!$tableInfo.pkColumn.isEmpty())
set($pk = $tableInfo.pkColumn.get(0))
end
if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service; import org.springframework.web.bind.annotation.*; import com.rambler.core.door.Response; import java.util.List;
import javax.annotation.Resource;
/**
- $!{tableInfo.comment}($!{tableInfo.name})控制层 *
- @author $!author
@since $!time.currTime() / @RestController @RequestMapping(“/$!tool.firstLowerCase($tableInfo.name)”) public class $!{tableName} { /*
服务对象 */ @Resource private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;
/**
- 通过主键查询单条数据 *
- @param $!tool.firstLowerCase($tableInfo.name) 参数对象
@return 单条数据 */ @RequestMapping(value = “get”, method = RequestMethod.GET) public Response<$tableInfo.name> selectOne($tableInfo.name $!tool.firstLowerCase($tableInfo.name)) { $tableInfo.name result = $!{tool.firstLowerCase($tableInfo.name)}Service.selectById($!{tool.firstLowerCase($tableInfo.name)}.getId()); if(result != null){
Response.createSuccessResponse("查询成功", result);
} return Response.createErrorResponse(“查询失败”); }
/**
- 新增一条数据 *
- @param $!tool.firstLowerCase($tableInfo.name) 实体类
@return Response对象 */ @RequestMapping(value = “insert”, method = RequestMethod.POST) public Response<$tableInfo.name> insert(@RequestBody $tableInfo.name $!tool.firstLowerCase($tableInfo.name)) { int result = $!{tool.firstLowerCase($tableInfo.name)}Service.insert($!tool.firstLowerCase($tableInfo.name)); if (result > 0) {
Response.createSuccessResponse("新增成功", $!tool.firstLowerCase($tableInfo.name));
} return Response.createErrorResponse(“新增失败”); }
/**
- 修改一条数据 *
- @param $!tool.firstLowerCase($tableInfo.name) 实体类
@return Response对象 */ @RequestMapping(value = “update”, method = RequestMethod.PUT) public Response<$tableInfo.name> update(@RequestBody $tableInfo.name $!tool.firstLowerCase($tableInfo.name)) { $tableInfo.name result = $!{tool.firstLowerCase($tableInfo.name)}Service.update($!tool.firstLowerCase($tableInfo.name)); if (result != null) {
Response.createSuccessResponse("修改成功", result);
} return Response.createErrorResponse(“修改失败”); }
/**
- 删除一条数据 *
- @param $!tool.firstLowerCase($tableInfo.name) 参数对象
@return Response对象 */ @RequestMapping(value = “delete”, method = RequestMethod.DELETE) public Response<$tableInfo.name> delete($tableInfo.name $!tool.firstLowerCase($tableInfo.name)) { int result = $!{tool.firstLowerCase($tableInfo.name)}Service.deleteById($!{tool.firstLowerCase($tableInfo.name)}.getId()); if (result > 0) {
Response.createSuccessResponse("删除成功", null);
} return Response.createErrorResponse(“删除失败”); }
/**
- 查询全部 *
@return Response对象 */ @RequestMapping(value = “selectAll”, method = RequestMethod.GET) public Response
- > selectAll() {
List<$tableInfo.name> $!tool.firstLowerCase($tableInfo.name)s = $!{tool.firstLowerCase($tableInfo.name)}Service.selectAll();
if ($!tool.firstLowerCase($tableInfo.name)s != null) {
Response.createSuccessResponse("查询成功", $!tool.firstLowerCase($tableInfo.name)s);
} return Response.createErrorResponse(“查询失败”); }
/**
- 分页查询 *
- @param start 偏移
- @param limit 条数
- @return Response对象
*/
@RequestMapping(value = “selectPage”, method = RequestMethod.GET)
public Response<$tableInfo.name> selectPage(Integer start, Integer limit) {
List<$tableInfo.name> $!tool.firstLowerCase($tableInfo.name)s = $!{tool.firstLowerCase($tableInfo.name)}Service.selectPage(start, limit);
if ($!tool.firstLowerCase($tableInfo.name)s != null) {
} return Response.createErrorResponse(“查询失败”); }Response.createSuccessResponse("查询成功", $!tool.firstLowerCase($tableInfo.name)s);
}
```java@Overridepublic int batchInsert(List<Article> articles) {return 0;}@Overridepublic int update(Article article) {return 0;}@Overridepublic int deleteById(Integer id) {return 0;}
Dao层模版
##定义初始变量#set($tableName = $tool.append($tableInfo.name, "Dao"))##设置回调$!callback.setFileName($tool.append($tableName, ".java"))$!callback.setSavePath($tool.append($tableInfo.savePath, "/dao"))##拿到主键#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))#end#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}dao;import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};import org.apache.ibatis.annotations.Param;import java.util.List;import java.util.Map;/*** $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层** @author $!author* @since $!time.currTime()*/public interface $!{tableName} {/*** 通过ID查询单条数据** @param $!pk.name 主键* @return 实例对象*/$!{tableInfo.name} selectById($!pk.shortType $!pk.name);/*** 分页查询** @param start 查询起始位置* @param limit 查询条数* @return 对象列表*/List<$!{tableInfo.name}> selectPage(@Param("start") int start, @Param("limit") int limit);/*** 查询全部** @return 对象列表*/List<$!{tableInfo.name}> selectAll();/*** 通过实体作为筛选条件查询** @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象* @return 对象列表*/List<$!{tableInfo.name}> selectList($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));/*** 新增数据** @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象* @return 影响行数*/int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));/*** 批量新增** @param $!tool.firstLowerCase($!{tableInfo.name})s 实例对象的集合* @return 影响行数*/int batchInsert(List<$!{tableInfo.name}> $!tool.firstLowerCase($!{tableInfo.name})s);/*** 修改数据** @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象* @return 影响行数*/int update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));/*** 通过主键删除数据** @param $!pk.name 主键* @return 影响行数*/int deleteById($!pk.shortType $!pk.name);/*** 查询总数据数** @return 数据总数*/int count();}
Entity层模板
支持字段 + get&set + toString
##引入宏定义$!define##使用宏定义设置回调(保存位置与文件后缀)#save("/entity", ".java")##使用宏定义设置包后缀#setPackageSuffix("entity")##使用全局变量实现默认包导入$!autoImportimport java.io.Serializable;##使用宏定义实现类注释信息#tableComment("实体类")public class $!{tableInfo.name} implements Serializable {private static final long serialVersionUID = $!tool.serial();#foreach($column in $tableInfo.fullColumn)#if(${column.comment})/*** ${column.comment}*/#endprivate $!{tool.getClsNameByFullName($column.type)} $!{column.name};#end#foreach($column in $tableInfo.fullColumn)##使用宏定义实现get,set方法#getSetMethod($column)#end@Overridepublic String toString(){return "$tableInfo.name {" +#foreach($column in $tableInfo.fullColumn)"$column.name : " + $column.name + ", " +#end'}';}}
Service层模版
##定义初始变量#set($tableName = $tool.append($tableInfo.name, "Service"))##设置回调$!callback.setFileName($tool.append($tableName, ".java"))$!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))##拿到主键#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))#end#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};import java.util.List;import java.util.Map;/*** $!{tableInfo.comment}($!{tableInfo.name})表服务接口** @author $!author* @since $!time.currTime()*/public interface $!{tableName} {/*** 通过ID查询单条数据** @param $!pk.name 主键* @return 实例对象*/$!{tableInfo.name} selectById($!pk.shortType $!pk.name);/*** 分页查询** @param start 查询起始位置* @param limit 查询条数* @return 对象列表*/List<$!{tableInfo.name}> selectPage(int start, int limit);/*** 查询全部** @return 对象列表*/List<$!{tableInfo.name}> selectAll();/*** 通过实体作为筛选条件查询** @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象* @return 对象列表*/List<$!{tableInfo.name}> selectList($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));/*** 新增数据** @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象* @return 影响行数*/int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));/*** 批量新增** @param $!tool.firstLowerCase($!{tableInfo.name})s 实例对象的集合* @return 影响行数*/int batchInsert(List<$!{tableInfo.name}> $!tool.firstLowerCase($!{tableInfo.name})s);/*** 修改数据** @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象* @return 修改*/$!{tableInfo.name} update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));/*** 通过主键删除数据** @param $!pk.name 主键* @return 影响行数*/int deleteById($!pk.shortType $!pk.name);/*** 查询总数据数** @return 数据总数*/int count();}
ServiceImpl模版
##定义初始变量#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))##设置回调$!callback.setFileName($tool.append($tableName, ".java"))$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl"))##拿到主键#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))#end#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao;import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;import org.springframework.stereotype.Service;import javax.annotation.Resource;import java.util.List;import java.util.Map;/*** $!{tableInfo.comment}($!{tableInfo.name}表)服务实现类** @author $!author* @since $!time.currTime()*/@Service("$!tool.firstLowerCase($!{tableInfo.name})Service")public class $!{tableName} implements $!{tableInfo.name}Service {@Resourceprivate $!{tableInfo.name}Dao $!tool.firstLowerCase($!{tableInfo.name})Dao;/*** 通过ID查询单条数据** @param $!pk.name 主键* @return 实例对象*/@Overridepublic $!{tableInfo.name} selectById($!pk.shortType $!pk.name) {return this.$!{tool.firstLowerCase($!{tableInfo.name})}Dao.selectById($!pk.name);}/*** 分页查询** @param start 查询起始位置* @param limit 查询条数* @return 对象列表*/@Overridepublic List<$!{tableInfo.name}> selectPage(int start, int limit) {return this.$!{tool.firstLowerCase($!{tableInfo.name})}Dao.selectPage(start, limit);}/*** 查询所有** @return 实例对象的集合*/@Overridepublic List<$!{tableInfo.name}> selectAll() {return this.$!{tool.firstLowerCase($!{tableInfo.name})}Dao.selectAll();}/*** 根据条件查询** @return 实例对象的集合*/@Overridepublic List<$!{tableInfo.name}> selectList($!{tableInfo.name} $!{tool.firstLowerCase($!{tableInfo.name})}) {return this.$!{tool.firstLowerCase($!{tableInfo.name})}Dao.selectList($!{tool.firstLowerCase($!{tableInfo.name})});}/*** 新增数据** @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象* @return 实例对象*/@Overridepublic int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {return this.$!{tool.firstLowerCase($!{tableInfo.name})}Dao.insert($!tool.firstLowerCase($!{tableInfo.name}));}/*** 批量新增** @param $!tool.firstLowerCase($!{tableInfo.name})s 实例对象的集合* @return 生效的条数*/@Overridepublic int batchInsert(List<$!{tableInfo.name}> $!tool.firstLowerCase($!{tableInfo.name})s) {return this.$!{tool.firstLowerCase($!{tableInfo.name})}Dao.batchInsert($!tool.firstLowerCase($!{tableInfo.name})s);}/*** 修改数据** @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象* @return 实例对象*/@Overridepublic $!{tableInfo.name} update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {this.$!{tool.firstLowerCase($!{tableInfo.name})}Dao.update($!tool.firstLowerCase($!{tableInfo.name}));return this.selectById($!{tool.firstLowerCase($!{tableInfo.name})}.get$!tool.firstUpperCase($pk.name)());}/*** 通过主键删除数据** @param $!pk.name 主键* @return 是否成功*/@Overridepublic int deleteById($!pk.shortType $!pk.name) {return this.$!{tool.firstLowerCase($!{tableInfo.name})}Dao.deleteById($!pk.name);}/*** 查询总数据数** @return 数据总数*/@Overridepublic int count(){return this.$!{tool.firstLowerCase($!{tableInfo.name})}Dao.count();}}
Mapper(xml)模版分享
##引入mybatis支持$!mybatisSupport##设置保存名称与保存位置$!callback.setFileName($tool.append($!{tableInfo.name}, "Dao.xml"))$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))##拿到主键#if(!$tableInfo.pkColumn.isEmpty())#set($pk = $tableInfo.pkColumn.get(0))#end<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="$!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao"><!-- 结果集 --><resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}" id="$!{tableInfo.name}Map">#foreach($column in $tableInfo.fullColumn)<result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>#end</resultMap><!-- 基本字段 --><sql id="Base_Column_List">#allSqlColumn()</sql><!-- 查询单个 --><select id="selectById" resultMap="$!{tableInfo.name}Map">select<include refid="Base_Column_List" />from $!tableInfo.obj.namewhere $!pk.obj.name = #{$!pk.name}</select><!-- 分页查询 --><select id="selectPage" resultMap="$!{tableInfo.name}Map">select<include refid="Base_Column_List" />from $!tableInfo.obj.namelimit #{start},#{limit}</select><!-- 查询全部 --><select id="selectAll" resultMap="$!{tableInfo.name}Map">select<include refid="Base_Column_List" />from $!tableInfo.obj.name</select><!--通过实体作为筛选条件查询--><select id="selectList" resultMap="$!{tableInfo.name}Map">select<include refid="Base_Column_List" />from $!tableInfo.obj.name<where>#foreach($column in $tableInfo.fullColumn)<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">and $!column.obj.name = #{$!column.name}</if>#end</where></select><!-- 新增所有列 --><insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true">insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.fullColumn)$!column.obj.name#if($velocityHasNext), #end#end)values ( #foreach($column in $tableInfo.fullColumn)#{$!{column.name}}#if($velocityHasNext), #end#end)</insert><!-- 批量新增 --><insert id="batchInsert">insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.fullColumn)$!column.obj.name#if($velocityHasNext), #end#end)values<foreach collection="$!tool.firstLowerCase($!{tableInfo.name})s" item="item" index="index" separator=",">(#foreach($column in $tableInfo.fullColumn)#{item.$!{column.name}}#if($velocityHasNext), #end#end)</foreach></insert><!-- 通过主键修改数据 --><update id="update">update $!{tableInfo.obj.parent.name}.$!{tableInfo.obj.name}<set>#foreach($column in $tableInfo.otherColumn)<if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">$!column.obj.name = #{$!column.name},</if>#end</set>where $!pk.obj.name = #{$!pk.name}</update><!--通过主键删除--><delete id="deleteById">delete from $!{tableInfo.obj.name} where $!pk.obj.name = #{$!pk.name}</delete><!-- 总数 --><select id="count" resultType="int">select count(*) from $!{tableInfo.obj.name}</select></mapper>
