Springboot集成请参考上篇博文:Springboot集成mybatis-plus自动生成代码
一、
整理版,添加了注释模版,常用基础方法
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .*;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* @Author 郝南过
* @Date 2023/11/6 16:30
* @Version 1.0
* mybatis-plus代码生成器官网地址 /pages/d357af/
*/
public class CodeGenerator {
private static final String Author = "郝南过";
/**数据库连接字段配置**/
private static final String JDBC_URL = "jdbc:mysql://139.198.179.225:3306/hng?useUnicode=true&useSSL=false&characterEncoding=utf8";
private static final String JDBC_USER_NAME = "root";
private static final String JDBC_PASSWORD = "@1Verizon";
/**包名和模块名配置**/
private static final String PACKAGE_NAME = ""; //包名
private static final String MODULE_NAME = "business"; //模块名
/**相关路径配置**/
private static final String projectPath = ("");//项目地址
private static final String OUT_FILE_PATH =projectPath +"/"+MODULE_NAME+"/src/main/java";//生成文件存放路径(可根据需要指定生成到某个模块下)
/**相关模式开关**/
private static final boolean IF_RECOVER_ENABLE = true; //再次调用时是否覆盖原文件
private static final boolean IF_OPEN_DIRECTORY = false; //是否打开输出目录 默认值:true
private static final boolean IF_SWAGGER2 = true; //是否开启swagger2模式 实体属性 Swagger2 注解
private static final boolean IF_BASE_COLUMN_LIST = false; //开启 baseColumnList (通用查询结果列),默认false,开启后文件中将生成对应代码
private static final boolean IF_BASE_COLUMN_MAP = false; //开启 BaseResultMap (通用查询映射结果),默认false,开启后文件中将生成对应代码
private static final boolean IF_ACTIVE_RECORD = true; //开启ActiveRecord模式,默认false,参考:/qq_31762741/article/details/120392656
private static final boolean IF_ENABLE_CACHE = false; // 是否在xml中添加二级缓存配置,默认false
/**表设置**/
private static final String TABLE_PREFIX = "_"; //表名的前缀,从表生成代码时会去掉前缀,没有前缀就只写_
/**模版设置**/
private static final String templatePath = "/templates/";// 如果模板引擎是 freemarker
//private static final String templatePath = "/templates/";// 如果模板引擎是 velocity
private static final String Controller_template = "templates/vm/";
private static final String Service_template = "templates/vm/";
private static final String ServiceImpl_template = "templates/vm/";
/**
* <p>
* 读取控制台内容 控制台输入模块表名回车自动生成对应项目目录中
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner();
StringBuilder help = new StringBuilder();
("请输入" + tip + ":");
(());
if (()) {
String ipt = ();
if ((ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
/**
* 主方法,包括(1.全局配置、2.数据源配置、3.包配置、4.自定义配置、5.模版配置、6.策略配置)
* @param args
*/
public static void main(String[] args) {
//代码生成器
AutoGenerator mpg = new AutoGenerator();
//全局配置
GlobalConfig gc = new GlobalConfig();
GlobalConfig(gc,mpg);
//数据源配置
DataSourceConfig dsc = new DataSourceConfig();
DataSourceConfig(dsc,mpg);
//包配置
PackageConfig pc = new PackageConfig();
PackageConfig(pc,mpg);
//自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
InjectionConfig(cfg,mpg);
//模版配置
TemplateConfig templateConfig = new TemplateConfig();
TemplateConfig(templateConfig,mpg);
//策略配置
StrategyConfig strategy = new StrategyConfig();
StrategyConfig(strategy,pc,mpg);
(new FreemarkerTemplateEngine());
();
}
// 全局配置
private static AutoGenerator GlobalConfig(GlobalConfig gc,AutoGenerator mpg){
(IF_RECOVER_ENABLE);//再次调用时是否覆盖原文件
(OUT_FILE_PATH);
(Author);
(IF_OPEN_DIRECTORY); //是否打开输出目录 默认值:true
gc.setSwagger2(IF_SWAGGER2); //是否开启swagger2模式 实体属性 Swagger2 注解
(IF_BASE_COLUMN_LIST); //开启 baseColumnList (通用查询结果列),默认false
(IF_BASE_COLUMN_MAP); //开启 BaseResultMap (通用查询映射结果),默认false
(IF_ACTIVE_RECORD); //开启ActiveRecord模式,默认false
(IF_ENABLE_CACHE); // 是否在xml中添加二级缓存配置,默认false
();// AUTO(0)使用数据库id,NONE(1)不设置id生成策略,INPUT(2)用户手工输入id,ASSIGN_ID(3)雪花算法生成id(可兼容数值型与字符串型),ASSIGN_UUID(4)以UUID生成算法作为id生成策略
// 自定义文件命名,注意 %s 会自动填充表实体属性(各层文件名称方式,例如:%sAction生成UserAction, %s为占位符)
("%sController");
("%sService");
("%sServiceImpl");
("%sMapper");
("%sMapper");
//("%sEntity");
(gc);
return mpg;
}
//数据源配置
private static AutoGenerator DataSourceConfig(DataSourceConfig dsc,AutoGenerator mpg){
(JDBC_URL);
//("public");
("");
(JDBC_USER_NAME);
(JDBC_PASSWORD);
(dsc);
return mpg;
}
//包配置
private static AutoGenerator PackageConfig(PackageConfig pc,AutoGenerator mpg){
//(scanner("模块名"));
(MODULE_NAME);
//你的项目包结构名
(PACKAGE_NAME);
(pc);
return mpg;
}
//自定义配置
private static AutoGenerator InjectionConfig(InjectionConfig cfg ,AutoGenerator mpg){
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化
// 注意此处要想生效,需要在模版设置中将XML设置为null,使默认的xml目录不再生成
return projectPath +"/"+ MODULE_NAME + "/src/main/resources/mapper/"
+ () + "Mapper" + StringPool.DOT_XML;
}
});
/*
(new IFileCreate() {
@Override
public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
// 判断自定义文件夹是否需要创建
checkDir("调用默认方法创建的目录,自定义目录用");
if (fileType == ) {
// 已经生成 mapper 文件判断存在,不想重新生成返回 false
return !new File(filePath).exists();
}
// 允许生成模板文件
return true;
}
});
*/
(focList);
(cfg);
return mpg;
}
//模版配置
private static AutoGenerator TemplateConfig(TemplateConfig templateConfig,AutoGenerator mpg){
// 配置自定义输出模板
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
(Controller_template);
(Service_template);
(ServiceImpl_template);
// ("templates/vm/");
// ("templates/vm/");
// ("templates/vm/");
//使默认的xml目录不再生成,使用自定义的resource/mapper输出目录
(null);
(templateConfig);
return mpg;
}
//策略配置
private static AutoGenerator StrategyConfig(StrategyConfig strategy,PackageConfig pc,AutoGenerator mpg){
//数据库表映射到实体的命名策略
(NamingStrategy.underline_to_camel);
//数据库表字段映射到实体的命名策略
(NamingStrategy.underline_to_camel);
//("你自己的父类实体,没有就不用设置!");
(true);
(true);//restful api风格控制器
// 公共父类
//("你自己的父类控制器,没有就不用设置!");
// 自动填充
TableFill createTime = new TableFill("create_Time", );
TableFill updateTime = new TableFill("update_Time",FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<TableFill>();
(createTime);
(updateTime);
(tableFills);
// 写于父类中的公共字段
// ("id");
(scanner("表名,多个英文逗号分割").split(","));
(true);
//生成实体类等时去掉表前缀
(TABLE_PREFIX);
(() + "_");
(strategy);
return mpg;
}
}
补充:需要实现如下代码(作废)
package ;
import ;
import .slf4j.Slf4j;
import ;
import ;
import ;
/**
* 自定义元数据对象处理器
*/
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
/**
* 插入操作自动填充
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
("createTime", ());
("updateTime", ());
// ("createBy", ());
// ("updateBy", ());
}
/**
* 更新操作
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
("公共字段");
("updateTime", ());
// ("updateUser",());
}
}
二、
仅提供基础方法,可根据具体需求自行改造
package ${};
import ;
import ;
import ;
import ;
import .*;
import ;
import .slf4j.Slf4j;
import ${}.${entity};
import ${}.${};
/**
* <p>
* ${!} 前端控制器
* </p>
*/
@Slf4j
@Api(value = "${entity}", tags = "${entity}")
@RestController
@RequestMapping("<#if ?? && != "">/${}</#if>/<#if controllerMappingHyphenStyle>${controllerMappingHyphen}<#else>${}</#if>")
public class ${} {
@Autowired
private ${} ${?uncap_first};
/**
* 新增数据
*
* @param ${entity?uncap_first} 实体对象
* @return Result
*/
@PostMapping("add")
@ResponseBody
public Result<?> add(@Validated @RequestBody ${entity} ${entity?uncap_first}) {
return ${?uncap_first}.add${entity}(${entity?uncap_first});
}
/**
* 根据ID查询数据
*
* @param id ID
* @return Result
*/
@GetMapping("getById/{id}")
@ResponseBody
public Result<?> getById(@PathVariable Long id) {
if(id!=null){
return ${?uncap_first}.get${entity}ById(id);
}
return (ErrorEnum.REQUEST_FAIL, "id为空");
}
/**
* 更新数据
*
* @param ${entity?uncap_first} 实体对象
* @return Result
*/
@PostMapping("update")
@ResponseBody
public Result<?> update(@Validated @RequestBody ${entity} ${entity?uncap_first}) {
if(${entity?uncap_first}.getId()!=null){
return ${?uncap_first}.update${entity}(${entity?uncap_first});
}
return (ErrorEnum.REQUEST_FAIL, "id为空");
}
/**
* 删除数据
*
* @param id ID
* @return Result
*/
@PostMapping("delete/{id}")
@ResponseBody
public Result<?> delete(@PathVariable Long id) {
if(id!=null){
return ${?uncap_first}.delete${entity}(id);
}
return (ErrorEnum.REQUEST_FAIL, "id为空");
}
}
三、
仅提供基础方法,可根据具体需求自行改造
package ${};
import ;
import ${}.${entity};
import ${superServiceClassPackage};
/**
* <p>
* ${!} 服务类
* </p>
*/
public interface ${} extends ${superServiceClass}<${entity}> {
/**
* 新增数据
*
* @param ${"${entity}"} 实体对象
* @return Result
*/
Result<?> ${"add${entity}"}(${"${entity}"} ${"${entity?uncap_first}"});
/**
* 根据ID查询数据
*
* @param id ID
* @return Result
*/
Result<?> ${"get${entity}ById(Long id)"};
/**
* 更新数据
*
* @param ${entity?uncap_first} 实体对象
* @return Result
*/
Result<?> ${"update${entity}"}(${entity} ${entity?uncap_first});
/**
* 删除数据
*
* @param id ID
* @return Result
*/
Result<?> ${"delete${entity}"}(Long id);
}
四、
仅提供基础方法,可根据具体需求自行改造
package ${};
import ${}.${entity};
import ${}.${};
import ${}.${};
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* <p>
* ${!} 服务实现类
* </p>
*/
@Service
public class ${} extends ${superServiceImplClass}<${}, ${entity}> implements ${} {
@Autowired
private ${} ${?uncap_first};
/**
* 新增数据
*
* @param ${entity?uncap_first} 实体对象
* @return Result
*/
@Override
public Result<?> add${entity}(${entity} ${entity?uncap_first}) {
<#-- //忽略不需要手动填入的属性插入,预防误填出错-->
<#-- CopyOptions options = ()-->
<#-- .setIgnoreProperties("createTime").setIgnoreProperties("updateTime")-->
<#-- .setIgnoreProperties("createBy").setIgnoreProperties("updateBy");-->
<#-- (${entity?uncap_first}, ${entity?uncap_first},options);-->
(${entity?uncap_first}, ${entity?uncap_first});
return (${?uncap_first}.insert(${entity?uncap_first}) > 0 ?
:ErrorEnum.REQUEST_FAIL , null);
}
/**
* 根据ID查询数据
*
* @param id ID
* @return responseResult
*/
@Override
public Result<?> get${entity}ById(Long id) {
${entity} ${entity?uncap_first} = ${?uncap_first}.selectById(id);
if(${entity?uncap_first} != null){
return (, ${entity?uncap_first});
}else{
return (ErrorEnum.DATA_NOT_FOUND, null);
}
}
/**
* 更新数据
*
* @param ${entity?uncap_first} 实体对象
* @return Result
*/
@Override
public Result<?> update${entity}(${entity} ${entity?uncap_first}) {
if(${?uncap_first}.updateById(${entity?uncap_first}) > 0){
return (, "更新成功");
}else{
return (ErrorEnum.DATA_NOT_FOUND, null);
}
}
/**
* 删除数据
*
* @param id ID
* @return Result
*/
@Override
public Result<?> delete${entity}(Long id) {
if(${?uncap_first}.deleteById(id) > 0 ){
return (, "删除成功");
}else{
return (ErrorEnum.DATA_NOT_FOUND,null);
}
}
}
五、其他注意事项
代码中涉及的 和 为之前博文【Springboot项目返回数据统一封装】所写,如需要可参考: Springboot项目返回数据统一封装。也可直接替换成公共的或自己代码中自定义的。