乐趣区

关于java:逆向工程基于easycode插件代码生成实现

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

我的项目演示地址:因为作者鉴于经费稀缺,临时未领有,待日后我的项目成熟,抑或是一夜暴富能够思考。

退出移动版