一、环境:
Java:11
MyBatis Plus:3.5.1
MyBatis Plus Generator:3.5.1
MPJ:1.2.3
二、适用以上版本的代码生成工具类
package com.hkl.mpjoin.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.IFill;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.fill.Property;
import com.hkl.controller.BaseController;
import java.util.Collections;
import java.util.List;
/**
* <p>Description:MP代码生成器-3.5.x完善版(推荐)</p>
* <p>Author:hkl</p>
* <p>Date:2022/8/27</p>
*/
public class MPCodeGenerator {
public static void main(String[] args) {
//模块名,必填
String moduleName = "finance";
//需要生成的表名,必填
List<String> tables = ListUtil.toList("t_user_info");
//去除表前缀,非必填
String offSetTablePrefix = "t_";
//属性值填充策略,非必填
List<IFill> tableFillList = ListUtil.toList(
new Property("createDate", FieldFill.INSERT),
new Property("updateDate", FieldFill.INSERT_UPDATE)
);
if (StrUtil.isBlank(moduleName) || CollUtil.isEmpty(tables)) {
System.out.println("请输入模块名和需要生成的表名!");
return;
}
String projectPath = System.getProperty("user.dir") + "/mybatis-plus-join-practice";
//全局配置
GlobalConfig config = new GlobalConfig.Builder()
.author("hkl") //作者
.outputDir(projectPath + "/src/main/java") //生成文件输出路径(写到java目录)
.enableSwagger() //开启swagger
.commentDate("yyyy-MM-dd") //注释日期格式
.fileOverride() //覆盖文件(需谨慎使用)
.dateType(DateType.ONLY_DATE) //设置时间对应类型
.disableOpenDir() //生成后不要打开目录
.build();
//包名配置
PackageConfig packageConfig = new PackageConfig.Builder()
.parent("com.hkl.mpjoin.modules")
.moduleName(moduleName)
.controller("controller")
.service("service")
.serviceImpl("service.impl")
.entity("entity")
.mapper("mapper")
.xml("mapper")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, projectPath + "/src/main/resources/mapper/" + moduleName))
.build();
//策略配置
StrategyConfig strategyConfig = new StrategyConfig.Builder()
.addTablePrefix(offSetTablePrefix) //需要抵消的表前缀
.addInclude(tables) //设置生成需要映射的表名
//.enableCapitalMode() //策略开启⼤写命名
.serviceBuilder() //构建Service层
.formatServiceFileName("%sService") //业务层接口类命名
.formatServiceImplFileName("%sServiceImpl") //业务层接口实现类命名
.entityBuilder() //构建实体类
.columnNaming(NamingStrategy.underline_to_camel) //字段名驼峰命名
.naming(NamingStrategy.underline_to_camel) //表名驼峰命名
.enableLombok() //添加lombock的getter、setter注解
.enableChainModel() //启动链式写法@Accessors(chain = true)
.enableColumnConstant() //启动属性转常量功能@FieldNameConstants
.logicDeleteColumnName("deleted") //逻辑删除字段,标记@TableLogic
.enableTableFieldAnnotation() //启动字段注解
.addTableFills(tableFillList) //属性值填充策略
.controllerBuilder() //构建Controller类
.enableHyphenStyle() //映射路径使用连字符格式,而不是驼峰
.formatFileName("%sController") //Controller类命名
.superClass(BaseController.class) //Controller 类继承 BaseController
.enableRestStyle() //标记@RestController注解
.mapperBuilder() //构建mapper接口类
.enableBaseResultMap() //生成基本的resultMap
.formatMapperFileName("%sMapper") //Mapper接口类明名
.superClass(BaseMapper.class) //Mapper接口类集成 BaseMapper
.enableMapperAnnotation() //标记@Mapper注解
.formatXmlFileName("%sMapper") //Mapper.xml命名
.enableBaseColumnList() //生成基本的SQL片段
.build();
//数据源配置
DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig
.Builder(
"jdbc:mysql://xxxIP:3306/test_db_one?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&autoReconnectForPools=true&serverTimezone=Asia/Shanghai",
"hkl",
"test@1234");
dataSourceConfigBuilder.typeConvert(new MySqlTypeConvert() {
@Override
public IColumnType processTypeConvert(GlobalConfig globalConfig, String tableField) {
if (tableField.toLowerCase().contains("date") || tableField.toLowerCase().contains("timestamp") || tableField.toLowerCase().contains("datetime")) {
return DbColumnType.DATE;
}
return super.processTypeConvert(globalConfig, tableField);
}
});
//创建代码生成器对象,加载配置
AutoGenerator autoGenerator = new AutoGenerator(dataSourceConfigBuilder.build());
autoGenerator.global(config);
autoGenerator.packageInfo(packageConfig);
autoGenerator.strategy(strategyConfig);
//执行
autoGenerator.execute();
System.out.println("======================================== Done 相关代码生成完毕 =====================================");
}
}
备注:
1、以上代码亲测可以生成,使用时候只需要更改相应的模块名、包名、数据源即可
2、生成的类文件如下:
3、类内容如下:
package com.hkl.mpjoin.modules.finance.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 用户基础信息表
* </p>
*
* @author hkl
* @since 2022-11-11
*/
@Getter
@Setter
@Accessors(chain = true)
@FieldNameConstants
@TableName("t_user_info")
@ApiModel(value = "UserInfo对象", description = "用户基础信息表")
public class UserInfo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("姓名")
@TableField("user_name")
private String userName;
@ApiModelProperty("密码")
@TableField("pwd")
private String pwd;
@ApiModelProperty("邮箱")
@TableField("email")
private String email;
@ApiModelProperty("价格")
@TableField("price")
private BigDecimal price;
@ApiModelProperty("是否有效(0否,1是)")
@TableField("is_enable")
private Boolean isEnable;
@ApiModelProperty("备注")
@TableField("remark")
private String remark;
@ApiModelProperty("是否已删除,0-未删除,1-已删除")
@TableField("deleted")
//@TableLogic
private Boolean deleted;
@ApiModelProperty("创建人Id")
@TableField("create_by")
private Long createBy;
@ApiModelProperty("创建时间")
@TableField("create_date")
private Date createDate;
@ApiModelProperty("修改人Id")
@TableField("update_by")
private Long updateBy;
@ApiModelProperty("修改时间")
@TableField("update_date")
private Date updateDate;
//结论为 selectAs 目标as属性要么是个新属性,要么需要在 selectAll 中把目标as的属性忽略掉
@ApiModelProperty("测试selectAs")
@TableField(exist = false)
private String remarkStr;
public UserInfo(Long id, String userName) {
this.id = id;
this.userName = userName;
}
}