03 我的项目搭建 逆向工程(代码生成)实现
逆向工程实现代码生成大家个别都有应用过,而应用 easyCode 的插件来生成代码会更加简略不便。只有花点工夫来编写脚本,你将能够间接生成个别以上的根底代码。本文将演示如何应用插件来实现的码的生成。
一、插件装置
插件库中搜寻 easycode,而后进行装置。
作者选的是前者(图中已装置的)。
二、配置脚本
这个是本篇中的重头戏,脚本配的好,代码写得少。
先上属性阐明:
属性
$packageName 抉择的包名 (String)
$author 设置中的作者 (String)
$encode 设置的编码 (String)
$modulePath 选中的 module 门路 (String)
$projectPath 我的项目门路 (String)
对象
$tableInfo 表对象 (TableInfo)
obj 表原始对象 (DasColumn, 上面有贴图)
name 表名(转换后的首字母大写)(String)
comment 表正文 (String)
fullColumn 所有列 (List<ColumnInfo>)
pkColumn 主键列 (List<ColumnInfo>)
otherColumn 其余列 (List<ColumnInfo>)
savePackageName 保留的包名 (String)
savePath 保留门路 (String)
saveModelName 保留的 model 名称 (String)
columnInfo 列对象 (ColumnInfo)
obj 列原始对象 (DbTable, 上面有贴图)
name 列名(首字母小写)(String)
comment 列正文 (String)
type 列类型(类型全名)(String)
ext 附加字段(Map 类型)(Map<String,Object>)
$tableInfoList 所有选中的表 (List<TableInfo>)
$importList 所有须要导入的包汇合 (Set<String>)
回调
&callback
setFileName(String) 设置文件贮存名字
setSavePath(String) 设置文件贮存门路,默认应用选中门路
工具
$tool
firstUpperCase(String) 首字母大写办法
firstLowerCase(String) 首字母小写办法
getClsNameByFullName(String) 通过包全名获取类名
getJavaName(String) 将下划线宰割字符串转驼峰命名 (属性名)
getClassName(String) 将下划线宰割字符串转驼峰命名 (类名)
append(... Object) 多个数据进行拼接
$time
currTime(String) 获取以后工夫,指定工夫格局(默认:yyyy-MM-dd HH:mm:ss)
上述是脚本整体的属性解说。如何批改具体想要生成的代码模板,就得好好花些工夫进行脚本的编写。而作者的局部脚本如下:
当然,得先说说脚本编写的入口(IDEA 为例):
settings 中的 other settings 下的 EasyCode-MybatisCodeHelper。其中 type 是指数据库到实体的映射关系。而 Template Setting 就是脚本的配置了。
entity.java
## 引入宏定义
$!define
## 应用宏定义设置回调(保留地位与文件后缀)#save("/entity", ".java")
## 应用宏定义设置包后缀
#setPackageSuffix("entity")
## 应用全局变量实现默认包导入
$!autoImport
import java.io.Serializable;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import io.swagger.annotations.ApiModelProperty;
## 应用宏定义实现类正文信息
#tableComment("实体类")
## 获取主键(个别主键都是实体类名 +Id)#set($id= "$tool.firstLowerCase($!{tableInfo.name})Id")
public class $!{tableInfo.name} implements Serializable {private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
#if(${column.comment})/**
* ${column.comment}
*/
#end
## 判断是否是主键(因为主键有生成策略要设定)#if(${column.name}==$!{id})@TableId
@ApiModelProperty(value = "${column.comment}")
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#else
@TableField("$!column.obj.name")
@ApiModelProperty(value = "${column.comment}")
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#end
#foreach($column in $tableInfo.fullColumn)
## 应用宏定义实现 get,set 办法
#getSetMethod($column)
#end
@Override
public String toString() {return "$!{tableInfo.name}["+
#foreach($column in $tableInfo.fullColumn)
#if(${column.name}==$!{id})
"${column.name}='" + ${column.name} + ''' +
#else
",${column.name}='" + ${column.name} + ''' +
#end
#end "]";
}
}
controller.java
## 定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Controller"))
#set($entityName= "$!{tableInfo.comment}($!{tableInfo.name}")
## 设置回调
$!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}.facade.I$!{tableInfo.name}Facade;
import com.jowim.util.ResponseMessage;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import com.jowim.exception.ServiceException;
import com.jowim.vo.$!tool.firstLowerCase($tableInfo.name)$tool.append(".Insert",$!{tableInfo.name},"VO");
import com.jowim.vo.$!tool.firstLowerCase($tableInfo.name)$tool.append(".Update",$!{tableInfo.name},"VO");
import javax.annotation.Resource;
import javax.validation.Valid;
/**
* $!{entityName} 表管制层
*
* @author $!author
* @since $!time.currTime()
*/
@RestController
@RequestMapping("$!tool.firstLowerCase($tableInfo.name)")
public class $!{tableName} {
/**
* 服务对象
*/
@Resource
private I$!{tableInfo.name}Facade $!tool.firstLowerCase($tableInfo.name)Facade;
/**
* 增加 $!{tableInfo.comment}($!{tableInfo.name})
*
* @param $tool.append("new",$tableInfo.name)
* @return
*/
@PreAuthorize("hasAnyRole('ROLE_')")
@ApiOperation(value = "增加 $!{entityName}", notes = "增加 $!{entityName}", httpMethod = "POST")
@PostMapping("")
public ResponseMessage<Object> insert$!{tableInfo.name}(@RequestBody @Valid Insert$!{tableInfo.name}VO $tool.append("new",$tableInfo.name)) {
try {return ResponseMessage.ok($tool.append($!tool.firstLowerCase($tableInfo.name),"Facade.insert",$!{tableInfo.name},"(",$tool.append("new",$tableInfo.name),")"));
}catch (ServiceException e){return ResponseMessage.error(e.getMessage());
}
}
/**
* 批改 $!{tableInfo.comment}($!{tableInfo.name})
*
* @param vo
* @return
*/
@PreAuthorize("hasAnyRole('ROLE_')")
@ApiOperation(value = "批改 $!{entityName}", notes = "批改 $!{entityName}", httpMethod = "PUT")
@PutMapping("")
public ResponseMessage<String> update$!{tableInfo.name}(@RequestBody @Valid Update$!{tableInfo.name}VO vo) {
try {return ResponseMessage.ok($tool.append($!tool.firstLowerCase($tableInfo.name),"Facade.update",$!{tableInfo.name},"(vo)"));
}catch (ServiceException e){return ResponseMessage.error(e.getMessage());
}
}
/**
* 删除 $!{tableInfo.comment}($!{tableInfo.name})
*
* @param uuid
* @return
*/
@PreAuthorize("hasAnyRole('ROLE_')")
@ApiOperation(value = "删除 $!{entityName}", notes = "删除 $!{entityName}", httpMethod = "DELETE")
@DeleteMapping("/{uuid}")
public ResponseMessage<String> del$!{tableInfo.name}(@PathVariable("uuid") String uuid) {
try {return ResponseMessage.ok($tool.append($!tool.firstLowerCase($tableInfo.name),"Facade.del",$!{tableInfo.name},"(uuid)"));
}catch (ServiceException e){return ResponseMessage.error(e.getMessage());
}
}
/**
* 依据 id 查看详情
*
* @param uuid
* @return
*
*
*/
@PreAuthorize("hasAnyRole('ROLE_')")
@ApiOperation(value = "依据 id 查看详情", notes = "依据 id 查看详情", httpMethod = "GET")
@RequestMapping("/{uuid}")
@ApiImplicitParam(name = "uuid", value = "$!{tableInfo.comment}($!{tableInfo.name})id", required = true, paramType = "path", dataType = "String")
public ResponseMessage<Object> get$!{tableInfo.name}(@PathVariable("uuid") String uuid) {
try {return ResponseMessage.ok($tool.append($!tool.firstLowerCase($tableInfo.name),"Facade.get",$!{tableInfo.name},"(uuid)"));
}catch (ServiceException e){return ResponseMessage.error(e.getMessage());
}
}
/**
* 查问 $!{tableInfo.comment}($!{tableInfo.name}) 汇合
*
* @param page
* @param pageSize
* @return
*/
@PreAuthorize("hasAnyRole('ROLE_')")
@RequestMapping("/query_page")
@ApiOperation(value = "查问 $!{tableInfo.comment}($!{tableInfo.name}) 汇合", notes = "查问 $!{tableInfo.comment}($!{tableInfo.name}) 汇合", httpMethod = "GET")
@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "展现的页数", required = true, paramType = "query", dataType = "int",example = "1"),
@ApiImplicitParam(name = "pageSize", value = "每页展现几条", required = true, paramType = "query", dataType = "int",example = "10")
})
public ResponseMessage<Object> select$!{tableInfo.name}(Integer page, Integer pageSize) {
try {return ResponseMessage.ok($tool.append($!tool.firstLowerCase($tableInfo.name),"Facade.select",$!{tableInfo.name},"(page,pageSize)"));
} catch (ServiceException e) {e.printStackTrace();
return ResponseMessage.error(e.getMessage());
}
}
}
mapper.xml
## 引入 mybatis 反对
$!mybatisSupport
## 设置保留名称与保留地位
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.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}.repository.$!{tableInfo.name}Mapper">
<resultMap id="BaseResultMap" type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}">
<!--@Table $!{tableInfo.originTableName}-->
#foreach($column in $tableInfo.fullColumn)
<result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
#end
</resultMap>
</mapper>
因为篇幅的起因,就不将全副的脚本放出,有趣味能够分割作者获取全副脚本。
三、数据库设置
装置完插件后 IDE(本文为 IDEA) 中左边会有数据库操作的菜单栏。
而后新建一个数据库连贯。编辑完连贯点击连贯可能会提醒装置驱动,间接点击批准便可。装置完之后列表中就会呈现数据库的选项,这里也能够对数据库进行操作,然而作者零碎间接用 Navicat 进行操作,不习惯用这个插件。
实现上述操作后,右键抉择要生成的表后点击
会提醒可选的生成的类模板。选中生成的地位 Package,而后就能够生成绝对于的模板
四、代码后果展现
图中报红是因为局部依赖还未引入所导致。
自此,基于 easyCode 插件联合脚本身材代码就实现了,本文中的办法还有很多能够优化的中央,例如实体类中能够应用 Lombok 插件进行代码的简化,间接注解来实现 tostring 和 getter、setter 的实现,缩小代码量。
我的项目源码地址:https://github.com/1529565626/-1SShop
我的项目演示地址:因为作者鉴于经费稀缺,临时未领有,待日后我的项目成熟,抑或是一夜暴富能够思考。