【Mybatis/Mybatis-plus】:代码生成器之模板引擎方式(freemarker)

前言

代码生成器模板 mybatis-plus + Freemarker+lombok模板引擎,自定义模板

导入相关依赖

<!-- 若要整合springboot,需要注意版本之间的问题 springboot版本对于mybatis-plus-boot-starter不兼容 ·-->
<dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.0.3</version>
</dependency>
<!--MyBatis-Plus逆向功能所需的模板引擎-->
 <dependency>
     <groupId>org.freemarker</groupId>
     <artifactId>freemarker</artifactId>
     <version>2.3.30</version>
 </dependency>

新建工具类

/**
 * 代码生成器工具类
 */
public class CodeGeneratorUtil {
    
    
    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.isNotBlank(ipt)) {
    
    
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void main(String[] args) {
    
    
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");// 获取当前路径
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setOpen(false);// 是否打开输出目录
        gc.setFileOverride(true);//是否重写
        gc.setActiveRecord(true);// 开启 activeRecord 模式
        gc.setEnableCache(false);// XML 二级缓存
        gc.setBaseResultMap(true);// XML ResultMap
        gc.setBaseColumnList(false);// XML columList
        gc.setAuthor(""); // 设置作者名称
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("数据库");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("数据库名称");
        dsc.setPassword("数据库密码");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(null);
        pc.setParent("com.xxx");
        pc.setMapper("dao");
        pc.setEntity("pojo");
        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<>();

        // 调整 xml 生成目录演示
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
    
    
            @Override
            public String outputFile(TableInfo tableInfo) {
    
    
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/mappers/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // TODO: 设置为null时,则不会生成xml文件,controller、service等Java类
        templateConfig.setXml(null)
        // 自定义模板
                .setEntity("/mytemplates/entity.java")		        				// 设置生成entity的模板
                .setMapper("/mytemplates/mapper.java")		        				// 设置生成mapper的模板
                .setController("/mytemplates/controller.java")       				// 设置生成service的模板
                .setService("/mytemplates/service.java")							// 设置生成serviceImpl的模板
                .setServiceImpl("/mytemplates/serviceImpl.java");					// 设置生成controller的模板
            // 只生成实体类,将上面的mapper、service、serviceImpl、controller注释掉,将下面的注释去掉
//                .setMapper(null)
//                .setController(null)
//                .setService(null)
//                .setServiceImpl(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 表名生成策略:下划线连转驼峰
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 表字段生成策略:下划线连转驼峰
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 是否为lombok模型; 需要lombok依赖
        strategy.setEntityLombokModel(true);
        // 生成controller
        strategy.setRestControllerStyle(true);
//        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
        // controller映射地址:驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix("bolt_");

        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

模板引擎(参考)

不想自定义可以忽略以下内容

entity.java

package ${package.Entity};

<#--import java.util.Date;-->
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;

import java.io.Serializable;
<#list table.importPackages as pkg>
    <#if pkg == "java.math.BigDecimal">
import ${pkg};
    </#if>
    <#if pkg == "java.time.LocalDateTime">
import java.util.Date;
    </#if>
</#list>

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
*  ${table.name} : ${table.comment!}
*  @author ${author}
*  @since ${date}
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("${table.name}")
public class ${entity} extends Model<${entity}> {

	private static final long serialVersionUID = 1L;
<#-- ----------  属性私有化  ---------->
<#list table.fields as field>
    <#if field.keyFlag>
        <#assign keyPropertyName="${field.propertyName}"/>
    </#if>

    <#if field.keyFlag>
    <#-- 主键 -->
    /**
     * 主键 : ${field.name}  ${field.comment!}
     */
    @TableId(value = "${field.name}", type = IdType.AUTO)
    <#-- 普通字段 -->
    <#elseif !field.keyFlag>
    /**
     * ${field.name}: ${field.comment!}
     */
    </#if>
<#-- 乐观锁注解 -->
    <#if (versionFieldName!"") == field.name>
    @Version
    </#if>
<#-- 逻辑删除注解 -->
    <#if (logicDeleteFieldName!"") == field.name>
    @TableLogic
    </#if>
    <#if field.propertyType == "LocalDateTime">
    private Date ${field.propertyName};
    </#if>
    <#if field.propertyType != "LocalDateTime">
    private ${field.propertyType} ${field.propertyName};
    </#if>
</#list>

    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}

mapper.java

package ${package.Mapper};

import ${package.Entity}.${entity};
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
*  mapper接口 : ${table.comment!}
*  @author ${author}
*  @since ${date}
*/
public interface ${table.mapperName} extends BaseMapper<${entity}> {
	
}

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

</mapper>

Service.java

package ${package.Service};

import ${package.Entity}.${entity};
import com.baomidou.mybatisplus.extension.service.IService;

/**
*  Service接口 : ${table.comment!}
*  @author ${author}
*  @since ${date}
*/
public interface ${table.serviceName} extends IService<${entity}> {

}

ServiceImpl.java

package ${package.ServiceImpl};

import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

/**
*  Service业务逻辑处理 : ${table.comment}
*  @author
*  @since 2021-06-30
*/
@Service
public class ${table.serviceImplName} extends ServiceImpl<${table.mapperName}, ${entity}> implements ${table.serviceName} {
	
	@Autowired
	private ${table.mapperName} ${table.entityPath}Mapper;



}

controller.java

package ${package.Controller};


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import ${package.Service}.${table.serviceName};

/**
*  controller接口 : ${table.comment!}
*  @author ${author}
*  @since ${date}
*/
@RestController
public class ${table.controllerName} {
    
    

	@Autowired
	private ${table.serviceName} ${table.entityPath}Service;

}

参考资料

  1. mybatis-plus 官方网站
  2. freemarker 中文文档

猜你喜欢

转载自blog.csdn.net/weixin_45511500/article/details/118370669