逆向工程(基于easycode插件代码生成)实现

03项目搭建 逆向工程(代码生成)实现

逆向工程实现代码生成大家一般都有使用过,而使用easyCode的插件来生成代码会更加简单方便。只要花点时间来编写脚本,你将可以直接生成一般以上的基础代码。本文将演示如何使用插件来实现的码的生成。

一、插件安装

插件库中搜索easycode,然后进行安装。

逆向工程(基于easycode插件代码生成)实现_第1张图片

作者选的是前者(图中已安装的)。

二、配置脚本

这个是本篇中的重头戏,脚本配的好,代码写得少。

先上属性说明:

属性

$packageName 选择的包名(String)
$author 设置中的作者(String)
$encode 设置的编码(String)
$modulePath 选中的module路径(String)
$projectPath 项目路径(String)
对象
$tableInfo 表对象(TableInfo)
 obj 表原始对象(DasColumn,下面有贴图)
 name 表名(转换后的首字母大写)(String)
 comment 表注释(String)
 fullColumn 所有列(List)
 pkColumn 主键列(List)
 otherColumn 其他列(List)
 savePackageName 保存的包名(String)
 savePath 保存路径(String)
 saveModelName 保存的model名称(String)
columnInfo 列对象(ColumnInfo)
 obj 列原始对象(DbTable,下面有贴图)
 name 列名(首字母小写)(String)
 comment 列注释(String)
 type 列类型(类型全名)(String)
 ext 附加字段(Map类型)(Map)
$tableInfoList 所有选中的表(List)
$importList 所有需要导入的包集合(Set)
回调
&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 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 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 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 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 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
​



 
#foreach($column in $tableInfo.fullColumn)
 
#end
 
​
​

由于篇幅的原因,就不将全部的脚本放出,有兴趣可以联系作者获取全部脚本。

三、数据库设置

安装完插件后IDE(本文为IDEA)中右边会有数据库操作的菜单栏。

逆向工程(基于easycode插件代码生成)实现_第2张图片

然后新建一个数据库连接。编辑完连接点击连接可能会提示安装驱动,直接点击同意便可。安装完之后列表中就会出现数据库的选项,这里也可以对数据库进行操作,但是作者系统直接用Navicat进行操作,不习惯用这个插件。

完成上述操作后,右键选择要生成的表后点击

image

逆向工程(基于easycode插件代码生成)实现_第3张图片

会提示可选的生成的类模板。选中生成的位置Package,然后就可以生成相对于的模板

逆向工程(基于easycode插件代码生成)实现_第4张图片

四、代码结果展示

逆向工程(基于easycode插件代码生成)实现_第5张图片

图中报红是因为部分依赖还未引入所导致。

自此,基于easyCode插件结合脚本身材代码就完成了,本文中的方法还有很多可以优化的地方,例如实体类中可以使用Lombok插件进行代码的简化,直接注解来实现tostring和getter、setter的实现,减少代码量。

项目源码地址:https://github.com/1529565626/-1SShop

项目演示地址:由于作者鉴于经费稀缺,暂时未拥有,待日后项目成熟,抑或是一夜暴富可以考虑。

你可能感兴趣的:(java,mysql)