使用mybatisplus生成增删改查模版代码

该文章介绍了如何结合Mybatis-Spring-Boot、Mybatis-Plus和Freemarker模板来自动化生成RESTful风格的控制器代码。通过配置POM依赖、定制Freemarker模板以及配置代码生成器,可以自定义生成符合项目需求的JavaMVC控制器,包括增删改查等基本操作。

事例项目地址:gitee

1.pom依赖

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.3.1</version>
        </dependency>

        <dependency>
            <groupId>com.kangyonggan</groupId>
            <artifactId>freemarker</artifactId>
            <version>1.2.0</version>
        </dependency>

2.freemarker模版代码

在mybatis-plus-generator依赖包下的template包下有许多生成模版

在这里插入图片描述

而freemarker所对应的文件为.ftl后缀,将其复制到自己resource下对应的目录

在这里插入图片描述

这里以controller层为例书写模版代码

package ${
   
   package.Controller};

import org.springframework.web.bind.annotation.RequestMapping;
<#if restControllerStyle>
import org.springframework.web.bind.annotation.RestController;
<#else>
import org.springframework.stereotype.Controller;
</#if>
<#if superControllerClassPackage??>
import ${
   
   superControllerClassPackage};
</#if>
import org.springframework.beans.factory.annotation.Autowired;
import ${
   
   package.Service}.${
   
   table.serviceName};
import ${
   
   package.Entity}.${
   
   table.entityName};
import org.springframework.
<think> 我们正在讨论使用Velocity模板引擎在MyBatis-Plus中自动生成增删改查代码的配置方法。根据之前的上下文,用户已经了解了一些基础模板(entity, mapper, service, controller)的结构,现在他们想深入了解如何配置这些模板以实现CRUD代码的自动生成。 从引用[1]中,我们获得了EasyCode插件使用的Velocity模板语法细节,包括基础变量、核心内置变量、条件判断和循环。这些同样适用于MyBatis-Plus的代码生成器,因为两者都使用Velocity。 引用[2]则提供了MyBatis-Plus Generator的依赖配置,特别是velocity-engine-core的引入,这是使用Velocity模板所必需的。 现在,用户的问题聚焦于“Velocity自动生成增删改查代码模板配置方法”。我们需要从以下几个方面展开: 1. **依赖配置**:确保项目中引入了MyBatis-Plus Generator和Velocity引擎。 2. **模板文件准备**:提供标准的CRUD模板(entity, mapper, service, controller)以及如何自定义它们。 3. **代码生成器配置**:如何将这些模板文件应用到MyBatis-Plus的AutoGenerator中。 4. **自定义示例**:展示如何修改模板以满足特定需求,比如添加Swagger注解。 具体步骤: **1. 依赖配置(pom.xml)** 根据引用[2],需要在项目中添加以下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.3</version> </dependency> ``` **2. 模板文件准备** 在resources目录下创建模板文件,例如: - `templates/entity.java.vm`: 实体类模板 - `templates/mapper.java.vm`: Mapper接口模板 - `templates/mapper.xml.vm`: Mapper XML文件模板 - `templates/service.java.vm`: Service接口模板 - `templates/serviceImpl.java.vm`: Service实现类模板 - `templates/controller.java.vm`: Controller模板 这些模板可以使用MyBatis-Plus提供的默认模板,也可以自定义。下面是一个自定义实体类模板的示例(`entity.java.vm`),包含Swagger注解和Lombok: ```velocity package ${package.Entity}; import lombok.Data; import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; #if(${table.convert}) import javax.persistence.Table; #end @Data @EqualsAndHashCode(callSuper = false) #if(${table.convert}) @Table(name = "${table.name}") #end @ApiModel(value="${entity}对象", description="${table.comment}") public class ${entity} { ## 字段循环 #foreach($field in ${table.fields}) #if(${field.convert}) @TableField("${field.name}") #end #if(${field.comment}) @ApiModelProperty(value = "${field.comment}") #end private ${field.propertyType} ${field.propertyName}; #end } ``` **3. 代码生成器配置** 在Java代码中配置AutoGenerator,指定模板引擎和模板路径: ```java AutoGenerator generator = new AutoGenerator(); generator.setDataSource(dataSourceConfig); generator.setPackageInfo(packageConfig); // 使用Velocity引擎 TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setEntity("templates/entity.java.vm"); // 指定自定义模板路径,其他同理 templateConfig.setMapper("templates/mapper.java.vm"); templateConfig.setXml("templates/mapper.xml.vm"); templateConfig.setService("templates/service.java.vm"); templateConfig.setServiceImpl("templates/serviceImpl.java.vm"); templateConfig.setController("templates/controller.java.vm"); generator.setTemplate(templateConfig); generator.setTemplateEngine(new VelocityTemplateEngine()); generator.execute(); ``` **4. 自定义示例:Controller模板** 在`controller.java.vm`中,我们可以添加Swagger注解: ```velocity package ${package.Controller}; import ${package.Entity}.${entity}; import ${package.Service}.${table.serviceName}; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @Api(tags = "${table.comment}管理") @RestController @RequestMapping("/${table.entityPath}") public class ${table.controllerName} { @Autowired private ${table.serviceName} ${table.entityPath}Service; @ApiOperation("根据ID查询${entity}") @GetMapping("/{id}") public R<${entity}> getById(@PathVariable Long id) { return R.ok(${table.entityPath}Service.getById(id)); } // 其他CRUD方法... } ``` **5. 生成代码** 运行生成器后,Velocity会根据模板和数据库表结构生成对应的CRUD代码。 **注意事项**: - 自定义模板可以放在任意路径,但必须在TemplateConfig中正确设置。 - 模板使用的变量(如${table.name}, ${entity})由MyBatis-Plus Generator提供,具体可参考官方文档。 - 如果不需要生成某个文件(如XML),可以将对应TemplateConfig的set方法设为null。 最后,生成相关问题以帮助用户深入理解。 </think> ### Velocity自动生成增删改查代码模板配置方法 #### 一、基础配置步骤 1. **添加依赖** 在`pom.xml`中配置: ```xml <!-- MyBatis-Plus代码生成器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.7</version> </dependency> <!-- Velocity模板引擎 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.3</version> </dependency>[^2] ``` 2. **模板存放路径** 创建目录结构:`resources/templates/` ``` src/main/resources └── templates ├── entity.java.vm # 实体类模板 ├── mapper.java.vm # Mapper接口模板 ├── mapper.xml.vm # XML映射模板 ├── service.java.vm # Service接口模板 ├── serviceImpl.java.vm # Service实现模板 └── controller.java.vm # Controller模板 ``` --- #### 二、核心模板配置示例 ##### 1. **实体模板 (`entity.java.vm`)** ```velocity package ${package.Entity}; import lombok.Data; #if(${table.convert}) import com.baomidou.mybatisplus.annotation.TableName; #end ## 自动导入主键注解 #if(${table.pkField}) import com.baomidou.mybatisplus.annotation.TableId; #end @Data #if(${table.convert}) @TableName("${table.name}") #end public class ${entity} { #foreach($field in ${table.fields}) #if(${field.keyFlag}) @TableId(type = IdType.AUTO) ## 主键自动递增 #end /** ${field.comment} */ private ${field.propertyType} ${field.propertyName}; #end } ``` ##### 2. **Mapper接口模板 (`mapper.java.vm`)** ```velocity package ${package.Mapper}; import ${package.Entity}.${entity}; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface ${table.mapperName} extends BaseMapper<${entity}> {} ``` ##### 3. **XML映射模板 (`mapper.xml.vm`)** ```velocity <?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}) <result column="${field.name}" property="${field.propertyName}"/> #end </resultMap> <!-- 通用查询条件 --> <sql id="Base_Where"> WHERE 1=1 #foreach($field in ${table.fields}) <if test="${field.propertyName} != null"> AND ${field.name} = #{${field.propertyName}} </if> #end </sql> </mapper> ``` ##### 4. **Controller模板 (`controller.java.vm`)** ```velocity package ${package.Controller}; import ${package.Entity}.${entity}; import ${package.Service}.${table.serviceName}; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/${table.entityPath}") public class ${table.controllerName} { @Autowired private ${table.serviceName} service; /** 增 */ @PostMapping public boolean save(@RequestBody ${entity} entity) { return service.save(entity); } /** 删 */ @DeleteMapping("/{id}") public boolean delete(@PathVariable Long id) { return service.removeById(id); } /** 改 */ @PutMapping public boolean update(@RequestBody ${entity} entity) { return service.updateById(entity); } /** 查 */ @GetMapping("/{id}") public ${entity} getById(@PathVariable Long id) { return service.getById(id); } } ``` --- #### 三、生成器驱动配置 ```java AutoGenerator generator = new AutoGenerator(); // 1. 数据源配置 DataSourceConfig dataSource = new DataSourceConfig .Builder(url, username, password) .build(); // 2. 包路径配置 PackageConfig packageConfig = new PackageConfig .Builder() .parent("com.example.project") .entity("entity") .mapper("mapper") .build(); // 3. 模板配置(关键) TemplateConfig templateConfig = new TemplateConfig.Builder() .entity("templates/entity.java.vm") .mapper("templates/mapper.java.vm") .xml("templates/mapper.xml.vm") .service("templates/service.java.vm") .controller("templates/controller.java.vm") .build(); // 4. 全局配置 GlobalConfig globalConfig = new GlobalConfig.Builder() .outputDir(System.getProperty("user.dir") + "/src/main/java") .build(); generator.dataSource(dataSource) .packageInfo(packageConfig) .template(templateConfig) .global(globalConfig) .execute(); // 执行生成 ``` --- #### 四、自定义要点 1. **动态条件生成** 在XML模板使用Velocity条件判断: ```velocity #foreach($field in ${table.fields}) #if(${field.propertyType.equals("String")}) <if test="condition.${field.propertyName} != null and condition.${field.propertyName} != ''"> AND ${field.name} LIKE CONCAT('%', #{condition.${field.propertyName}}, '%') </if> #end #end ``` 2. **集成Swagger** 在Controller模板顶部添加: ```velocity @Api(tags = "${table.comment}接口") ``` 3. **逻辑删除字段处理** 在实体模板中添加: ```velocity #if(${field.name.equals("is_deleted")}) @TableLogic // 逻辑删除注解 private Integer deleted; #end ``` --- ### 注意事项 1. **模板路径**:必须与`TemplateConfig`中配置的路径完全匹配 2. **变量作用域**:所有模板共享`${table}`(表元数据)和`${package}`(包路径)变量 3. **覆盖策略**:生成前备份自定义模板,避免版本升级被覆盖 --- ### 相关问题 1. 如何在Velocity模板中实现分页查询的XML生成?[^1][^2] 2. 如何自定义Service模板以添加批量操作方法? 3. 当数据库字段命名使用下划线时,如何确保实体类属性正确转为驼峰命名? 4. Velocity模板中如何处理枚举类型字段的映射?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值