springboot mybatis-plus 代码生成。
添加pom
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
新建代码生成配置
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.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @author fujie
* @ 日期 2019-08-01 10:35
*/
public class Generator {
/**
* 数据源配置
*
* @return DataSourceConfig配置信息
*/
private DataSourceConfig dataSourceConfig() {
return new DataSourceConfig()
.setUrl("jdbc:mysql://localhost:3306/web-admin?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true")
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUsername("root")
.setPassword("root");
}
/**
* 全局配置
*
* @return GlobalConfig
*/
private GlobalConfig globalConfig() {
String projectPath = System.getProperty("user.dir");
return new GlobalConfig().setOutputDir(projectPath + "/src/main/java")
.setAuthor("felix")
//实体属性 Swagger2 注解
.setSwagger2(true)
.setOpen(false)
//是否覆盖
.setFileOverride(true)
//是否kotlin
.setKotlin(false)
.setActiveRecord(false)
.setBaseColumnList(true)
.setBaseResultMap(true)
.setServiceName("%sService");
// .setEntityName("%s")
// .setMapperName("%sMapper")
// .setXmlName(null)
// .setServiceImplName("%sServiceImpl")
// .setControllerName("%sController");
}
/**
* 包名设置
*
* @param moduleName 模块名称 web
*/
private PackageConfig packageConfig(String moduleName) {
return new PackageConfig().setModuleName(moduleName).setParent("com.fecred.traffic.module");
}
/**
* 自定义模板配置
*
* @return 模板配置
*/
private TemplateConfig templateConfig() {
return new TemplateConfig()
.setEntity("templates/entity")
.setXml(null)
.setMapper("templates/mapper.java")
.setService("templates/service")
.setServiceImpl("templates/service.impl")
.setController("templates/controller");
}
private StrategyConfig strategyConfig(String tablePrefix, String... include) {
return new StrategyConfig().setNaming(NamingStrategy.underline_to_camel)
.setColumnNaming(NamingStrategy.underline_to_camel)
.setTablePrefix(tablePrefix)
.setEntityLombokModel(true)
.setRestControllerStyle(true)
.setInclude(include)
.setCapitalMode(true)
.setControllerMappingHyphenStyle(true);
}
private InjectionConfig init(String moduleName) {
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
return System.getProperty("user.dir") + "/src/main/resources/mapper/" + moduleName
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
return cfg;
}
/**
* @param moduleName 模块名称
* @param tablePrefix 数据库表前缀
* @param include 表,
* @return
*/
public AutoGenerator autoGenerator(String moduleName, String tablePrefix, String... include) {
return new AutoGenerator()
.setDataSource(dataSourceConfig())
.setGlobalConfig(globalConfig())
.setPackageInfo(packageConfig(moduleName))
.setTemplate(templateConfig())
.setStrategy(strategyConfig(tablePrefix, include))
.setCfg(init(moduleName)).setTemplateEngine(new FreemarkerTemplateEngine());
}
public String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
Generator genetator = new Generator();
genetator.autoGenerator(genetator.scanner("模块名称"), genetator.scanner("表前缀"), genetator.scanner("表")).execute();
}
}
自定义模板
entity 模板
package ${package.Entity};
<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
</#if>
<#if entityLombokModel>
import lombok.Data;
</#if>
/**
* @author ${author}
* @since ${date}
*/
<#if entityLombokModel>
@Data
</#if>
<#if swagger2>
@ApiModel(value = "${entity}对象", description = "${table.comment!}")
</#if>
public class ${entity} implements Serializable{
<#if entitySerialVersionUID>
private static final long serialVersionUID=1L;
</#if>
<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field>
/**
* ${field.comment}
*/
@ApiModelProperty(value = "${field.comment}")
private ${field.propertyType} ${field.propertyName};
</#list>
<#------------ END 字段循环遍历 ---------->
}
mapper java模板
package ${package.Mapper};
import ${package.Entity}.${entity};
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* ${table.comment!} Mapper 接口
* </p>
*
* @author ${author}
* @since ${date}
*/
@Mapper
public interface ${table.mapperName}{
/**
*根据主键删除
*/
int deleteByPrimaryKey(<#list table.fields as field><#if field.keyFlag>@Param("${field.propertyName}") ${field.propertyType} ${field.propertyName}</#if></#list>);
/**
*保存
*/
int insert(${entity} record);
/**
*有选择性保存
*/
int insertSelective(${entity} record);
/**
*根据主键查询
*/
${entity} selectByPrimaryKey(<#list table.fields as field><#if field.keyFlag>@Param("${field.propertyName}") ${field.propertyType} ${field.propertyName}</#if></#list>);
/**
*查询所有
*/
List<${entity}> selectAll();
/**
*有选择性更新
*/
int updateByPrimaryKeySelective(${entity} record);
/**
*更新
*/
int updateByPrimaryKey(${entity} record);
}
mapper xml模板
<?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 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="Base_Column_List">
<#list table.fields as field>` ${field.name}`<#if field_has_next>,</#if></#list>
</sql>
</#if>
<delete id="deleteByPrimaryKey">
delete
from ${table.name}
where <#list table.fields as field><#if field.keyFlag>${field.name}=${r"#{"}${field.propertyName}${r"}"}</#if></#list>
</delete>
<select id="selectByPrimaryKey" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from ${table.name}
where <#list table.fields as field><#if field.keyFlag>${field.name}
=${r"#{"}${field.propertyName}${r"}"}</#if></#list>
</select>
<select id="selectAll" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from ${table.name}
</select>
<insert id="insert">
insert into ${table.name}
( <#list table.fields as field>` ${field.name}`<#if field_has_next>,</#if></#list>)
values
(<#list table.fields as field>${r"#{"}${field.propertyName}${r"}"}<#if field_has_next>,</#if></#list>)
</insert>
<insert id="insertSelective">
insert into ${table.name}
<trim prefix="(" suffix=")" suffixOverrides=",">
<#list table.fields as field>
<if test="${field.propertyName}!=null">
`${field.name}`<#if field_has_next>,</#if>
</if>
</#list>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<#list table.fields as field>
<if test="${field.propertyName}!=null">
${r"#{"}${field.propertyName}${r"}"}<#if field_has_next>,</#if>
</if>
</#list>
</trim>
</insert>
<update id="updateByPrimaryKeySelective">
UPDATE ${table.name}
<set>
<#list table.fields as field>
<if test="${field.propertyName}!=null">
` ${field.name}`= ${r"#{"}${field.propertyName}${r"}"}<#if field_has_next>,</#if>
</if>
</#list>
</set>
where <#list table.fields as field><#if field.keyFlag>${field.name}
=${r"#{"}${field.propertyName}${r"}"}</#if></#list>
</update>
<update id="updateByPrimaryKey">
UPDATE ${table.name}
SET
<#list table.fields as field>
<#if field_index != 0>
` ${field.name}`=${r"#{"}${field.propertyName}${r"}"}<#if field_has_next>,</#if>
</#if>
</#list>
where <#list table.fields as field><#if field.keyFlag>${field.name}=${r"#{"}${field.propertyName}${r"}"}</#if></#list>
</update>
</mapper>
service 模板
package ${package.Service};
import ${package.Entity}.${entity};
import java.util.List;
/**
* <p>
* ${table.comment!} 服务类
* </p>
*
* @author ${author}
* @since ${date}
*/
public interface ${table.serviceName}{
/**
*根据主键删除
*/
int deleteByPrimaryKey(<#list table.fields as field><#if field.keyFlag> ${field.propertyType} ${field.propertyName}</#if></#list>);
/**
*保存
*/
int insert(${entity} record);
/**
*有选择性保存
*/
int insertSelective(${entity} record);
/**
*根据主键查询
*/
${entity} selectByPrimaryKey(<#list table.fields as field><#if field.keyFlag> ${field.propertyType} ${field.propertyName}</#if></#list>);
/**
*查询所有
*/
List<${entity}> selectAll();
/**
*有选择性更新
*/
int updateByPrimaryKeySelective(${entity} record);
/**
*更新
*/
int updateByPrimaryKey(${entity} record);
}
service impl 模板
package ${package.ServiceImpl};
import ${package.Entity}.${entity};
import ${package.Service}.${table.serviceName};
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import ${package.Mapper}.${table.mapperName};
import java.util.List;
/**
*
* ${table.comment!} 服务实现类
*
*
* @author ${author}
* @since ${date}
*/
@Service
public class ${table.serviceImplName} implements ${table.serviceName} {
@Autowired
private ${table.mapperName} ${table.mapperName?uncap_first};
/**
* 根据主键删除
*/
@Override
public int deleteByPrimaryKey(<#list table.fields as field><#if field.keyFlag>${field.propertyType} ${field.propertyName}</#if></#list>){
return ${table.mapperName?uncap_first}.deleteByPrimaryKey(<#list table.fields as field><#if field.keyFlag>${field.propertyName}</#if></#list>);
}
/**
* 保存
*/
@Override
public int insert(${entity} record){
return ${table.mapperName?uncap_first}.insert(record);
}
/**
* 有选择性保存
*/
@Override
public int insertSelective(${entity} record){
return ${table.mapperName?uncap_first}.insertSelective(record);
}
/**
* 根据主键查询
*/
@Override
public ${entity} selectByPrimaryKey(<#list table.fields as field><#if field.keyFlag>${field.propertyType} ${field.propertyName}</#if></#list>){
return ${table.mapperName?uncap_first}.selectByPrimaryKey(<#list table.fields as field><#if field.keyFlag>${field.propertyName}</#if></#list>);
}
/**
* 查询所有
*/
@Override
public List<${entity}> selectAll(){
return ${table.mapperName?uncap_first}.selectAll();
}
/**
* 有选择性更新
*/
@Override
public int updateByPrimaryKeySelective(${entity} record){
return ${table.mapperName?uncap_first}.updateByPrimaryKeySelective(record);
}
/**
* 更新
*/
@Override
public int updateByPrimaryKey(${entity} record){
return ${table.mapperName?uncap_first}.updateByPrimaryKey(record);
}
}
controller 模板
package ${package.Controller};
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* ${table.comment!} 前端控制器
*
* @author ${author}
* @since ${date}
*/
@Slf4j
@RestController
@RequestMapping("/api/v1/transport-produce<#if package.ModuleName??>/${package.ModuleName}</#if>/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
public class ${table.controllerName} {
}