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")##应用全局变量实现默认包导入$!autoImportimport 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
我的项目演示地址:因为作者鉴于经费稀缺,临时未领有,待日后我的项目成熟,抑或是一夜暴富能够思考。