官网地址:MyBatis-Plus 🚀 为简化开发而生
开始:
添加依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.7</version></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency>
配置方法:只需要修改以下的常量即可
/*** @Description 快速生产模板代码* @Author WangKun* @Date 2024/9/14 10:28* @Version*/
@Slf4j
public class CodedGeneration {/*** @Description 代码生成* @param args* @Throws* @Return void* @Date 2024-09-20 17:10:13* @Author WangKun**/public static void main(String[] args) {log.info("---> 开始!");TABLES.add("sys_user");TABLES.add("sys_log");log.info("---> 添加表{} ", TABLES.toString());VelocityTemplate.velocityTemplate();log.info("---> 结束!");}// 以下为数据库设置// 数据库public static final String DB = "wk-admin1";// 主机public static final String HOST = "127.0.0.1";// 端口号public static final String PORT = "3306";// URLpublic static final String URL = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DB + "?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";// 用户名public static final String USER_NAME = "root";// 密码public static final String PASSWORD = "123456";// 以下为包名设置// 设置父包名public static final String PARENT = "com.xxx";// 父包public static final String MODULE_NAME = "module";// 设置实体类包名public static final String ENTITY = "entity";// 设置 Service 接口包名public static final String SERVICE = "service";// 设置 Service 实现类包名public static final String SERVICE_IMPL = "serviceImpl";// 设置 Mapper 接口包名public static final String MAPPER = "mapper";// 设置 Mapper XML 文件包名public static final String MAPPER_XML = "mapper.xml";// 设置 Controller 包名public static final String CONTROLLER = "controller";// 输出路径public static final String OUTPUT_DIR = System.getProperty("user.home") + "/Desktop";// 表集合public static final List<String> TABLES = new ArrayList<>();
模板配置:
/*** @Description 代码模板* @Author WangKun* @Date 2024/9/18 15:53* @Version*/
public class VelocityTemplate {// 数据源private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig.Builder(URL, USER_NAME, PASSWORD);/*** @param* @Description 生成模板* @Throws* @Return void* @Date 2024-09-18 15:42:51* @Author WangKun**/public static void velocityTemplate() {// 使用 FastAutoGenerator 快速配置代码生成器FastAutoGenerator.create(DATA_SOURCE_CONFIG).globalConfig(builder -> {builder.outputDir(OUTPUT_DIR) // 指定输出目录.disableOpenDir()//禁止加载完之后打开.dateType(DateType.SQL_PACK) //时间策略DateType.ONLY_DATE 默认值: DateType.TIME_PACK.commentDate("yyyy-MM-dd HH:mm:ss");//注释的日期}).packageConfig(builder -> {builder.parent(PARENT) // 设置父包名.moduleName(MODULE_NAME)// 父包.entity(ENTITY) // 设置实体类包名.service(SERVICE) // 设置 Service 接口包名.serviceImpl(SERVICE_IMPL) // 设置 Service 实现类包名.mapper(MAPPER) // 设置 Mapper 接口包名.xml(MAPPER_XML) // 设置 Mapper XML 文件包名.controller(CONTROLLER); // 设置 Controller 包名}).strategyConfig(builder -> {builder.addInclude(TABLES) // 设置需要生成的表名,多个表“”,“”.addTablePrefix("t_", "c_", "hw_") // 设置过滤表前缀 去除表的前缀如果t_user则变成User而不包含TUser.enableSkipView()//开启跳过视图//策略配置//entity层.entityBuilder().javaTemplate("templates/entity.java.vm") // 设置实体类模板.enableLombok() // 启用 Lombok.naming(NamingStrategy.underline_to_camel)//开启驼峰命名.logicDeleteColumnName("isDelete")//设置逻辑删除字段注解 @TableLogic.idType(IdType.AUTO)//设置主键类型 @TableId.enableFileOverride() // 覆盖已生成文件//service层.serviceBuilder().serviceTemplate("/templates/service.java.vm") // 设置 Service 模板.formatServiceFileName("%sService") //service层的拼接比如实体类时User拼接成UserService.serviceImplTemplate("/templates/serviceImpl.java.vm") // 设置 ServiceImpl 模板.formatServiceImplFileName("%sServiceImp") //service层的拼接比如实体类时User拼接成UserServiceImpl.enableFileOverride() // 覆盖已生成文件//mapper层.mapperBuilder().mapperTemplate("/templates/mapper.java.vm") // 设置 Mapper 模板.enableMapperAnnotation() //开启@Mapper注解.formatMapperFileName("%sMapper") //mapper层的拼接比如实体类时User拼接成UserMapper.xml.mapperXmlTemplate("/templates/mapper.xml.vm") // 设置 xml 模板.formatXmlFileName("%sMapper.xml") //mapper层的拼接比如实体类时User拼接成UserMapper.xml.enableFileOverride() // 覆盖已生成文件//controller层.controllerBuilder().template("templates/controller.java.vm") // 设置 Controller 模板.formatFileName("%sController")//controller层的拼接比如实体类时User拼接成UserController.enableRestStyle()//开启rest风格,主要为加了@RestController.enableHyphenStyle()//开启驼峰命名.enableFileOverride();// 覆盖已生成文件}).execute(); // 执行生成}}
自定义模板:在resources下新建以下模板
controller.java.vm
package ${package.Controller};import ${package.Service}.${entity}Service
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
#if(${restControllerStyle})
import org.springframework.web.bind.annotation.RestController;
#else
import org.springframework.stereotype.Controller;
#end
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end/*** @Description ${entity}前端控制器* @Author WangKun* @Date ${date}* @Version*/
@RequiredArgsConstructor
#if(${restControllerStyle})
@RestController
#else
@Controller
#end
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
#if(${kotlin})
class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end#else
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#endprivate final ${entity}Service ${table.entityPath}Service;}
#end
entity.java.vm
package ${package.Entity};#foreach($pkg in ${table.importPackages})
import ${pkg};
#end
#if(${springdoc})
import io.swagger.v3.oas.annotations.media.Schema;
#elseif(${swagger})
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
#end
#if(${entityLombokModel})
import lombok.Data;
import java.io.Serial;
#if(${chainModel})
import lombok.experimental.Accessors;
#end
#end/*** @Description ${entity}实体类* @Author WangKun* @Date ${date}* @Version*/
#if(${entityLombokModel})
@Data#if(${chainModel})
@Accessors(chain = true)#end
#end
#if(${table.convert})
@TableName("${schemaName}${table.name}")
#end
#if(${springdoc})
@Schema(name = "${entity}", description = "$!{table.comment}")
#elseif(${swagger})
@ApiModel(value = "${entity}对象", description = "$!{table.comment}")
#end
#if(${superEntityClass})
public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
#elseif(${activeRecord})
public class ${entity} extends Model<${entity}> {
#elseif(${entitySerialVersionUID})
public class ${entity} implements Serializable {
#else
public class ${entity} {
#end
#if(${entitySerialVersionUID})@Serialprivate static final long serialVersionUID = 1L;
#end
## ---------- BEGIN 字段循环遍历 ----------
#foreach($field in ${table.fields})#if(${field.keyFlag})
#set($keyPropertyName=${field.propertyName})
#end
#if("$!field.comment" != "")#if(${springdoc})@Schema(description = "${field.comment}")#elseif(${swagger})@ApiModelProperty("${field.comment}")#else/*** ${field.comment}*/#end
#end
#if(${field.keyFlag})
## 主键#if(${field.keyIdentityFlag})@TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)#elseif(!$null.isNull(${idType}) && "$!idType" != "")@TableId(value = "${field.annotationColumnName}", type = IdType.${idType})#elseif(${field.convert})@TableId("${field.annotationColumnName}")#end
## 普通字段
#elseif(${field.fill})
## ----- 存在字段填充设置 -----#if(${field.convert})@TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})#else@TableField(fill = FieldFill.${field.fill})#end
#elseif(${field.convert})@TableField("${field.annotationColumnName}")
#end
## 乐观锁注解
#if(${field.versionField})@Version
#end
## 逻辑删除注解
#if(${field.logicDeleteField})@TableLogic
#endprivate ${field.propertyType} ${field.propertyName};
#end
## ---------- END 字段循环遍历 ----------
#if(!${entityLombokModel})
#foreach($field in ${table.fields})#if(${field.propertyType.equals("boolean")})#set($getprefix="is")#else#set($getprefix="get")#endpublic ${field.propertyType} ${getprefix}${field.capitalName}() {return ${field.propertyName};}#if(${chainModel})public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {#elsepublic void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {#endthis.${field.propertyName} = ${field.propertyName};#if(${chainModel})return this;#end}
#end
## --foreach end---
#end
## --end of #if(!${entityLombokModel})--
#if(${entityColumnConstant})#foreach($field in ${table.fields})public static final String ${field.name.toUpperCase()} = "${field.name}";#end
#end
#if(${activeRecord})@Overridepublic Serializable pkVal() {#if(${keyPropertyName})return this.${keyPropertyName};#elsereturn null;#end}
#end
#if(!${entityLombokModel})@Overridepublic String toString() {return "${entity}{" +#foreach($field in ${table.fields})#if($!{foreach.index}==0)"${field.propertyName} = " + ${field.propertyName} +#else", ${field.propertyName} = " + ${field.propertyName} +#end#end"}";}
#end
}
mapper.java.vm
package ${package.Mapper};import ${package.Entity}.${entity};
import ${superMapperClassPackage};
#if(${mapperAnnotationClass})
import ${mapperAnnotationClass.name};
#end/*** @Description ${entity}Mapper 接口* @Author WangKun* @Date ${date}* @Version*/
#if(${mapperAnnotationClass})
@${mapperAnnotationClass.simpleName}
#end
#if(${kotlin})
interface ${table.mapperName} : ${superMapperClass}<${entity}>
#else
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {}
#end
mapper.xml.vm
<?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="${package.Mapper}.${table.mapperName}">#if(${enableCache})<!-- 开启二级缓存 --><cache type="${cacheClassName}"/>#end
#if(${baseResultMap})<!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
#foreach($field in ${table.fields})
#if(${field.keyFlag})##生成主键排在第一位<id column="${field.name}" property="${field.propertyName}" />
#end
#end
#foreach($field in ${table.commonFields})##生成公共字段<result column="${field.name}" property="${field.propertyName}" />
#end
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段<result column="${field.name}" property="${field.propertyName}" />
#end
#end</resultMap>#end
#if(${baseColumnList})<!-- 通用查询结果列 --><sql id="Base_Column_List">
#foreach($field in ${table.commonFields})${field.columnName},
#end${table.fieldNames}</sql>#end
</mapper>
service.java.vm
package ${package.Service};import ${package.Entity}.${entity};
import ${superServiceClassPackage};/*** @Description ${entity}服务类* @Author WangKun* @Date ${date}* @Version*/
#if(${kotlin})
interface ${table.serviceName} : ${superServiceClass}<${entity}>
#else
public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {}
#end
serviceImpl.java.vm
package ${package.ServiceImpl};import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
#if(${generateService})
import ${package.Service}.${table.serviceName};
#end
import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service;/*** @Description ${entity}服务实现类* @Author WangKun* @Date ${date}* @Version*/
@Service
#if(${kotlin})
open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>()#if(${generateService}), ${table.serviceName}#end {}
#else
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}>#if(${generateService}) implements ${table.serviceName}#end {}
#end