目的:
此处所说代码生成器,实际就是,只有数据库中的表,现在一次性批量的把crud接口生成出来。 现在我们mybatis-plus的代码生成器,一次性生成包括controller在内的crud接口。
共包含:
增加一条记录
删除一条记录(根据id)
修改一条记录(根据id)
查询一条记录(根据id)
分页查询记录
同时,说明如何自定义一些代码模板,并提供我自己目前使用的模板
准备
首先是依赖部分,使用 springboot + mybatis-plus
各位可以直接抄我下方的模板自己改
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mpcrud</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<weixin-java-miniapp.version>4.0.0</weixin-java-miniapp.version>
<mybatis-plus.version>3.0.5</mybatis-plus.version>
<velocity.version>2.0</velocity.version>
<swagger.version>2.7.0</swagger.version>
<jodatime.version>2.10.1</jodatime.version>
<fastjson.version>1.2.28</fastjson.version>
</properties>
<dependencies>
<!--mybatis-plus 持久层-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity.version}</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--swagger ui-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--日期时间工具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${jodatime.version}</version>
</dependency>
<!--springboot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--热重启-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- JWT-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
<!--测试相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>
<!--配置文件读取相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.1.RELEASE</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
取出原生模板
在idea 的项目名下方,有个External libraries(图片上传不了,点了上传没反应...)
找到这个包:
com\baomidou\mybatis-plus-generator\3.0.5\mybatis-plus-generator-3.0.5.jar!\templates
下面有原始模板,整个 templates目录直接拷贝到 resources目录下
下面我直接放出自己的模板(我只放了controller的模板,其他的模板直接用原生的)
package ${package.Controller};
import cn.tyl.${package.ModuleName}.utils.R;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.*;
<#if restControllerStyle>
import org.springframework.web.bind.annotation.RestController;
<#else>
import org.springframework.stereotype.Controller;
</#if>
import org.springframework.beans.factory.annotation.Autowired;
import io.swagger.annotations.Api;
import io.swagger.annotations.*;
import java.util.*;
import ${package.Service}.${table.serviceName};
import ${package.Entity}.${table.entityName};
<#if superControllerClassPackage??>
import ${superControllerClassPackage};
</#if>
import javax.servlet.http.HttpServletRequest;
/**
* <p>
* ${table.comment!} 前端控制器
* </p>
*
* @author ${author}
* @date ${date}
*/
<#if restControllerStyle>
@RestController
<#else>
@Controller
</#if>
@CrossOrigin
@Api(value = "${table.entityPath}CRUD接口")
@RequestMapping("<#if package.ModuleName??>/${package.ModuleName}</#if>/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
<#if kotlin>
class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()</#if>
<#else>
<#if superControllerClass??>
public class ${table.controllerName} extends ${superControllerClass} {
<#else>
public class ${table.controllerName} {
</#if>
@Autowired
private ${table.serviceName} ${table.entityPath}Service;
/**
* 根据id查询
*
* @param id
* @return
*/
@ApiOperation(value = "获取${table.entityPath}根据id",notes="")
@GetMapping("/{id}")
public R getById(@PathVariable("id") String id) {
${entity} ${table.entityPath} = ${table.entityPath}Service.getById(id);
return R.ok().data("data",${table.entityPath});
}
/**
* 分页查询
*
* @param request 请求
* @param page 页数
* @param limit 每页限制
* @return
*/
@ApiOperation(value = "获取${table.entityPath}列表",notes="")
@GetMapping("/list/{page}/{limit}")
public R getList(HttpServletRequest request,
@PathVariable("page") Long page,
@PathVariable("limit") Long limit) {
Page<${entity}> pageBean = new Page<>(page, limit);
IPage<${entity}> iPage = ${table.entityPath}Service.page(pageBean, null);
List<${entity}> records = iPage.getRecords();
return R.ok().data("list", records);
}
/**
* 新增一个
* @param ${table.entityPath}
* @param request
* @return
*/
@PostMapping("")
public R add(@RequestBody ${entity} ${table.entityPath},
HttpServletRequest request) {
boolean save = ${table.entityPath}Service.save(${table.entityPath});
if (save){
return R.ok();
}else {
return R.error();
}
}
/**
* 删除一个
* @param ${table.entityPath} 预留接口,用于后续根据条件删除
* @param request
* @return
*/
@DeleteMapping("")
public R del(@RequestBody ${entity} ${table.entityPath}, HttpServletRequest request){
boolean result = ${table.entityPath}Service.removeById(${table.entityPath}.getId());
if (result){
return R.ok();
}else {
return R.error();
}
}
/**
* 修改一个
* @param ${table.entityPath} 预留接口,用于后续根据条件修改
* @param request
* @return
*/
@PutMapping("")
public R update(@RequestBody ${entity} ${table.entityPath}, HttpServletRequest request){
boolean result = ${table.entityPath}Service.updateById(${table.entityPath});
if (result){
return R.ok();
}else {
return R.error();
}
}
}
</#if>
创建代码生成器
其实是一个类,并且大部分代码都是一样的,大家直接参考我的代码自己改下
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.Test;
/**
* @author tyl
* @create 2020/11/16
* 代码生成器
*/
public class AutoGeneratorTest {
@Test
public void main1() {
// 1、创建代码生成器
AutoGenerator mpg = new AutoGenerator();
// 2、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
System.out.println(projectPath);
//设置输出路径,建议写绝对路径,因为不容易出错
gc.setOutputDir("D:\\project\\tempProject\\mpcrud" + "/src/main/java");
gc.setAuthor("tyl");//作者
gc.setOpen(false); //生成后是否打开资源管理器
gc.setFileOverride(true); //重新生成时文件是否覆盖,如果写true,就会把原有文件里的内容覆盖掉
/*
* mp生成service层代码,默认接口名称第一个字母有 I
* UcenterService
* */
gc.setServiceName("%sService"); //去掉Service接口的首字母I,不加默认会有一个IxxxService
gc.setIdType(IdType.ID_WORKER_STR); //主键策略,因为字段是 char类型,用ID_WORKER_STR(新版有其他方法)
gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
gc.setSwagger2(true);//开启Swagger2模式
mpg.setGlobalConfig(gc);
// 3、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/xxxx?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 4、包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("reimbursement"); //子包名,会添加在包名后面,所以不要有横杠,最好就是单独一个单词
pc.setParent("cn.tyl");//包名
pc.setController("controller");
pc.setEntity("entity");
pc.setService("service");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
TemplateConfig tc = new TemplateConfig();
tc.setController("/templates/controller.java");
tc.setService("/templates/service.java");
tc.setServiceImpl("/templates/serviceImpl.java");
tc.setEntity("/templates/entity.java");
tc.setMapper("/templates/mapper.java");
tc.setXml("/templates/mapper.xml");
mpg.setTemplate(tc);
// 5、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude(
"user_reg_review",
"approve_result",
"bill_reimbursement",
"business_traveler",
"department",
"itinerary",
"jpa_user",
"role",
"travel_reimbursement",
"user",
"user_reg_review",
"user_role"
); //表的名称,多张表用逗号隔开
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setRestControllerStyle(true); //restful api风格控制器
strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
mpg.setStrategy(strategy);
// 6、执行
mpg.execute();
}
}
把上方的包名,路径,数据库连接配置好之后,执行main方法,一会功夫你就可以得到所有表对应的增删改查接口了
自定义模板
如果对上方的模板不满意,想要自定义,那么只需要修改 resource/template/xx.ftl 文件即可
文件中的部分变量解释如下:(这些变量都是在上方代码生成器中定义的,哪些属性可以定义详情查看 com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine里的getObjectMap方法)
${package.Controller} //controller 包名
${package.ModuleName} //模块名
${package.Service} //service包名
${package.Entity} //entity包名
${author} //作者
${date} //生成时间
${table.serviceName} //service类的名字