没有斗争就没有功绩,没有功绩就没有奖赏,而没有行动就没有生活——别林斯基
之前写过一篇,不过当时是快照版直接跑在源码环境里,今天我们使用最新的api
,并且使用GAV
引入
<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¤t=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
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 }
entity
的