1 代码设计思想
jar包仓库:https://github.com/a982338665/lf-open-java-generate-code.git
集成测试仓库:https://github.com/a982338665/AdvancedFileProcessDemo.git
1.1 用户可修改内容
1.对外提供jdbc相关信息设置,以便解析数据库使用
2.对外暴露模板定义所在位置 - 针对于不同架构,不同的人,会将自己定义的模板放在指定文件夹下以供使用
3.支持多表一次生成,提供要生成表的List集合
4.对外暴露的一些标准常量:例如 作者信息,邮件等
SetGenerateConf.put_dynamic_map("test", "hhhhh");
内置的常量信息有:
DYNAMIC_MAP.put(getVarVal("nowDate"), new Date().toLocaleString());
//表示作者,使用时模板为!##{author}##
DYNAMIC_MAP.put(getVarVal("author"), "皇夜_");
//表示作者,使用时模板为!##{author}##
DYNAMIC_MAP.put(getVarVal("url"), "CSDN 皇夜_");
在模板中使用方式: !##{author}##
信息需要替换则使用 SetGenerateConf.put_dynamic_map("author", "Mr.li");
5.对外暴露的管道符申明:
OutPipeFunction.PIPE_MAP.put("方法名","lambda表达式");
1.2 模板设计使用方式
1.注释:#! 注释内容 !#
2.设置文件名称:#setFileName[ 文件名称 ] 必须在package之前,否则不解析
3.表解析变量替换:!{camelCaseTableName}Model.java
4.常量信息替换:!##{author}##
5.循环支持:
#foreach_start($XXXX in $tableInfo.fieldInfos)
/**
* $[XXXX.fieldNote]
* #! $[XXXX.fieldNote2] 注意:中间的空格为两格,一个用来匹配数据,一个用来做符号间隔!#
*/
private $[XXXX.classTypeShort] $[XXXX.camelCaseFieldName];
#foreach_end
6.循环之管道符支持:|upper
#foreach_start($XXXX in $tableInfo.fieldInfos)
public $[XXXX.classTypeShort] get$[XXXX.camelCaseFieldName|upper] () {
return $[XXXX.camelCaseFieldName];
}
#foreach_end
注意:
$[XXXX.camelCaseFieldName] 强调必须以空格结尾以便识别具体参数
$[XXXX.camelCaseFieldName|upper] 后面紧跟|upper 表示管道符,转换为首字母大写,仅支持一个
2.具体使用
2.1 引入pom
<dependency>
<groupId>com.github.a982338665</groupId>
<artifactId>lf-open-java-generate-code</artifactId>
<version>1.0.1-RELEASE</version>
</dependency>
2.2 添加模板
例如:
#setFileName[$!{camelCaseTableName}Controller.java] #!定义java文件名称!#
#setFilePath[!##{basePath}##src\main\java\com\github\test\controller]
package #defaultPackage;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.github.test.entity.$!{camelCaseTableName}Model;
import com.github.test.web.dao.$!{camelCaseTableName}Dao;
import com.github.test.service.$!{camelCaseTableName}Service;
import com.github.test.service.impl.$!{camelCaseTableName}ServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author : !##{author}##
* @URL : !##{url}##
* @CreateTime : !##{nowDate}##
* @Description : 生成模板映射类- 存储模板对应关系
* @TableName :$!{tableName} $!{tableNote}
*/
@RestController
@RequestMapping("$!{camelCaseTableName|lower}")
public class $!{camelCaseTableName}Controller {
@Resource
private $!{camelCaseTableName}Service $!{camelCaseTableName|lower}Service;
/**
* 通过ID查询单条数据
*
* @param $!{primaryKeyInfo.fieldName} 主键
* @return $!{camelCaseTableName|lower}Model实例对象
*/
public $!{camelCaseTableName}Model queryById($!{primaryKeyInfo.classTypeShort} $!{primaryKeyInfo.fieldName}) {
return this.$!{camelCaseTableName|lower}Service.queryById($!{primaryKeyInfo.fieldName});
}
/**
* 查询多条数据
*
* @param offset 查询起始位置
* @param limit 查询条数
* @return 对象列表
*/
public List<$!{camelCaseTableName}Model> queryAllByLimit(int offset, int limit) {
return this.$!{camelCaseTableName|lower}Service.queryAllByLimit(offset, limit);
}
/**
* 新增数据
*
* @param $!{camelCaseTableName|lower} 实例对象
* @return 实例对象
*/
public int insert($!{camelCaseTableName}Model $!{camelCaseTableName|lower}) {
return this.$!{camelCaseTableName|lower}Service.insert($!{camelCaseTableName|lower});
}
/**
* 修改数据
*
* @param $!{camelCaseTableName|lower}) 实例对象
* @return 实例对象
*/
public int update($!{camelCaseTableName}Model $!{camelCaseTableName|lower}) {
return this.$!{camelCaseTableName|lower}Service.update($!{camelCaseTableName|lower});
#!return this.queryById($!{camelCaseTableName|lower}.get$!{primaryKeyInfo.fieldName|upper}());!#
}
/**
* 通过主键删除数据
*
* @param $!{primaryKeyInfo.fieldName} 主键
* @return 是否成功
*/
public int deleteById($!{primaryKeyInfo.classTypeShort} $!{primaryKeyInfo.fieldName}) {
return this.$!{camelCaseTableName|lower}Service.deleteById($!{primaryKeyInfo.fieldName});
}
}
2.3 添加代码生成类
package pers.li;
import com.github.generatecode.model.OutTableInfo;
import com.github.generatecode.out.GenerateCode;
import com.github.generatecode.out.OutPipeFunction;
import com.github.generatecode.out.SetGenerateConf;
import com.github.generatecode.template.TypeCovert;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
/**
* @author : Mr huangye
* @URL : CSDN 皇夜_
* @createTime : 2021/4/7 13:53
* @Description :
*/
public class Test {
public static void main(String[] args) {
SetGenerateConf instance = SetGenerateConf.getInstance();
//================================================================================================= 公共部分
instance.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
instance.setUser("root");
instance.setPassword("root123");
instance.setDriver("com.mysql.jdbc.Driver");
//数据库类型 == 类类型的对应关系 可覆盖
Map<String, String> types = TypeCovert.getInstance();
types.put("datetime", "java.time.LocalDateTime");
types.put("timestamp", "java.time.LocalDateTime");
//预置模板可能会用到的管道符
Map<String, Function> pipeMap = OutPipeFunction.PIPE_MAP;
Function<Boolean, String> judgeTrue = (e) -> e==true ? "true" : "false";
Function<String, String> judgeDateTime = (e) -> e.equals("LocalDateTime") ? "true" : "false";
pipeMap.put("judgeTrue", judgeTrue);
pipeMap.put("judgeDateTime", judgeDateTime);
//以下为管道符的使用方式
//================================================================================================ 私有部分
//自定义模板存放位置
instance.setTemplateUrl("./template");
//此处不支持反斜杠,预置包名的 默认值,此处配置则不需要 针对每个人出不同给的模板,模板预置的初始路径
SetGenerateConf.put_dynamic_map("basePath", ".\\xxxx\\");
//定义作者信息
SetGenerateConf.put_dynamic_map("author", "皇夜_");
//需要生成的表
instance.setTableList(Arrays.asList(
new OutTableInfo("t_s_test", "t_s_")
));
GenerateCode.generateCode();
}
}