使用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文件夹下,删除其他你不需要的模板。
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")#endpublic ${field.propertyType} ${getprefix}${field.capitalName}() {return ${field.propertyName};}#if(${chainModel})public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {#elsepublic void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {#endthis.${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};#elsereturn 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 {@Autowiredprivate 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;}
}