mybatis-plus根据库表一键生成CURD代码
Posted justry_deng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis-plus根据库表一键生成CURD代码相关的知识,希望对你有一定的参考价值。
使用方式
- 第一步:引入下方的给出的相关依赖
- 第二步:将下方的单元测试类直接贴进去
- 第三步:运行单元测试即可
注:本人测试用的是junit5,如果用的是junit4的话,简单改一下即可
相关依赖
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 代码生成器相关 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
<scope>test</scope>
</dependency>
<!-- IOUtil、PathUtil工具类包 -->
<dependency>
<groupId>com.idea-aedi</groupId>
<artifactId>common-ds</artifactId>
<version>2100.5.2</version>
</dependency>
代码生成器单元测试类
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.ConstVal;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.ideaaedi.commonds.io.IOUtil;
import com.ideaaedi.commonds.path.PathUtil;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.lang.NonNull;
import java.io.File;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
/**
* mybatis-plus代码生成  
* <a href="https://baomidou.com/pages/779a6e/#%E4%BD%BF%E7%94%A8">代码生成官网</a>
*  
* <a href="https://baomidou.com/pages/981406/#%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE">配置说明官网</a>
*
* @author JustryDeng
* @since 2022/6/28 9:26
*/
@SpringBootTest
public class MybatisPlusGeneratorHelper
private static final String templateDir = "mybatis-plus-templates";
@Value("$spring.datasource.url")
private String url;
@Value("$spring.datasource.username")
private String username;
@Value("$spring.datasource.password")
private String password;
/*
* 自动生成模板文件
*/
static
final String customTemplatesDirRePath = "/src/test/resources/" + templateDir + "/";
String customTemplatesDirPath = PathUtil.getProjectRootDir(MybatisPlusGeneratorHelper.class)
.replace("/target/test-classes/", customTemplatesDirRePath);
File customTemplatesDir = new File(customTemplatesDirPath);
if (!customTemplatesDir.exists())
System.err.println(MybatisPlusGeneratorHelper.class.getSimpleName() + ":自定义的模板文件不存在, 自动创建开始. 创建至:" + customTemplatesDirRePath);
// TODO 将这三个类拷贝到自己的项目下,然后将这里的BaseDTO.class、BasePageDTO.class、 PageInfo.class换成自己的即可
final String baseDTOName = YourBaseClass.BaseDTO.class.getName().replace("$", ".");
final String basePageDTOName = YourBaseClass.BasePageDTO.class.getName().replace("$", ".");
final String PageInfoName = YourBaseClass.PageInfo.class.getName().replace("$", ".");
for (JustryDengTemplates templateInfo : JustryDengTemplates.values())
IOUtil.writeContentToFile(
templateInfo.getContent()
.replace("JustryDeng_Placeholder.BaseDTO", baseDTOName)
.replace("JustryDeng_Placeholder.BasePageDTO", basePageDTOName)
.replace("JustryDeng_Placeholder.PageInfo", PageInfoName),
new File(customTemplatesDir, templateInfo.name));
System.err.println(MybatisPlusGeneratorHelper.class.getSimpleName() + ":自定义的模板文件创建完成. 请重新运行单元测试以生成相关文件.");
System.exit(-1);
@Test
void generate()
String outputRootDir = PathUtil.getProjectRootDir(MybatisPlusGeneratorHelper.class)
.replace("/target/test-classes/", "/src/test/java/");
String packagePath = MybatisPlusGeneratorHelper.class.getPackage().getName() + ".generator";
// 先清空./generator/目录
IOUtil.delete(new File(outputRootDir + packagePath.replace(".", "/")));
// basic settings
final FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(url, username, password)
.globalConfig(builder -> builder
// 设置作者
.author("mybatis-plus generator")
.commentDate("yyyy-MM-dd HH:mm:ss")
// 指定输出目录
.outputDir(outputRootDir)
// 开启swagger模式
.enableSwagger()
)
// 包配置
.packageConfig(builder -> builder
// 指定生成的类的所属包
.parent(packagePath)
.entity("entity.po")
.service("service")
.serviceImpl("service.impl")
.mapper("mapper")
.xml("mapper.xml")
.controller("controller")
.other("other"))
// 策略配置
.strategyConfig(builder -> builder
// => 表配置
// 设置需要生成代码的表名(不设置则全库生成) TODO
// .addInclude(
// "cm_monitor_info"
// )
// 设置过滤表前缀
// .addTablePrefix("tmp_")
// 设置过滤表后缀
// .addTableSuffix("_tmp")
// => entity配置
.entityBuilder()
.convertFileName((entityName) -> entityName + "PO")
// 启用TableField等相关注解
.enableTableFieldAnnotation()
.enableLombok()
// => controller配置
.controllerBuilder()
.enableRestStyle()
.convertFileName((entityName) -> entityName + "Controller")
// .superClass(BaseController.class)
// => service配置
.serviceBuilder()
.convertServiceFileName((entityName) -> entityName + "Service")
.convertServiceImplFileName((entityName) -> entityName + "ServiceImpl")
// => mapper配置
.mapperBuilder()
.enableMapperAnnotation()
.convertMapperFileName((entityName) -> entityName + "Mapper")
.convertXmlFileName((entityName) -> entityName + "Mapper"))
.templateEngine(new EnhanceFreemarkerTemplateEngine());
// entity、service、serviceImpl、controller、mapper、xml,使用指定模板生成
fastAutoGenerator.templateConfig((TemplateConfig.Builder builder) ->
// 使用mybatis-plus-generator包下的默认模板
/// builder
/// .entity(ConstVal.TEMPLATE_ENTITY_JAVA)
/// .mapper(ConstVal.TEMPLATE_MAPPER)
/// .xml(ConstVal.TEMPLATE_XML)
/// .service(ConstVal.TEMPLATE_SERVICE)
/// .serviceImpl(ConstVal.TEMPLATE_SERVICE_IMPL)
/// .controller(ConstVal.TEMPLATE_CONTROLLER);
/*
* 使用自定义的模板
* 注:参考mybatis-plus-generator包下的默认模板进行编写即可
* 注:自定义的模板放在classpath下的对应位置即可
* 注:指定模板时,无需带对应的模板后缀名(如:这里不带.ftl)
*/
builder
.entity("/" + templateDir + "/" + "custom_entity")
.service("/" + templateDir + "/" + "custom_service")
.serviceImpl("/" + templateDir + "/" + "custom_serviceImpl")
.controller("/" + templateDir + "/" + "custom_controller")
// 不改的话,用默认的即可
.mapper(ConstVal.TEMPLATE_MAPPER)
.xml(ConstVal.TEMPLATE_XML)
;
);
fastAutoGenerator.execute();
/**
* 您的项目中需要这三种类<br />
*/
public static class YourBaseClass
/**
* 基础模型
*
* @author JustryDeng
* @since 2022/6/24 10:00
*/
@Setter
@Getter
@ToString
public static class BaseDTO implements Serializable
private static final long serialVersionUID = -1;
/**
* 基础模型
*
* @author JustryDeng
* @since 2022/6/24 10:00
*/
@Setter
@Getter
@ToString
@SuppressWarnings("AlibabaPojoNoDefaultValue", "AlibabaPojoMustUsePrimitiveField")
public static class BasePageDTO extends BaseDTO
/** 页码 */
private int pageNum = 1;
/** 每页条数 */
private int pageSize = 10;
/**
* 分页信息模型
*
* @author kuoyi
* @since 1.0.0
*/
@Data
public static class PageInfo<T>
/** 总条数 */
private long total;
/** 页码 */
private int pageNum;
/** 每页条数 */
private int pageSize;
/** 数据集 */
private List<T> dataList;
/**
* 快速构造
*/
@SuppressWarnings("unused")
public static <T> PageInfo<T> of(long total, int pageNum, int pageSize)
return PageInfo.of(total, pageNum, pageSize, Collections.emptyList());
/**
* 快速构造
*/
public static <T> PageInfo<T> of(long total, int pageNum, int pageSize, List<T> dataList)
PageInfo<T> pageInfo = new PageInfo<>();
pageInfo.setTotal(total);
pageInfo.setPageNum(pageNum);
pageInfo.setPageSize(pageSize);
pageInfo.setDataList(dataList);
return pageInfo;
/* --------------------------------------------------------------- 以下部分,可以不关心 --------------------------------------------------------------- */
/**
* 扩展FreemarkerTemplateEngine,生成更多相关文件
*/
public static class EnhanceFreemarkerTemplateEngine extends FreemarkerTemplateEngine
/**
* (non-javadoc)
*
* @param customFile
* 自定义文件; key-生成的文件; value-生成该文件使用的(classpath下的带模板文件后缀名的)模板文件
* @param tableInfo
* 表信息
* @param objectMap
* 模板可使用的占位符即对应变量值(即:objectMap里的key可以在模板文件中直接引用)
*/
@Override
protected void outputCustomFile(@NonNull Map<String, String> customFile, @NonNull TableInfo tableInfo,
@NonNull Map<String, Object> objectMap)
String entityName = tableInfo.getEntityName();
String entityPath = this.getPathInfo(OutputFile.entity);
String originEntityName;
if (entityName.endsWith("PO"))
originEntityName = entityName.substring(0, entityName.length() - 2);
else
originEntityName = entityName;
// 自定义一些key-value,以便在模板中获取对应的值
String comment = tableInfo.getComment();
String originEntityNameHyphenStyle = StringUtils.camelToHyphen(originEntityName);
objectMap.put("originEntityName", originEntityName);
objectMap.put("customLowerServiceName", StringUtils.firstToLowerCase(tableInfo.getServiceName()));
objectMap.put("originEntityNameHyphenStyle", originEntityNameHyphenStyle);
objectMap.put("briefTableComment", StringUtils.isNotBlank(comment) ? comment.replace("表", "").trim() : originEntityNameHyphenStyle);
Set<String> importPackages = tableInfo.getImportPackages();
Set<String> customImportPackages = importPackages.stream()
.filter(pack ->
if ("java.io.Serializable".equals(pack))
return false;
return !pack.startsWith("com.baomidou.");
).collect(Collectors.toCollection(TreeSet::new));
objectMap.put("customImportPackages", customImportPackages);
/// customFile.forEach((key, value) ->
/// String fileName = String.format(entityPath + File.separator + entityName + "%s", 以上是关于mybatis-plus根据库表一键生成CURD代码的主要内容,如果未能解决你的问题,请参考以下文章
mybatis-plus自controller开始一键生成CURD代码
还在写CURD?试试这款基于mybatis-plus的springboot代码生成器