MybatisPlus 代码生成

一、实现效果

  • 不生成service接口只生成service类
  • 生成文件夹名称为controller、service、dao(mapper.java)、mapper(mapper.xml)
  • 代码中的部分配置通过mybatisPlusGeneartor.properties文件
  • 整合swagger

二、代码、配置文件、模板说明

  • CodeGenerator.java 代码生成启动类
  • classpath/resources/mybatisPlusGneratorConfig.properties 配置文件
  • classpath/templates 代码生成模板

三、代码、配置文件、模板内容

  • CodeGenerator.java
package com.seentao.exam;

/**
 * @author xiaojie
 * @classname CodeGenerator
 * @date 2020/6/19 15:36
 **/


import cn.hutool.setting.dialect.Props;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
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.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.seentao.framework.base.BaseServiceImpl;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CodeGenerator {

    /**
     * 

* 读取控制台内容 *

*/
public static 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) { Props props= new Props("generator/mybatisPlusGneratorConfig.properties"); // 代码生成器 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor(props.getStr("author")); gc.setSwagger2(true); gc.setOpen(false); // gc.setSwagger2(true); 实体属性 Swagger2 注解 mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl(props.getStr("jdbc.url")); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername(props.getStr("jdbc.username")); dsc.setPassword(props.getStr("jdbc.password")); mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setModuleName(scanner("模块名")); pc.setParent(props.getStr("parent.package")); mpg.setPackageInfo(pc); // 自定义配置 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) { // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! return projectPath + "/src/main/java/com/aaa/bbb/" + pc.getModuleName() + "/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); // 自定义mapper配置 templatePath = "/templates/mapper.java.ftl"; focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // 自定义输出文件名 + pc.getModuleName() String expand = projectPath + "/src/main/java/com/aaa/bbb/" +pc.getModuleName() + "/" + "dao"; String entityFile = String.format((expand + File.separator + "%s" + ".java"), tableInfo.getMapperName()); return entityFile; } }); // 自定义controller的代码模板 templatePath = "/templates/controller.java.ftl"; // 自定义配置会被优先输出 focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // 自定义输出文件名 + pc.getModuleName() String expand = projectPath + "/src/main/java/com/aaa/bbb/" +pc.getModuleName() + "/" + "controller"; String entityFile = String.format((expand + File.separator + "%s" + ".java"), tableInfo.getControllerName()); return entityFile; } }); // 自定义service的代码模板 templatePath = "/templates/serviceImpl.java.ftl"; // 自定义配置会被优先输出 focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // 自定义输出文件名 + pc.getModuleName() String expand = projectPath + "/src/main/java/com/aaa/bbb/" +pc.getModuleName() + "/" + "service"; String entityFile = String.format((expand + File.separator + "%s" + ".java"), tableInfo.getServiceImplName().substring(0,tableInfo.getServiceImplName().length()-4)); return entityFile; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); // 配置模板 TemplateConfig templateConfig = new TemplateConfig(); //不生成默认的service接口与serviceImpl实现类 templateConfig.setXml(null); templateConfig.setMapper(null); templateConfig.setService(null); templateConfig.setServiceImpl(null); mpg.setTemplate(templateConfig); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); // 公共父类 strategy.setSuperEntityClass("com.aaa.bbb.base.BaseEntity"); strategy.setSuperControllerClass("com.aaa.bbb.base.BaseController"); strategy.setSuperMapperClass("com.aaa.bbb.base.FrameworkBaseMapper"); strategy.setSuperServiceImplClass(BaseServiceImpl.class); strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(pc.getModuleName() + "_"); mpg.setStrategy(strategy); mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.execute(); } }
  • mybatisPlusGneratorConfig.properties
parent.package = com.aaa.bbb

jdbc.url=jdbc:mysql://xxx:3306/db?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
jdbc.username=root
jdbc.password=111111

author =  xiaojie
  • 模板 controller.java.ftl
package ${package.Controller};


import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import ${package.Service}.${table.serviceImplName?substring(0,(table.serviceImplName)?length-4)};
import ${package.Entity}.${entity};
import com.seentao.framework.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiImplicitParam;
import javax.validation.constraints.NotBlank;
import org.springframework.validation.annotation.Validated;
import lombok.extern.slf4j.Slf4j;
<#if restControllerStyle>
import org.springframework.web.bind.annotation.RestController;
<#else>
import org.springframework.stereotype.Controller;
#if>
<#if superControllerClassPackage??>
import ${superControllerClassPackage};
#if>

/**
*
*
* @author ${author}
* @since ${date}
* @version v1.0
*/
<#if restControllerStyle>
@Slf4j
@Api(tags = {"${table.comment!}"})
@RestController
@Validated
<#else>
@Controller
#if>
@RequestMapping("<#if package.ModuleName??>/${package.ModuleName}/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}")
<#if kotlin>
class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()
<#else>
    <#if superControllerClass??>
public class ${table.controllerName} extends ${superControllerClass} {
    <#else>
public class ${table.controllerName} {
    #if>

    @Autowired
    private ${table.serviceImplName?substring(0,(table.serviceImplName)?length-4)} ${table.serviceImplName?substring(0,(table.serviceImplName)?length-4)};

    @RequestMapping(value = "/getById")
    @ApiOperation(value = "注释", notes = "详细说明")
    @ApiImplicitParam(name = "id", value = "主键id", dataType="String",required = true)
    public Result<${entity}> getById(@NotBlank(message="id不能为空") String id){
      return null;
    }
}
#if>
  • 模板serviceImpl.java.ftl
package ${package.ServiceImpl?substring(0,package.ServiceImpl?length-5)};

import ${package.Entity}.${entity};
import ${package.Mapper?substring(0,package.Mapper?length-7)+".dao"}.${table.mapperName};
import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service;

/**
 * >
 * ${table.comment!} 服务实现类
 * >
 *
 * @author ${author}
 * @since ${date}
 */
@Service
<#if kotlin>
open class ${table.serviceImplName?substring(0,(table.serviceImplName)?length-4)} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(){

}
<#else>
public class ${table.serviceImplName?substring(0,(table.serviceImplName)?length-4)} extends ${superServiceImplClass}<${table.mapperName}, ${entity}>{

}
#if>

  • 模板mapper.java.ftl
package ${package.Mapper?substring(0,package.Mapper?length-7)+".dao"};

import ${package.Entity}.${entity};
import ${superMapperClassPackage};

/**
 * >
 * ${table.comment!} Mapper 接口
 * >
 *
 * @author ${author}
 * @since ${date}
 */
<#if kotlin>
interface ${table.mapperName} : ${superMapperClass}<${entity}>
<#else>
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {

}
#if>

  • 模板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">
{package.Mapper?substring(0,package.Mapper?length-7)+".dao"}.${table.mapperName}">


    <!-- 通用查询映射结果 -->
    
        <#list table.fields as field>
            <#if field.keyFlag><#--生成主键排在第一位-->
         
            
        
        <#list table.commonFields as field><#--生成公共字段 -->
         
        
        <#list table.fields as field>
            <#if !field.keyFlag><#--生成普通字段 -->
        
            
        
    



    <!-- 通用查询结果列 -->
    
        <#list table.commonFields as field>
            ${field.name},
        
        ${table.fieldNames}
    
>

你可能感兴趣的:(MybatisPlus 代码生成)