EasyCode插件使用及模板参考

1、介绍安装

Easycode是idea的一个插件,可以直接对数据的表生成entity、controller、service、dao、mapper无需任何编码,简单而强大。

我这里的话是已经那装好了。

建议大家在安装一个插件,叫做Lombok。

Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。

2、在IDEA配置连接数据库

在这个之前,新建一个Springboot项目,这个应该是比较简单的。

建好SpringBoot项目之后,如下图所示,配置数据源,我这里是已经配置完成的。

3、开始生成代码

在这个里面找到你想生成的表,然后右键,就会出现如下所示的截面。这里点击后会选择生成的文件类型,以及生成文件的位置。

如下图所示,这里是,我们的选择方式:

注意:我们在模板中配置过,这里选择适合,Package选项是选择到倒数第二层的位置,下面模板会自动找到所在位置。

4、模板配置

我们在这里进行配置,模板配置语言是velocity语言,这里配置的是SPring+通用Mapper

4.1entity层配置

##导入宏定义
$!define ##保存文件(宏定义)
#save("/entity", ".java") ##包路径(宏定义)
#setPackageSuffix("entity") ##自动导入包(全局变量)
$!autoImport
import tk.mybatis.mapper.annotation.NameStyle;
import tk.mybatis.mapper.code.Style;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data; ##表注释(宏定义)
#tableComment("表实体类")
@Data
@NameStyle(Style.normal)
@Table(name = "$!{tableInfo.name}")
public class $!{tableInfo.name}{
#foreach($column in $tableInfo.fullColumn)
#if(${column.comment})//${column.comment}#end private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
}

注意:

$!define 这个我们不用关注,默认即可

save("/entity", ".java"),这里是定义了实体类的所在包名,后缀是.java

setPackageSuffix("entity") ,这里是包路径

tableComment("表实体类") 是一种注释

在配置界面有着详细的方法注释,可以看着注释进行更加详细的配置。

4.2dao层配置

##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Mapper"))
##设置回调
$!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 tk.mybatis.mapper.common.Mapper;
import com.ctbt.entity.$!{tableInfo.name};
/**
* $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
*
* @author $!author
* @since $!time.currTime()
*/
public interface $!{tableName} extends Mapper<$!{tableInfo.name}>{ }

注意:

1、这里我们注意前三行的配置,第一行是一个字符串连接操作得到,NameMapper,这种样子;设置文件名字,后缀是.java;设置保存路径

2、注意接下来是拿到主键,这个拿到的主键$pk不能直接用

3、接下来是配置注释信息,我们也可以使用#tableComment("表实体类")来代替这么多行内容

4.3Service层配置

##定义初始变量
#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 $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Mapper;
import cn.hutool.core.collection.CollUtil;
import com.ctbt.enums.ExceptionEnum;
import com.ctbt.exception.CtbtException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; /**
* $!{tableInfo.comment}($!{tableInfo.name})表服务接口
*
* @author $!author
* @since $!time.currTime()
*/
@Service
@Transactional
public class $!{tableName} { @Autowired(required = false)
private $!{tableInfo.name}Mapper $!{tool.firstLowerCase($tableInfo.name)}Mapper; /**
*根据参数查询数据,参数为空时,查询所有
* @param $!tool.firstLowerCase($!tableInfo.name)
* @return
*/
public List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!tableInfo.name)) {
List<$!{tableInfo.name}> select = $!{tool.firstLowerCase($tableInfo.name)}Mapper.select($!tool.firstLowerCase($!tableInfo.name));
if (CollUtil.isEmpty(select)) {
throw new CtbtException(ExceptionEnum.NOT_FOUND_OR_FOUND_ERROR);
}
return select;
} /**
* 插入数据
* @param $!tool.firstLowerCase($!tableInfo.name)
*/
public void add($!{tableInfo.name} $!tool.firstLowerCase($!tableInfo.name)) { if($!{tool.firstLowerCase($tableInfo.name)}Mapper.selectByPrimaryKey($!{tool.firstLowerCase($!tableInfo.name)}.getId())!=null){
throw new CtbtException(ExceptionEnum.DATA_ALREADY_EXISTS);
}
int insert = $!{tool.firstLowerCase($tableInfo.name)}Mapper.insert($!tool.firstLowerCase($!tableInfo.name));
if (insert != 1) {
throw new CtbtException(ExceptionEnum.INSERT_ERROR);
}
} /**
* 更新数据
* @param $!tool.firstLowerCase($!tableInfo.name)
*/
public void update($!{tableInfo.name} $!tool.firstLowerCase($!tableInfo.name)) {
int i = $!{tool.firstLowerCase($tableInfo.name)}Mapper.updateByPrimaryKey($!tool.firstLowerCase($!tableInfo.name));
if (i != 1) {
throw new CtbtException(ExceptionEnum.UPDATE_ERROR);
}
} #foreach($column in $tableInfo.pkColumn)
/**
* 根据主键删除数据
* @param $column.name
*/
public void delete($!{tool.getClsNameByFullName($column.type)} $column.name) {
int i = $!{tool.firstLowerCase($tableInfo.name)}Mapper.deleteByPrimaryKey($column.name);
if (i != 1) {
throw new CtbtException(ExceptionEnum.DELETE_ERROR);
}
}
#break
#end }

注意:

注意前三行以及开头注释不再赘述

下面是CRUD操作,注意删除操作时候,这里是选择一个循环操作,因为这里拿到的主键,设定不是一个,而默认是多个,所以我们用循环拿主键。

4.4Controller层配置

##定义初始变量
#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.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List; /**
* $!{tableInfo.comment}($!{tableInfo.name})表控制层
*
* @author $!author
* @since $!time.currTime()
*/
@CrossOrigin
@RestController
@RequestMapping("$!tool.firstLowerCase($tableInfo.name)")
public class $!{tableName} { /**
* 服务对象
*/
@Autowired
private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service; /**
* 根据属性查询 (当参数为空时候)查询所有
* @param $!tool.firstLowerCase($!tableInfo.name)
* @return
*/
@GetMapping("list")
public ResponseEntity<List<$!{tableInfo.name}>> query(@RequestBody(required = false) $!tableInfo.name $!tool.firstLowerCase($!tableInfo.name)){
return ResponseEntity.ok($!{tool.firstLowerCase($!{tableInfo.name})}Service.queryAll($!tool.firstLowerCase($!tableInfo.name)));
} /**
* 插入一条数据
* @param $!tool.firstLowerCase($!tableInfo.name)
* @return
*/
@PostMapping("add")
public ResponseEntity<List<$!{tableInfo.name}>> add(@RequestBody $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)){
$!{tool.firstLowerCase($tableInfo.name)}Service.add($!tool.firstLowerCase($tableInfo.name));
return ResponseEntity.ok($!{tool.firstLowerCase($!{tableInfo.name})}Service.queryAll(new $!{tableInfo.name}()));
} /**
* 根据主键更新数据
* @param $!tool.firstLowerCase($!tableInfo.name)
* @return
*/
@PutMapping("update")
public ResponseEntity<List<$!{tableInfo.name}>> update(@RequestBody $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)){
$!{tool.firstLowerCase($tableInfo.name)}Service.update($!tool.firstLowerCase($tableInfo.name));
return ResponseEntity.ok($!{tool.firstLowerCase($!{tableInfo.name})}Service.queryAll(new $!{tableInfo.name}()));
} #foreach($column in $tableInfo.pkColumn)
/**
* 根据主键删除
* @param $column.name
* @return
*/
@DeleteMapping("del/{$column.name}")
public ResponseEntity<List<$!{tableInfo.name}>> delete(@PathVariable("$column.name") $!{tool.getClsNameByFullName($column.type)} $column.name){
$!{tool.firstLowerCase($tableInfo.name)}Service.delete($column.name);
return ResponseEntity.ok($!{tool.firstLowerCase($!{tableInfo.name})}Service.queryAll(new $!{tableInfo.name}()));
}
#break
#end
}

注意:此处配置和Service层差别不大。

总结

这里,我们的配置不再详细描述了,根据模板配置的页面可以很好的可以理解,这里提一下其中一个语法,这里给出一个对比

1、

$!{tool.firstLowerCase($tableInfo.name)}Service.delete($column.name);  正确写法
$!tool.firstLowerCase($tableInfo.name)Service.delete($column.name); 错误写法

这里第一行和第二行的差别是缺少了一个{},因此要格外注意这个点

2、

private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
private $tool.getClsNameByFullName($column.type) $column.name;

这里看到第一行相对第二行缺少一个!,这里是没有影响的,个人对这个原因不是很清楚,也没有去查velocity的语法,各位懂这个的可以指出,多谢!

EasyCode插件使用及模板参考的更多相关文章

  1. ​IntelliJ IDEA使用技巧—使用EasyCode插件一键生成代码04期

    在现如今的软件开发过程中,软件开发人员将很多的精力放在重复的编码中.特别是流行的MVC架构模式下,项目各个层次的功能更加独立,这也间接的造成了代码的相似度更高.因此需要寻找一种可以减少软件开发人员重复 ...

  2. 移动端UI设计规范模板参考以及设计规范的好处

    2018也快要过完了(-_-),我们的移动端的UI设计规范也层出不穷.很多APP设计师也要在年底给公司或者是团队做一个总结.那么一个像样的APP ui设计规范也是很有必要的作品回顾. 在创业公司做着一 ...

  3. EasyCode Entity 实体类模板 IDEA

    自己修改了一份EasyCode的实体类模板,防止日后找不到在这里存一下 修改了如下内容: 取消生成GetSet方法,改用Lombok 修改默认命名规则,改为[表名Entity.java] 取消了实现序 ...

  4. ;~ 并发运行的AutoHotkey脚本真机实际测试模板参考20191010.ahk

    ;~ 并发运行的AutoHotkey脚本真机实际测试模板参考20191010.ahk;~ 2019年10月10日;~ 徐晓亮(aahk6188);~ 操作系统测试环境: Windows 7 专业版 3 ...

  5. 快速开发Grunt插件----压缩js模板

    前言 Grunt是一款前端构建工具,帮助我们自动化搭建前端工程.它可以实现自动对js.css.html文件的合并.压缩等一些列操作.Grunt有很多插件,每一款插件实现某个功能,你可以通过npm命名去 ...

  6. IDEA中安装EasyCode插件并连接数据库生成代码

    场景 EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml).只要是与数据库相关的代码都可以通过自定义模板来生成.支持数据库类型与j ...

  7. jquery 插件和后台模板搜集

    弹框 alert confirmhttp://www.jq22.com/jquery-info2607 jQuery表格排序筛选插件http://www.jq22.com/jquery-info880 ...

  8. npp插件-NewFileBrowser:自定义模板

    ☞ 概述 NewFileBrowser用于定义文件的初始化文本.当我们创建一个jsp文件,或者spring bean的配置文件,或者maven的pom文件... 总有一些内容是固定的:把这些内容建立成 ...

  9. sublime text插件emmet自定义模板

    首先要找到 snippets.json这个文件,路径是preferences>browse packages,看看有没有emmet目录. 如果没有,可能是您没有安装emmet插件,或者您安装了但 ...

随机推荐

  1. 学长小清新题表之UOJ 180.实验室外的攻防战

    学长小清新题表之UOJ 180.实验室外的攻防战 题目描述 时针指向午夜十二点,约定的日子--\(2\)月\(28\)日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks ...

  2. git pull冲突的解决方案

    处理步骤: 1.先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来 .使用git stash list可以看到保存的信息: git stash暂存修改 其中stash@ ...

  3. RSA非对称加密(java实例代码)

    使用RSA对WebService传递的信息加密解密的基本思想是:服务器端提供一个WebService方法String getServerPublicKey(),客户端可以以此得到服务器端的公钥,然后使 ...

  4. JavaScript学习系列博客_3_JavaScript中的变量、常量、标识符

    常量:就是改变不了的,也是可以直接使用的. 变量:可以改变的,不确定的. var =123456; 通过 var 声明一个变量,同时赋值给它 标识符:在JS中所有的可以自主命名的内容,都可以认为是一个 ...

  5. Java多线程_Semaphore信号量

    概念: Semaphore是信号量,又称为信号灯,它可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.当Semaphore的个数变成1时,即代表只允许 ...

  6. 焦大:做seo需要的三心二意

    http://www.wocaoseo.com/thread-92-1-1.html        读过一些外国人写的教程之后,愈发觉得国外人写的教程甚是有趣,比起国内学习的课本来,真是不可同日而语. ...

  7. 力扣Leetcode 560. 和为K的子数组

    和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

  8. ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查

    三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...

  9. Java开发环境搭建的准备工作

    Java开发环境搭建的准备工作 网络配置(修改hosts) 什么时候需要 比如我们在安装homeBrew的时候会遇到 curl: (7) Failed to connect to raw.github ...

  10. Cacti1.2.14最新版安装和配置(详细版)

    Cacti的起源与发展现状 故事要从2001年的某一天说起.一个叫Ian Berry的中学生还在学习如何使用PHP和MySQL进行编程及功能的实现,那时候他业余时间为一个名不见经传的互联网运营商开发项 ...