springboot+mybatis-plus代码生成器,有手就会!!!

springboot的含义,顾名思义,就是敏捷开发,随着技术的发展,现在代码量越来越少。现在的人很聪明,直接把代码给封装好,一键启动后,就会得到我们所需要的代码,话不多说,直接上代码。

pom.xml

<!--代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!-- mybatis plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

application.yml

###### Mybatis Plus配置 ######
mybatis-plus:
  configuration:
    # 控制台打印SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
###### 自定义配置 ######
csc:
  ### 日志记录方式 ###
  audit-log:
    enabled: true
    log-type: console,db

封装代码

!!!需注意,代码封装里的接口是我目前根据需求进行的封装,代码生成后可能会产生代码的报错,跟数据库结构有关系,需要根据自身需求自行调整。
在resources文件夹下创建 templates 文件夹,将封装好的代码放到里面,如图所示:
在这里插入图片描述

controller.java.vm
package ${
    
    package.Controller};


import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

import ${
    
    package.Service}.${
    
    table.serviceName};
import ${
    
    package.Mapper}.${
    
    table.mapperName};
import ${
    
    package.Entity}.${
    
    entity};

#if(${
    
    restControllerStyle})
import org.springframework.web.bind.annotation.RestController;
#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
@Api(tags = "")
@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

    @Resource
    private ${
    
    table.serviceName} ${
    
    table.entityPath}Service;
    @Resource
    private ${
    
    table.mapperName} ${
    
    table.entityPath}Mapper;

    // 新增或者更新
    @PostMapping("/save")
    @ApiOperation(value = "新增或者更新")
    public Result save(@RequestBody ${
    
    entity} ${
    
    table.entityPath}) {
    
    
        return Result.success( ${
    
    table.entityPath}Service.saveOrUpdate(${
    
    table.entityPath}));
    }

    @PostMapping("/logic_del/{id}")
    @ApiOperation(value = "逻辑删除")
    public Result logic_del(@PathVariable Integer id) {
    
    
         ${
    
    entity} ${
    
    table.entityPath} = ${
    
    table.entityPath}Mapper.selectById(id);
         //${table.entityPath}Mapper.setStatus(false);
         return Result.success(${
    
    table.entityPath}Mapper.updateById(${
    
    table.entityPath}));
    }

    @DeleteMapping("/del/{id}")
    @ApiOperation(value = "删除")
    public Result del(@PathVariable Integer id){
    
    
            return  Result.success(${
    
    table.entityPath}Service.removeById(id));
    }

    @PostMapping("/del/batch")
    @ApiOperation(value = "登录")
    public Result deleteBatch(@RequestBody List<Integer> ids) {
    
    
        ${
    
    table.entityPath}Service.removeByIds(ids);
        return Result.success();
    }

    @GetMapping("/findAll")
    @ApiOperation(value = "查询所有")
    public Result findAll() {
    
    
        return Result.success(${
    
    table.entityPath}Service.list());
    }

    @GetMapping("/{id}")
    @ApiOperation(value = "根据id查询")
    public Result findOne(@PathVariable Integer id) {
    
    
        return Result.success(${
    
    table.entityPath}Service.getById(id));
    }

    @GetMapping("/page")
    @ApiOperation(value = "分页查询")
    public Result findPage(@RequestParam Integer pageNum,
                                @RequestParam Integer pageSize) {
    
    
        QueryWrapper<${
    
    entity}> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id");
        queryWrapper.ne("status",false);
        return Result.success(${
    
    table.entityPath}Service.page(new Page<>(pageNum, pageSize), queryWrapper));
    }

}

#end

entity.java.vm
package ${
    
    package.Entity};

#foreach($pkg in ${
    
    table.importPackages})
import ${
    
    pkg};
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
#end
#if(${
    
    swagger})

#end
#if(${
    
    entityLombokModel})
import lombok.Getter;
import lombok.Setter;
#if(${
    
    chainModel})
import lombok.experimental.Accessors;
#end
#end

/**
 * <p>
 * $!{table.comment}
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
#if(${
    
    entityLombokModel})
@Getter
@Setter
@ApiModel("")
  #if(${
    
    chainModel})
@Accessors(chain = true)
  #end
#end
#if(${
    
    table.convert})
@TableName("${schemaName}${table.name}")
#end
#if(${
    
    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})

    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(${
    
    swagger})
    @ApiModelProperty("${field.comment}")
  #else
    /**
     * ${field.comment}
     */
    @ApiModelProperty("${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.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};

/**
 * <p>
 * $!{table.comment} 服务类
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
#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};
import ${
    
    package.Service}.${
    
    table.serviceName};
import ${
    
    superServiceImplClassPackage};
import org.springframework.stereotype.Service;

/**
 * <p>
 * $!{table.comment} 服务实现类
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
@Service
#if(${
    
    kotlin})
open class ${
    
    table.serviceImplName} : ${
    
    superServiceImplClass}<${
    
    table.mapperName}, ${
    
    entity}>(), ${
    
    table.serviceName} {
    
    

}
#else
public class ${
    
    table.serviceImplName} extends ${
    
    superServiceImplClass}<${
    
    table.mapperName}, ${
    
    entity}> implements ${
    
    table.serviceName} {
    
    

}
#end

配置代码

创建与启动类同级别的俩个文件夹,config 和 utils ,为更好的区别代码。
在config文件下创建 MybatisPlusConfig.java ,注意好@MapperScan注解里的路径,为mapper的文件夹位置。

package com.maintenanceDispatch.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.maintenanceDispatch.mapper")
public class MybatisPlusConfig {
    
    
    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
    
    
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

核心代码

注意好里面需要填写的内容,文件位置一定不要写错,数据库的参数也不要写错。
创建CodeGenerator.java 放到utils文件夹下:

package com.maintenanceDispatch.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import java.util.Collections;

/**
 * 代码生成器
 */
public class CodeGenerator {
    
    
    public static void main(String[] args) {
    
    
        generate();
    }

    public static void generate() {
    
    
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/数据库名字?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai",
                        "用户名", "密码")
                .globalConfig(builder -> {
    
    
                    builder.author("ysdysyn") // 设置作者
//                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("D:\\桌面\\maintenance_dispatch\\src\\main\\java\\"); // 指定输出目录
                })
                .packageConfig(builder -> {
    
    
                    builder.parent("com.maintenanceDispatch") // 设置父包名
                            .moduleName("") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D:\\桌面\\maintenance_dispatch\\src\\main\\resources\\mapper\\")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
    
    
                    builder.entityBuilder().enableLombok();
                    builder.mapperBuilder().enableMapperAnnotation().build();
                    builder.controllerBuilder().enableHyphenStyle()  // 开启驼峰转连字符
                            .enableRestStyle();  // 开启生成@RestController 控制器
                    builder.addInclude("dispatch_main_file") // 设置需要生成的表名
                            .addTablePrefix("dispatch_"); // 设置过滤表前缀
                })
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();

    }

}

到这,我们的代码生成器就配置好了,在CodeGenerator类里右键启动,在控制台里显示文件已生成后,代表着我们已经成功了。
如有疑问,敬请留言,欢迎进行讨论。
小白路漫漫,让我们一起加油!!!

猜你喜欢

转载自blog.csdn.net/weixin_52473844/article/details/132493870
今日推荐