自学内容网 自学内容网

MyBatis-Plus代码一键生成

官网地址: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";
    // URL
    public 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} {
#end

    private 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})

    @Serial
    private 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
#end
    private ${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")
  #end

    public ${field.propertyType} ${getprefix}${field.capitalName}() {
        return ${field.propertyName};
    }

  #if(${chainModel})
    public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
  #else
    public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
  #end
        this.${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})

    @Override
    public Serializable pkVal() {
  #if(${keyPropertyName})
        return this.${keyPropertyName};
  #else
        return null;
  #end
    }
#end
#if(!${entityLombokModel})

    @Override
    public 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


原文地址:https://blog.csdn.net/WangKun_0612/article/details/142391541

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!