SpringBoot快速整合MyBatisPlus(三)-Generator
程序员文章站
2024-01-05 21:58:04
...
SpringBoot快速整合MyBatisPlus(三)-Generator
最近闲来无事整理了一下 mybatisplus-generator 代码生成器,话不多少说先上效果图
第一步、创建一个Springboot工程(我的版本是2.2.6)
引入、mybatis-springboot,mybatis-plus等包,下面是我自己的pom 工程文件
<?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>com.mybatis_plus.generator</groupId>
<artifactId>plus_generator</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<mybatis.version>2.1.2</mybatis.version>
<druid.version>1.1.6</druid.version>
<jwt.version>1.0.9.RELEASE</jwt.version>
<jjwt.version>0.9.0</jjwt.version>
<fastJson.version>1.2.45</fastJson.version>
<mybatisPlus.version>3.3.1</mybatisPlus.version>
<common.version>3.5</common.version>
<swagger.version>2.8.0</swagger.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- 引入阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<!-- JWT依赖 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- JSON工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastJson.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisPlus.version}</version>
</dependency>
<!-- StringUtilS工具 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${common.version}</version>
</dependency>
<!-- swagger2 -->
<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>
<!-- common-net -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
<!-- hutool工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.1.19</version>
</dependency>
<!-- poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
</project>
第二步、 创建自定义生成模板
在resources包下创建 generator文件夹将 controller.java.vm、service.java.vm、serviceImpl.java.vm、mapper.java.vm、mapper.xml.vm、entity.java.vm 放进去(效果图)
2.1、controller.java.vm
package ${package.Controller};
import org.springframework.web.bind.annotation.RequestMapping;
import ${package.Service}.${table.serviceName};
#if(${restControllerStyle})
import org.springframework.web.bind.annotation.RestController;
#else
import org.springframework.stereotype.Controller;
#end
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end
/**
* @Author: ${author}
* @Date: ${cfg.dateTime}
* @Description: $!{table.comment}
*/
#if(${restControllerStyle})
@RestController
#else
@Controller
#end
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
#if(${kotlin})
class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end
#else
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#end
public final ${table.serviceName} service;
public ${table.controllerName}(${table.serviceName} service) {
this.service = service;
}
}
#end
2.2、service.java.vm
package ${package.Service};
import ${package.Entity}.${entity};
import ${superServiceClassPackage};
/**
* @Author: ${author}
* @Date: ${cfg.dateTime}
* @Description: $!{table.comment}服务类
*/
#if(${kotlin})
interface ${table.serviceName} : ${superServiceClass}<${entity}>
#else
public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {
}
#end
2.3、serviceImpl.java.vm
package ${package.ServiceImpl};
import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @Author: ${author}
* @Date: ${cfg.dateTime}
* @Description: $!{table.comment}服务实现类
*/
@Service
@Transactional(rollbackFor = Exception.class)
#if(${kotlin})
open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}Model>(), ${table.serviceName} {
}
#else
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {
}
#end
2.4、mapper.java.vm
package ${package.Mapper};
import ${package.Entity}.${entity};
import ${superMapperClassPackage};
/**
* @Author: ${author}
* @Date: ${cfg.dateTime}
* @Description: $!{table.comment}Mapper
*/
#if(${kotlin})
interface ${table.mapperName} : ${superMapperClass}<${entity}>
#else
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
}
#end
2.5、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}">
#if(${enableCache})
<!-- 开启二级缓存 -->
<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
#end
#if(${baseResultMap})
<!-- 通用查询映射结果 -->
<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>
#end
#if(${baseColumnList})
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
#foreach($field in ${table.commonFields})
${field.name},
#end
${table.fieldNames}
</sql>
#end
</mapper>
2.6、entity.java.vm
package ${package.Entity};
#foreach($pkg in ${table.importPackages})
import ${pkg};
#end
import com.baomidou.mybatisplus.annotation.*;
#if(${swagger2})
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonInclude;
#end
#if(${entityLombokModel})
import lombok.Data;
import lombok.experimental.Accessors;
#end
/**
* @Author: ${author}
* @Date: ${cfg.dateTime}
* @Description: $!{table.comment}
*/
#if(${entityLombokModel})
@Data
#end
@TableName("${table.name}")
#if(${swagger2})
@JsonInclude(JsonInclude.Include.NON_NULL)
@Accessors(chain = true)
@ApiModel(value="${entity}对象", description="$!{table.comment}")
#end
public class ${entity} implements Serializable {
private static final long serialVersionUID = 1L;
## ---------- BEGIN 字段循环遍历 ----------
#foreach($field in ${table.fields})
#if(${field.keyFlag})
#set($keyPropertyName=${field.propertyName})
#end
#if("$!field.comment" != "")
#if(${swagger2})
@ApiModelProperty(value = "${field.comment}")
#else
/**
* ${field.comment}
*/
#end
#end
#if(${field.keyFlag})
## 主键
#if(${field.keyIdentityFlag})
@TableId(value = "${field.name}", type = IdType.AUTO)
#elseif(!$null.isNull(${idType}) && "$!idType" != "")
@TableId(value = "${field.name}", type = IdType.${idType})
#elseif(${field.convert})
@TableId("${field.name}")
#end
## 普通字段
#elseif(${field.fill})
## ----- 存在字段填充设置 -----
#if(${field.convert})
@TableField(value = "${field.name}", fill = FieldFill.${field.fill})
#else
@TableField(fill = FieldFill.${field.fill})
#end
#else
@TableField("${field.name}")
#end
## 乐观锁注解
#if(${versionFieldName}==${field.name})
@Version
#end
## 逻辑删除注解
#if(${logicDeleteFieldName}==${field.name})
@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(${entityBuilderModel})
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(${entityBuilderModel})
return this;
#end
}
#end
#end
#if(${entityColumnConstant})
#foreach($field in ${table.fields})
public static final String ${field.name.toUpperCase()} = "${field.name}";
#end
#end
#if(${activeRecord})
@Override
protected Serializable pkVal() {
#if(${keyPropertyName})
return this.${keyPropertyName};
#else
return null;
#end
}
#end
#if(!${entityLombokModel})
@Override
public String toString() {
return "${entity}Model{" +
#foreach($field in ${table.fields})
#if($!{foreach.index}==0)
"${field.propertyName}=" + ${field.propertyName} +
#else
", ${field.propertyName}=" + ${field.propertyName} +
#end
#end
"}";
}
#end
}
第三步、创建CodeGenerator自动生成类
package com.mybatisplus.generator;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.sun.javafx.PlatformUtil;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* @author River
*/
public class CodeGenerator {
/**
* 代码生成位置
*/
public static final String PARENT_NAME = "com.mybatisplus.generator";
/**
* modular 名字
*/
public static final String MODULAR_NAME = "";
/**
* 基本路径
*/
public static final String SRC_MAIN_JAVA = "src/main/java/";
/**
* 作者
*/
public static final String AUTHOR = "LiuRunYong";
/**
* 是否是 rest 接口
*/
private static final boolean REST_CONTROLLER_STYLE = true;
public static final String JDBC_MYSQL_URL = "jdbc:mysql://ip:port/database?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
public static final String JDBC_DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
public static final String JDBC_USERNAME = "user";
public static final String JDBC_PASSWORD = "user234";
public static void main(String[] args) {
String moduleName = scanner("模块名");
String tableName = scanner("表名(多个表明用,号隔开)");
String tablePrefix = scanner("表前缀(无前缀输入#)").replaceAll("#", "");
autoGenerator(moduleName, tableName, tablePrefix);
}
public static void autoGenerator(String moduleName, String tableName, String tablePrefix) {
new AutoGenerator()
.setGlobalConfig(getGlobalConfig())
.setDataSource(getDataSourceConfig())
.setPackageInfo(getPackageConfig(moduleName))
.setStrategy(getStrategyConfig(tableName, tablePrefix))
.setCfg(getInjectionConfig(moduleName))
.setTemplate(getTemplateConfig())
.execute();
}
private static String getDateTime() {
LocalDateTime localDate = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
return localDate.format(formatter);
}
private static InjectionConfig getInjectionConfig(final String moduleName) {
return new InjectionConfig() {
@Override
public void initMap() {
Map<String,Object> map = new HashMap<>(10);
map.put("dateTime", getDateTime());
setMap(map);
final String projectPath = System.getProperty("user.dir");
List<FileOutConfig> fileOutConfigList = new ArrayList<FileOutConfig>();
// 自定义配置会被优先输出
fileOutConfigList.add(new FileOutConfig("/generator/mapper.xml.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名,如果entity设置了前后缀,此次注意xml的名称也会跟着发生变化
return projectPath + "/src/main/resources/mapper/" +
moduleName + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
setFileOutConfigList(fileOutConfigList);
}
};
}
private static StrategyConfig getStrategyConfig(String tableName, String tablePrefix) {
return new StrategyConfig()
.setNaming(NamingStrategy.underline_to_camel)
.setColumnNaming(NamingStrategy.underline_to_camel)
.setInclude(tableName.split(","))
.setRestControllerStyle(REST_CONTROLLER_STYLE)
.setEntityBuilderModel(true)
.setControllerMappingHyphenStyle(true)
.entityTableFieldAnnotationEnable(true)
.setEntityLombokModel(true)
.setTablePrefix(tablePrefix + "_");
}
private static PackageConfig getPackageConfig(String moduleName) {
return new PackageConfig()
.setModuleName(moduleName)
.setParent(PARENT_NAME)
.setService("service")
.setServiceImpl("serviceimpl")
.setController("controller")
.setEntity("model");
}
private static DataSourceConfig getDataSourceConfig() {
return new DataSourceConfig()
.setUrl(JDBC_MYSQL_URL)
.setDriverName(JDBC_DRIVER_NAME)
.setUsername(JDBC_USERNAME)
.setPassword(JDBC_PASSWORD);
}
private static GlobalConfig getGlobalConfig() {
String projectPath = System.getProperty("user.dir");
String filePath = projectPath + "/" + MODULAR_NAME + SRC_MAIN_JAVA;
if (PlatformUtil.isWindows()) {
filePath = filePath.replaceAll("/+|\\\\+", "\\\\");
} else {
filePath = filePath.replaceAll("/+|\\\\+", "/");
}
return new GlobalConfig()
.setOutputDir(filePath)
.setDateType(DateType.ONLY_DATE)
.setIdType(IdType.UUID)
.setAuthor(AUTHOR)
.setBaseColumnList(true)
.setSwagger2(true)
.setEnableCache(false)
.setBaseResultMap(true)
.setMapperName("%sMapper")
//.setXmlName("%sMapper")
.setServiceName("%sService")
.setServiceImplName("%sServiceImpl")
.setControllerName("%sController")
.setEntityName("%sModel")
.setOpen(false);
}
private static TemplateConfig getTemplateConfig() {
return new TemplateConfig()
.setController("/generator/controller.java.vm")
.setService("/generator/service.java.vm")
.setServiceImpl("/generator/serviceImpl.java.vm")
.setEntity("/generator/entity.java.vm")
.setMapper("/generator/mapper.java.vm")
.setXml(null);
}
private static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
sb.append("please input " + tip + " : ");
System.out.println(sb.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("please input the correct " + tip + ". ");
}
}
第四步、运行CodeGenerator测试。
完结、以上就是我整理的代码生成器模板,如有错误或者不对的地方请各位大佬指导。帮到您请帮我点赞,感谢各位路过的大佬后期会完善 对应controller 和model的 模板。谢谢各位的支持
推荐阅读
-
SpringBoot快速整合MyBatisPlus(三)-Generator
-
SpringBoot整合mybatis进行快速开发
-
springboot、mybatisplus框架整合搭建
-
springboot整合MybatisPlus基本使用
-
SpringBoot整合MybatisPlus的简单教程实现(简单整合)
-
SpringBoot整合MyBatisPlus配置动态数据源的方法
-
三、SpringBoot整合Thymeleaf视图
-
玩转 SpringBoot 2 快速整合拦截器
-
SpringBoot+Mybatis+Durid整合多数据源的三种方式,第一种
-
SpringBoot整合Mybatis完整详细版(快速整合)