天天看点

springboot代码生成器基于mybatis-plus-generator

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} {

}