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的语法,各位懂这个的可以指出,多谢!

最新文章

  1. 会议通js
  2. 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
  3. eclipse中如何打jar包
  4. 用Get-ADComputer取非常用属性的值
  5. Java中ArrayList相关的5道面试题
  6. [Debug]驱动程序调测方法与技巧
  7. Hibernate 问题,在执行Query session.createQuery(hql) 报错误
  8. 【BZOJ】【1025】【SCOI2009】游戏
  9. php 写入数据到MySQL以及从MySQL获取数据,页面出现乱码的解决方法
  10. 使用java远程调试技术监控代码运行
  11. Java进阶04 RTTI
  12. R语言使用 multicore 包进行并行计算
  13. java中抽象类的定义和使用
  14. iOS中 项目开发易错知识点总结 韩俊强的博客
  15. 前端知识之jQuery
  16. 初识MongoBD
  17. Architecture
  18. Unity3D导入3DMax模型缩放单位问题深入分析
  19. iOS iTuns Connect官方配置教程
  20. Linux批量更改文件后缀-转载

热门文章

  1. 《MySQL必知必会》简介、使用
  2. 用过 mongodb 吧, 这三个大坑踩过吗?
  3. [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
  4. 【翻译】Promises/A+规范
  5. Could not create an acl object: Role &#39;16&#39;
  6. ZK的watch机制
  7. Java动态代理(二)——jdk动态代理
  8. Linux下非root用户运行Tomcat
  9. for...in、for...of和forEach
  10. MySQL锁这块石头似乎没有我想的那么重