使用mybatis-plus-generator配置一套适合你的CRUD

1、maven引入 mybatis-plus-generator 和模板引擎,你也可以使用freemarker之类的,看个人

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

        <!-- velocity模板引擎 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

2、创建MybatisCrud工具类,这里可以做很多个性化配置,比如改名他默认的 IService之类的,指定表,忽略某些字段等。更多详情见官网 代码生成器配置新 | MyBatis-Plus

package com.XXXX.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.XXXX.entity.BaseEntity;

import java.util.Collections;

/**
 * @Auther:Tiancong Zou
 * @Date: 2023/3/16 21:46
 * @Description:
 */
public class MybatisCrud {
    public static void main(String[] args) {
        FastAutoGenerator.create(
                        "jdbc:mysql://127.0.0.1:3306/数据库名" ,
                        "root" ,
                        "")
                .globalConfig(builder -> {
                    builder.author("Tiancong Zou") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("D:\\myJavaTest\\"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.XXXX") // 设置父包名
                            .mapper("dao")
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D:\\myJavaTest\\mapper\\")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.serviceBuilder()
                            .formatServiceFileName("%sService")
                            .formatServiceImplFileName("%sServiceImpl")
                            .convertServiceFileName((entityName -> entityName + "Service"));
                    builder.addInclude("sys_dict_item");// 设置需要生成的表名
                    builder.entityBuilder()
                            .superClass(BaseEntity.class )
                            .addIgnoreColumns("deleted","create_date","update_date");
                })
                .execute();
    }
}

3、copy模板,进行定制配置,找到jar包下的模板,复制templates到resources文件夹下,删除其他你不需要的模板。

f9953a3a69b04afe96e1b605cee92e1c.png

4、模板配置,这边使用 velocity 模板做演示

      4.1  controller.java.vm

package ${package.Controller};

import org.springframework.web.bind.annotation.*;
import ${package.Service}.${table.serviceName};
import ${package.Entity}.${entity};
import com.muchuantong.utils.Result;
import com.muchuantong.utils.SnowFlake;
import org.springframework.beans.factory.annotation.Autowired;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.Map;

#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end

/**
 * <p>
 * $!{table.comment} 前端控制器
 * </p>
 *
 * @Author: ${author}
 * @Date: ${date}
 * @Annotation:
 */

@RestController
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
public class ${table.controllerName} {


@Autowired
private ${table.serviceName} ${table.entityPath}Service;

// 分页
@GetMapping("getPage")
public  Result<Object> page(@ModelAttribute DTO dto){
        return ${table.entityPath}Service.getPage(dto);
        }

// 新增
@PostMapping("save")
public Result<Object> save(@RequestBody ${entity} ${table.entityPath}){
    ${table.entityPath}.setId(Long.toString(SnowFlake.nextId()));
    ${table.entityPath}.setCreateDate(new Timestamp(new Date().getTime()));
    ${table.entityPath}.setUpdateDate(new Timestamp(new Date().getTime()));
        try{
    ${table.entityPath}Service.save(${table.entityPath});
        return new Result<>();
        }catch(Exception e){
        e.printStackTrace();
        return new Result<>("201" ,"未知错误");
        }
        }
// 修改
@PostMapping("update")
public  Result<Object> update(@RequestBody ${entity} ${table.entityPath}){
        try{
    ${table.entityPath}.setUpdateDate(new Timestamp(new Date().getTime()));
    ${table.entityPath}Service.updateById(${table.entityPath});
        return new Result<>();
        }catch(Exception e){
        e.printStackTrace();
        return new Result<>("201" ,"未知错误");
        }

        }

// 根据id获取
@GetMapping("getById/{id}")
public  Result<Object> getById(@PathVariable("id") Long id){
    ${entity} ${table.entityPath} = ${table.entityPath}Service.getById(id);
        return new Result<>(${table.entityPath});
        }

// 逻辑删除
@PostMapping("deleteByIds")
public Result<Object> deleteByIds(@RequestBody List<Long> ids){
        for (Long id : ids) {
            ${entity} ${table.entityPath} = ${table.entityPath}Service.getById(id);
            ${table.entityPath}.setDeleted(1);
        try {
            ${table.entityPath}Service.updateById(${table.entityPath});
        return new Result<>();
        } catch (Exception e) {
        e.printStackTrace();
        return new Result<>("201", "未知错误");
        }
        }
        return null;
        }
        }

      4.2  service.java.vm

package ${package.Service};

import ${package.Entity}.${entity};
import ${superServiceClassPackage};
import com.muchuantong.utils.Result;

import java.util.Map;

/**
 * <p>
 * $!{table.comment} 服务类
 * </p>
 *
 * @Author: ${author}
 * @Date: ${date}
 * @Annotation:
 */
public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {
        Result getPage(DTO dto);
        }

4.3  serviceImpl.java.vm

package ${package.ServiceImpl};
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.primitives.Longs;
import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import ${superServiceImplClassPackage};
import com.muchuantong.utils.Result;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.Optional;
/**
 * <p>
 * $!{table.comment} 服务实现类
 * </p>
 *
 * @Author: ${author}
 * @Date: ${date}
 * @Annotation:
 */
@Service
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {
@Override
public Result getPage(DTO dto){
        QueryWrapper<${entity}> wrapper=new QueryWrapper<>();
        Page<${entity}> page=page(new Page<>(dto.getCurrent(),dto.getSize()),wrapper);
        return new Result<> (page);
        }
        }

 4.4  entity.java.vm

package ${package.Entity};

#foreach($pkg in ${table.importPackages})
import ${pkg};
#end
#if(${swagger})
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
#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
    #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}
         */
        #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
        }

4.5  mapper.java.vm

package ${package.Mapper};

import ${package.Entity}.${entity};
import ${superMapperClassPackage};
#if(${mapperAnnotation})
import org.apache.ibatis.annotations.Mapper;
#end

/**
 * <p>
 * $!{table.comment} Mapper 接口
 * </p>
 *
 * @Author: ${author}
 * @Date: ${date}
 * @Annotation:
 */
#if(${mapperAnnotation})
@Mapper
#end
#if(${kotlin})
interface ${table.mapperName} : ${superMapperClass}<${entity}>
#else
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {

}
#end

4.6 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}">
    <!-- 通用查询映射结果 -->
    <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>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
            #foreach($field in ${table.commonFields})
                ${field.columnName},
            #end
            ${table.fieldNames}
    </sql>
</mapper>

5、生成代码预览,毫无问题 controller

package com.muchuantong.controller;

import com.muchuantong.entity.DTO;
import org.springframework.web.bind.annotation.*;
import com.muchuantong.service.SysDictItemService;
import com.muchuantong.entity.SysDictItem;
import com.muchuantong.utils.Result;
import com.muchuantong.utils.SnowFlake;
import org.springframework.beans.factory.annotation.Autowired;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @Author: Tiancong Zou
 * @Date: 2023-03-28
 * @Annotation:
 */

@RestController
@RequestMapping("/sysDictItem")
public class SysDictItemController {


    @Autowired
    private SysDictItemService sysDictItemService;

    // 分页
    @GetMapping("getPage")
    public  Result<Object> page(@ModelAttribute DTO dto){
        return sysDictItemService.getPage(dto);
    }

    // 新增
    @PostMapping("save")
    public Result<Object> save(@RequestBody SysDictItem sysDictItem){
        sysDictItem.setId(Long.toString(SnowFlake.nextId()));
        sysDictItem.setCreateDate(new Timestamp(new Date().getTime()));
        sysDictItem.setUpdateDate(new Timestamp(new Date().getTime()));
        try{
            sysDictItemService.save(sysDictItem);
            return new Result<>();
        }catch(Exception e){
            e.printStackTrace();
            return new Result<>("201" ,"未知错误");
        }
    }
    // 修改
    @PostMapping("update")
    public  Result<Object> update(@RequestBody SysDictItem sysDictItem){
        try{
            sysDictItem.setUpdateDate(new Timestamp(new Date().getTime()));
            sysDictItemService.updateById(sysDictItem);
            return new Result<>();
        }catch(Exception e){
            e.printStackTrace();
            return new Result<>("201" ,"未知错误");
        }

    }

    // 根据id获取
    @GetMapping("getById/{id}")
    public  Result<Object> getById(@PathVariable("id") Long id){
        SysDictItem sysDictItem = sysDictItemService.getById(id);
        return new Result<>(sysDictItem);
    }

    // 逻辑删除
    @PostMapping("deleteByIds")
    public Result<Object> deleteByIds(@RequestBody List<Long> ids){
        for (Long id : ids) {
            SysDictItem sysDictItem = sysDictItemService.getById(id);
            sysDictItem.setDeleted(1);
            try {
                sysDictItemService.updateById(sysDictItem);
                return new Result<>();
            } catch (Exception e) {
                e.printStackTrace();
                return new Result<>("201", "未知错误");
            }
        }
        return null;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邹田聪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值