mybatis-plus代码生成器

2021年12月18日5 min read
mybatis-plus

导入依赖

<dependency>  
    <groupId>com.baomidou</groupId>  
    <artifactId>mybatis-plus-generator</artifactId>  
    <version>3.5.1</version>  
</dependency>
package com.ruben;  
  
import com.baomidou.mybatisplus.annotation.IdType;  
import com.baomidou.mybatisplus.generator.FastAutoGenerator;  
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;  
import com.baomidou.mybatisplus.generator.config.TemplateType;  
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;  
import org.junit.jupiter.api.Test;  
  
/**  
 * 生成器配置  
 *  
 * @author <achao1441470436@gmail.com>  
 * @since 2021/10/5 16:38  
 */  
public class GeneratorTests {  
  
    /**  
     * 生成代码的表名  
     */  
    private static final String TABLE_NAME = "user_info";  
  
    /**  
     * 数据库相关配置  
     */  
    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai";  
    private static final String USERNAME = "root";  
    private static final String PASSWORD = "root";  
  
    /**  
     * 注释显示的作者  
     */  
    private static final String AUTHOR = "<achao1441470436@gmail.com>";  
  
    /**  
     * 代码生成指定包名  
     */  
    private static final String PACKAGE_NAME = "com.ruben";  
  
    /**  
     * 指定代码生成路径  
     */  
    private static final String OUTPUT_DIR = "D:\\file\\tmp\\generator\\output";  
  
    /**  
     * 模板存放路径  
     */  
    private static final String TEMPLATE_PATH = "./static/generator/";  
  
    @Test  
    public void generate() {  
        System.out.println(OUTPUT_DIR);  
        FastAutoGenerator.create(new DataSourceConfig.Builder(JDBC_URL, USERNAME, PASSWORD))  
                // 全局配置  
                .globalConfig(builder -> builder.author(AUTHOR).fileOverride().outputDir(OUTPUT_DIR))  
                // 包配置  
                .packageConfig(builder -> builder.parent(PACKAGE_NAME))  
                // 策略配置  
                .strategyConfig(builder -> builder  
                        // 指定表名,如不指定,则默认生成所有  
//                        .addInclude(TABLE_NAME)  
                        .controllerBuilder().enableRestStyle()  
                        .serviceBuilder()  
                        .entityBuilder()  
                        // 指定父类  
                        .superClass(PACKAGE_NAME + ".pojo.common.BaseEntity")  
                        // 添加父类字段  
                        .addSuperEntityColumns("is_deleted", "gmt_create", "gmt_modified", "tenant_id")  
                        // 开启AR模式  
                        .enableActiveRecord()  
                        // ID类型,这里IdType是个枚举  
                        .idType(IdType.AUTO)  
                        // 表名命名转换,这里是下划线转驼峰  
                        .naming(NamingStrategy.underline_to_camel)  
                        // 表字段名转换,下划线转驼峰  
                        .columnNaming(NamingStrategy.underline_to_camel)  
                        // 开启lombok  
                        .enableLombok()  
                        // 开启链式编程 (与BeanCopier冲突)  
                        .enableChainModel())  
                // 不生成xml  
                .templateConfig(builder -> builder.disable(TemplateType.XML)  
                        .controller(TEMPLATE_PATH + "controller.java.vm")  
                        .entity(TEMPLATE_PATH + "entity.java.vm")  
                        .mapper(TEMPLATE_PATH + "mapper.java.vm")  
                        .service(TEMPLATE_PATH + "service.java.vm")  
                        .serviceImpl(TEMPLATE_PATH + "serviceImpl.java.vm")  
                )  
                // 自定义模板位置  
                .execute();  
    }  
}

以及自己使用的controller的模板:

package ${package.Controller};  
  
  
  
#if(${restControllerStyle})  
import com.baomidou.mybatisplus.core.metadata.IPage;  
import com.baomidou.mybatisplus.core.toolkit.Wrappers;  
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;  
import com.ruben.pojo.common.Result;  
import ${package.Entity}.${entity};  
import ${package.Service}.${table.serviceName};  
import org.springframework.validation.annotation.Validated;  
import org.springframework.web.bind.annotation.*;  
  
import javax.annotation.Resource;  
#else  
import org.springframework.stereotype.Controller;  
#end  
#if(${superControllerClassPackage})  
import ${superControllerClassPackage};  
#end  
  
/**  
 * <p>  
 * $!{table.comment} 前端控制器  
 * </p>  
 *  
 * @author ${author}  
 * @since ${date}  
 */  
#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  
    #set($serviceBeanName = $table.serviceName.substring(1,2).toLowerCase() + $table.serviceName.substring(2))  
    #set($entityName = $entity.substring(0,1).toLowerCase() + $entity.substring(1))  
  
    @Resource  
    private ${table.serviceName} ${serviceBeanName};  
  
    /**  
     * 查询单条记录  
     *  
     * @param id 主键  
     * @return 记录  
     * @since ${date}  
     * @author ${author}  
     */  
    @GetMapping  
    public Result get(@RequestParam("id") Long id){  
         return Result.ok().data(${entity}.builder().build().setId(id).selectById());  
    }  
  
    /**  
     * 查询列表  
     *  
     * @param page 分页参数?size=10&current=1  
     * @return 分页结果  
     * @since ${date}  
     * @author ${author}  
     */  
    @GetMapping("page")  
    public Result page(Page<${entity}> page, ${entity} ${entityName}){  
        return Result.ok().data(${entityName}.selectPage(page,Wrappers.lambdaQuery(${entityName})));  
    }  
  
    /**  
     * 新增  
     *  
     * @param ${entityName} 数据  
     * @since ${date}  
     * @author ${author}  
     */  
    @PostMapping  
    public Result insert(@RequestBody @Validated ${entity} ${entityName}){  
        ${entityName}.insert();  
        return Result.ok();  
    }  
  
    /**  
     * 更新不为null的部分  
     *  
     * @param ${entityName} 数据  
     * @since ${date}  
     * @author ${author}  
     */  
    @PatchMapping  
    public Result updateSelective(@RequestBody @Validated ${entity} ${entityName}){  
        ${entityName}.updateById();  
        return Result.ok();  
    }  
  
    /**  
     * 根据主键删除  
     *  
     * @param id 主键  
     * @since ${date}  
     * @author ${author}  
     */  
    @DeleteMapping  
    public Result delete(@RequestParam("id") Long id){  
        ${entity}.builder().build().setId(id).deleteById();  
        return Result.ok();  
    }  
  
  
}  
  
#end

entity

package ${package.Entity};  
  
#foreach($pkg in ${table.importPackages})  
import ${pkg};  
#end  
#if(${swagger2})  
import io.swagger.annotations.ApiModel;  
import io.swagger.annotations.ApiModelProperty;  
#end  
#if(${entityLombokModel})  
import lombok.*;  
    #if(${chainModel})  
    import lombok.experimental.Accessors;  
    #end  
#end  
  
/**  
 * <p>  
 * $!{table.comment}  
 * </p>  
 *  
 * @author ${author}  
 * @since ${date}  
 */  
#if(${entityLombokModel})  
@Data  
@Builder  
@NoArgsConstructor  
@AllArgsConstructor  
    #if(${chainModel})  
    @Accessors(chain = true)  
    #end  
    #if(${superEntityClass})  
    @EqualsAndHashCode(callSuper = true)  
    #else  
    @EqualsAndHashCode(callSuper = false)  
    #end  
#end  
#if(${table.convert})  
@TableName("${table.name}")  
#end  
#if(${swagger2})  
@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}> {  
#else  
public class ${entity} implements Serializable{  
#end  
  
#if(${entitySerialVersionUID})  
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(${swagger2})  
        @ApiModelProperty(value = "${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} && !${superEntityClass} )  
@Override  
protected 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  
        }