MyBatisPlusGenerator
目录
依赖包
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
JAVA代码
package com.example.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.FileType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.lang.reflect.Field;
import java.util.*;
public class BatisplusGenerators {
private static final Logger log = LoggerFactory.getLogger(BatisplusGenerators.class);
static String SCHEMA_NAME ="warning_event";
static String MANAGER = "manager";
static String MANAGER_IMPL = "managerImpl";
public BatisplusGenerators() {
}
//ms_template,ms_message,ms_message_push,ms_scene,ms_scene_config,ms_user_mqtt_bind
public static void main(String[] args) throws Exception {
AutoGenerator autoGenerator = new AutoGenerator();
//全局配置
com.baomidou.mybatisplus.generator.config.GlobalConfig globalConfig = new com.baomidou.mybatisplus.generator.config.GlobalConfig();
String projectPath = System.getProperty("user.dir");
System.out.println("PROJECT PATH: " + projectPath);
globalConfig.setAuthor("chendaqing");
globalConfig.setEnableCache(false);
globalConfig.setBaseResultMap(true);
globalConfig.setBaseColumnList(true);
//globalConfig.setSwagger2(true);
globalConfig.setOpen(false);
globalConfig.setFileOverride(true);
autoGenerator.setGlobalConfig(globalConfig);
//包路径
String parentName = "com.gennlife.cdc.earlywarning";
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent(parentName);
String moduleName = scanner();
String modulePackage = "0".equalsIgnoreCase(moduleName) ? "" : "."+moduleName;
String modulePath = "0".equalsIgnoreCase(moduleName) ? "" : "/"+moduleName;
Map<String, String> packageInfo = new HashMap<>();
packageInfo.put(ConstVal.CONTROLLER, parentName+ ".controller"+modulePackage);
packageInfo.put(ConstVal.SERVICE, parentName+".service"+modulePackage);
packageInfo.put(ConstVal.SERVICE_IMPL, parentName+".service.impl"+modulePackage);
packageInfo.put(ConstVal.ENTITY, parentName+".dao.entity"+modulePackage);
packageInfo.put(ConstVal.MAPPER, parentName+".dao.mapper"+modulePackage);
packageInfo.put(MANAGER, parentName+".dao.manager"+modulePackage);
packageInfo.put(MANAGER_IMPL, parentName+".dao.manager.impl"+modulePackage);
//设置不同类文件生成的路径
Map pathInfo = new HashMap<>();
String srcPath = projectPath + "/earlywarning-server/src/main/java/";
String daoPath = projectPath + "/earlywarning-dao/src/main/";
pathInfo.put(ConstVal.CONTROLLER_PATH, srcPath + packageInfo.get(ConstVal.CONTROLLER).replaceAll("\\.", "\\/"));
pathInfo.put(ConstVal.SERVICE_PATH, srcPath + packageInfo.get(ConstVal.SERVICE).replaceAll("\\.", "\\/"));
pathInfo.put(ConstVal.SERVICE_IMPL_PATH, srcPath + packageInfo.get(ConstVal.SERVICE_IMPL).replaceAll("\\.", "\\/"));
pathInfo.put(ConstVal.ENTITY_PATH, daoPath + "java/" + packageInfo.get(ConstVal.ENTITY).replaceAll("\\.", "\\/"));
pathInfo.put(ConstVal.MAPPER_PATH, daoPath + "java/" + packageInfo.get(ConstVal.MAPPER).replaceAll("\\.", "\\/"));
pathInfo.put(ConstVal.XML_PATH, daoPath +"resources/mapper" + modulePath);
packageConfig.setPathInfo(pathInfo);
autoGenerator.setPackageInfo(packageConfig);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
Map<String,Object> map = new HashMap<>();
map.put("schemaName",SCHEMA_NAME);
this.setMap(map);
}
};
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig("ftl/manager.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名
return daoPath +"/java/"+ packageInfo.get(MANAGER).replaceAll("\\.", "\\/")
+ "/I" + tableInfo.getEntityName() + "Manager" + StringPool.DOT_JAVA;
}
});
focList.add(new FileOutConfig("ftl/managerImpl.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名
return daoPath +"/java/"+ packageInfo.get(MANAGER_IMPL).replaceAll("\\.", "\\/")
+ "/" + tableInfo.getEntityName() + "ManagerImpl" + StringPool.DOT_JAVA;
}
});
focList.add(new FileOutConfig("ftl/extmapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
String extXmlPath = daoPath + "/resources/mapper/ext/";
File file = new File(extXmlPath);
if(!file.exists()){
file.mkdirs();
}
// 自定义输出文件名
return extXmlPath + tableInfo.getEntityName() + "ExtMapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
autoGenerator.setCfg(cfg);
//设置如果存在service以及controller和mapper.java 则不再重新生成,不然写的代码都会被覆盖
cfg.setFileCreate(new IFileCreate() {
@Override
public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
// 判断自定义文件夹是否需要创建
//判断是否是service或者mapperext或者是Repository,如果是则判断是否已经存在,如果已经存在则不生成
if(
filePath.lastIndexOf("ServiceImpl.java") != -1 ||
filePath.lastIndexOf("Service.java") != -1 ||
filePath.lastIndexOf("Controller.java") != -1 ||
filePath.lastIndexOf("Mapper.java") != -1 ||
filePath.lastIndexOf("Manager.java") != -1 ||
(filePath.lastIndexOf("Mapper.xml") != -1 &&
filePath.lastIndexOf("ExtMapper.xml") == -1) ||
filePath.lastIndexOf("ManagerImpl.java") != -1
){
File file = new File(filePath);
if(file.exists()){
System.out.println(file.getName()+" 已存在,忽略再次生成");
return false;
}
}
checkDir(filePath);
System.out.println("创建:"+filePath);
return true;
}
});
//数据源
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.POSTGRE_SQL);
dataSourceConfig.setSchemaName(SCHEMA_NAME);
dataSourceConfig.setUrl("jdbc:postgresql://10.0.0.221:5432/gdcdc_test_1221");
dataSourceConfig.setDriverName("org.postgresql.Driver");
dataSourceConfig.setUsername("gdcdc_test");
dataSourceConfig.setPassword("gDb27!03&~");
autoGenerator.setDataSource(dataSourceConfig);
//设置模板文件
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setEntity("ftl/entity");
templateConfig.setMapper("ftl/mapper");
templateConfig.setXml("ftl/mapper.xml");
templateConfig.setService("ftl/service");
templateConfig.setServiceImpl("ftl/serviceImpl");
templateConfig.setController("ftl/controller");
autoGenerator.setTemplate(templateConfig);
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
//指定公共实体类以及公共字段
strategy.setSuperEntityClass("com.gennlife.cdc.earlywarning.framework.base.BaseEntity");
strategy.setSuperMapperClass("com.gennlife.cdc.earlywarning.framework.base.BaseMapper");
strategy.setSuperEntityColumns(new String[] { "id","del_flag","create_time","update_time"});
strategy.setRestControllerStyle(true);
strategy.setInclude(getTable("表名"));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(new String[]{"ew_"});
autoGenerator.setStrategy(strategy);
autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());
ConfigBuilder configBuilder = new ConfigBuilder(autoGenerator.getPackageInfo(), autoGenerator.getDataSource(), autoGenerator.getStrategy(), autoGenerator.getTemplate(), autoGenerator.getGlobalConfig());
Field packageInfoField = configBuilder.getClass().getDeclaredField("packageInfo");
packageInfoField.setAccessible(true);
packageInfoField.set(configBuilder,packageInfo);
/**
* 设置配置对象
*/
autoGenerator.setConfig(configBuilder);
autoGenerator.execute();
}
public static String scanner() {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("默认包名为com.gennlife.cdc.earlywarning, 请输入下级包名,没有请输入0");
log.info(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的包名");
}
public static String[] getTable(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
log.info(help.toString());
if (scanner.hasNext()) {
String[] result = scanner.next().split(",");
if (ObjectUtils.isNotEmpty(result)) {
return result;
}
}
return null;
}
}
ftl文件
controller.ftl
package ${package.Controller};
import com.gennlife.base.model.PaginationResponse;
import com.gennlife.base.model.Result;
import ${package.Entity}.${entity};
import ${package.Service}.${table.serviceName};
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* ${table.comment!} 前端控制器
* </p>
*
* @author ${author}
* @since ${date}
*/
@RestController
@RequestMapping("<#if package.ModuleName??>/${package.ModuleName}</#if>/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
public class ${table.controllerName} {
@Autowired
${table.serviceName} ${entity?uncap_first}Service;
}
service.ftl
package ${package.Service};
import ${package.Entity}.${entity};
import com.gennlife.cdc.earlywarning.framework.base.BaseService;
/**
* <p>
* ${table.comment!} 服务类
* </p>
*
* @author ${author}
* @since ${date}
*/
public interface ${table.serviceName} extends BaseService<${entity}>{
}
serviceImpl.ftl
package ${package.ServiceImpl};
import ${package.Entity}.${entity};
import ${package.Service}.${table.serviceName};
import ${package.manager}.I${entity}Manager;
import com.gennlife.cdc.earlywarning.framework.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* ${table.comment!} 服务实现类
* </p>
*
* @author ${author}
* @since ${date}
*/
@Service
public class ${table.serviceImplName} extends BaseServiceImpl<${entity}> implements ${table.serviceName} {
@Autowired
I${entity}Manager ${entity?uncap_first}Manager;
}
mapper.ftl
package ${package.Mapper};
import ${package.Entity}.${entity};
import ${superMapperClassPackage};
import java.util.List;
/**
* <p>
* ${table.comment!} Mapper 接口
* </p>
*
* @author ${author}
* @since ${date}
*/
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
}
mapper.xml.ftl
<?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"/>
</#if>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
<include refid="${package.Mapper}.ext.${table.mapperName}.Ext_Mapper_Base_Column_List"/>
</sql>
</mapper>
extmapper.xml.ftl
<?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}.ext.${table.mapperName}">
<#if baseResultMap>
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
<#list table.fields as field>
<#if field.keyFlag><#--生成主键排在第一位-->
<id column="${field.name}" property="${field.propertyName}" />
</#if>
</#list>
<#list table.commonFields as field><#--生成公共字段 -->
<result column="${field.name}" property="${field.propertyName}" />
</#list>
<#list table.fields as field>
<#if !field.keyFlag><#--生成普通字段 -->
<result column="${field.name}" property="${field.propertyName}" />
</#if>
</#list>
</resultMap>
</#if>
<#if baseColumnList>
<!-- 通用查询结果列 -->
<sql id="Ext_Mapper_Base_Column_List">
<#list table.commonFields as field>
${field.name},
</#list>
${table.fieldNames}
</sql>
</#if>
</mapper>
entity.ftl
package ${package.Entity};
import com.baomidou.mybatisplus.annotation.TableName;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
</#if>
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
</#if>
/**
* <p>
* ${table.comment!}
* </p>
*
* @author ${author}
* @since ${date}
*/
<#if entityLombokModel>
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
</#if>
@TableName(value = "${table.name}", schema = "${cfg.schemaName}" )
<#if swagger2>
@ApiModel(value="${entity}对象", description="${table.comment!}")
</#if>
<#if superEntityClass??>
public class ${entity} extends ${superEntityClass}<${entity}>{
<#else>
public class ${entity} {
</#if>
<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field>
<#if swagger2>
@ApiModelProperty(value = "${field.comment}")
<#else>
/**
* ${field.comment}
*/
</#if>
private ${field.propertyType} ${field.propertyName};
</#list>
<#------------ END 字段循环遍历 ---------->
}