Easycode是idea的一个插件,可以直接对数据的表生成entity、controller、service、dao、mapper无需任何编码,简单而强大。
我这里的话是已经那装好了。
建议大家在安装一个插件,叫做Lombok。
Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。
在这个之前,新建一个Springboot项目,这个应该是比较简单的。
建好SpringBoot项目之后,如下图所示,配置数据源,我这里是已经配置完成的。
在这个里面找到你想生成的表,然后右键,就会出现如下所示的截面。这里点击后会选择生成的文件类型,以及生成文件的位置。
我们在这里用的是公司传到云端的模板,导入相应的模板id就能用了。
也可以自定义模板或者用默认的模板(注:红框的每一个菜单默认模板要设为相同的!)
##导入宏定义
$!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("表实体类") 是一种注释
在配置界面有着详细的方法注释,可以看着注释进行更加详细的配置。
##定义初始变量
#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("表实体类")来代替这么多行内容
##定义初始变量
#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操作,注意删除操作时候,这里是选择一个循环操作,因为这里拿到的主键,设定不是一个,而默认是多个,所以我们用循环拿主键。
##定义初始变量
#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> 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> 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> 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> 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的语法,各位懂这个的可以指出,多谢!