使用Mybatis Plus 自动创建模板文件

2022-07-27,,,

使用Mybatis Plus 自动创建模板文件

0 使用效果

使用java进行服务器端编程,最日常的工作就是根据数据库表生成实体类文件了,之前我使用过 mybatis generator,通用Mapper感觉都不是特别好用呀,然后就巴拉了一下 Myabtis plus 的官网还有它的github demo。希望能够自己使用Mybaits Plus 生成满意的文件了,所以就有了这篇文章,研究了一天的结果现在给大家吧!

首先明确一下这篇文章的目标:

  1. 通过Mybatis plus 生成 Controller ,Service ,ServiceImpl ,Entity,XML,甚至还有自己做项目用到的 C#端的实体类文件哟!
  2. 后来者修改对应配置就能够使用,节约学习时间。
  3. 项目例程我放在自己的github中了,欢迎大家来start。

github项目地址: https://github.com/nnlzb66/mybatis-plus-learning.git

话不多说,接下来看一看 Mybatis plus 的生成代码的使用姿势吧。

1 导入相关依赖包

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>

        <!-- 由于我这里使用的是FreeMarker作为模板引擎,因此多了一个FreeMarker的包 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>

         <!-- 习惯使用fastjson --> 
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

        <!--MySQL JDBC驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

2 编写生器代码

首先我们要写入需要生成实体类的表格,如果表格比较多,可以用以下语句查询出来。

--  查询daily开头的表格,用逗号拼接
select 
GROUP_CONCAT(table_name)
from information_schema.`TABLES` 
where table_schema = 'shggs'
and table_name like 'daily%'

下边的代码我已经按照官网给的例子给大家整好了,第一次使用的时候,只需要修改对应的配置就好了。

package com.baomidou.mybatisplus.samples.generator;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
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 org.junit.Test;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

/**
 * mybatis plus 的代码生成功能,附带全套自定义模板
 * @author lizhongbin
 * @date  2020-11-27
 */
public class CodeGenerator {

    // 作者
    private static String AUTHOR = "lizhongbin";
    // 生成的实体类忽略表前缀: 不需要则置空
    private static String ENTITY_IGNORE_PREFIX = "";
    // 表名数组
    private static String[] TABLES ="daily_abs,daily_abs_second,daily_cd,daily_cd_credit_profit_gap,daily_cd_profit_gap,daily_comment,daily_drzp,daily_drzp_base_profit_gap,daily_drzp_credit_profit_gap,daily_drzp_profit_gap,daily_jrz,daily_llz,daily_llz_region,daily_llz_term_profit_gap"
            .split(",");

    // 数据库
    private static String DB_URL = "jdbc:mysql://localhost:3306/shggs?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8";
    private static DbType DB_TYPE = DbType.MYSQL;
    private static String DB_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static String DB_SCHEMA = "shggs";
    private static String DB_USER_NAME = "root";
    private static String DB_PASSWORD = "123456";

    // 输出路径
    private static String OUTPUT_PATH = "C:\\working\\idea project\\gushou-data-api\\src\\main";


    // 父包名
    private static String PARENT_PACKAGE         = "com.shgsec.gushoudata_api.daily";
    // 下边是分类包名
    // 输出包名 = 父包名 + "." + 分类包名
    private static String CONTROLLER_PACKAGE     = "controller";
    private static String SERVICE_PACKAGE        = "service";
    private static String SERVICE_IMPL_PACKAGE   = "service.impl";
    private static String MAPPER_PACKAGE         = "dao";
    private static String ENTITY_PACKAGE         = "bean";
    private static String C_SHARP_ENTITY_PACKAGE = "DailyReport";

    // mapper存放路径 = OUTPUT_PATH + MAPPER_XML_PACKAGE
    private static String MAPPER_XML_PACKAGE     = "/resources/mapper/daily";

    // 模板路径
    private static JSONObject templates = new JSONObject();

    // 注释掉模板表示不生成该类模板
    static{
        templates.put("CONTROLLER_TEMPLATE", "templates/controller.java.ftl");
        templates.put("SERVICE_TEMPLATE", "templates/service.java.ftl");
        templates.put("SERVICE_IMPL_TEMPLATE", "templates/serviceImpl.java.ftl");
        templates.put("ENTITY_TEMPLATE", "templates/entity.java.ftl");
        templates.put("MAPPER_TEMPLATE", "templates/mapper.java.ftl");
        templates.put("MAPPER_XML_TEMPLATE", "templates/mapper.xml.ftl");
//        templates.put("C_SHARP_ENTITY_TEMPLATE", "templates/C#entity.cs.ftl");
    }

    // 生成的实体类尾缀  例如: UserEntity
    private static String Entity_SUFFIX = "Entity";

    public static void main(String args[]){

        // 全局配置
        GlobalConfig globalConfig = globalConfig();

        // 数据库连接配置
        DataSourceConfig dataSourceConfig = dataSourceConfig();

        // 策略配置
        StrategyConfig strategyConfig = strategyConfig();

        // 包配置
        PackageConfig packageConfig = packageConfig();

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


        // 自定义配置
        InjectionConfig injectionConfig = injectionConfig();

        // 执行
        AutoGenerator autoGenerator = new AutoGenerator();
        autoGenerator.setGlobalConfig(globalConfig)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(packageConfig)
                // 因为使用了自定义模板,所以需要把各项置空否则会多生成一次
                .setTemplate(templateConfig)
                // 使用的模板引擎,如果不是默认模板引擎则需要添加模板依赖到pom,现在用的是freemarker,需要导包
                .setTemplateEngine(new FreemarkerTemplateEngine())
                .setCfg(injectionConfig)
                .execute();

        // 用于查看配置中都有什么,方便写ftl模板时候自己去找配置,写到ftl中
//        System.out.println("================= 配置信息 =======================");
//        System.out.println(JSON.toJSONString(autoGenerator.getConfig(), SerializerFeature.PrettyFormat));

//        List<TableInfo> list = autoGenerator.getConfig().getTableInfoList();
//        for (TableInfo t:list) {
//            System.out.println("================= 表格信息 =======================");
//            System.out.println(JSON.toJSONString(t,SerializerFeature.PrettyFormat));
//        }
    }


    /**
     * 全局配置
     */
    private static GlobalConfig globalConfig() {
        return new GlobalConfig()
                // 打开文件
                .setOpen(false)
                // 文件覆盖
                .setFileOverride(true)
                // 开启activeRecord模式,开启之后就可以直接使用entity对数据库进行操作
                .setActiveRecord(true)
                // XML ResultMap: mapper.xml生成查询映射结果
                .setBaseResultMap(true)
                // XML ColumnList: mapper.xml生成查询结果列
                .setBaseColumnList(true)
                // swagger注解; 须添加swagger依赖
                .setSwagger2(true)
                // 作者
                .setAuthor(AUTHOR)
                // 设置实体类后缀名称
                .setEntityName("%s"+Entity_SUFFIX);
    }

    /**
     * 数据源配置
     */
    private static DataSourceConfig dataSourceConfig() {

        // 数据源配置
        return  new DataSourceConfig()
         // 地址
        .setUrl(DB_URL)
         // 数据库名
        .setSchemaName(DB_SCHEMA)
         // 驱动
        .setDriverName(DB_DRIVER)
         // 用户名
        .setUsername(DB_USER_NAME)
         // 密码
        .setPassword(DB_PASSWORD)
         // 数据库类型
        .setDbType(DB_TYPE);
    }

    /**
     * 策略配置
     */
    private static StrategyConfig strategyConfig() {
        return new StrategyConfig()
                // 表名生成策略:下划线连转驼峰
                .setNaming(NamingStrategy.underline_to_camel)
                // 表字段生成策略:下划线连转驼峰
                .setColumnNaming(NamingStrategy.underline_to_camel)
                // 需要生成的表
                .setInclude(TABLES)
                // 生成controller
                .setRestControllerStyle(true)
                // 去除表前缀
                .setTablePrefix(ENTITY_IGNORE_PREFIX)
                // controller映射地址:驼峰转连字符
                .setControllerMappingHyphenStyle(true)
                // 是否为lombok模型; 需要lombok依赖
                .setEntityLombokModel(true)
                // 生成实体类字段注解
                .setEntityTableFieldAnnotationEnable(true);
    }

    /**
     * 包配置
     * 设置包路径用于导包时使用,路径示例:com.path
     */
    private static PackageConfig packageConfig() {

        return new PackageConfig()
                // 如果下面包没写全,还有前缀那就加上,如果包写全了就不加了
                .setParent(PARENT_PACKAGE)
                .setController(CONTROLLER_PACKAGE)
                .setService(SERVICE_PACKAGE)
                .setServiceImpl(SERVICE_IMPL_PACKAGE)
                .setEntity(ENTITY_PACKAGE)
                .setMapper(MAPPER_PACKAGE)
                .setXml(MAPPER_PACKAGE);
    }

    /**
     * 模板配置
     */
    private static TemplateConfig templateConfig() {
        return new TemplateConfig()
                // 置空后方便使用自定义输出位置
                .setEntity(null)
                .setXml(null)
                .setMapper(null)
                .setService(null)
                .setServiceImpl(null)
                .setController(null);
    }

    /**
     * 自定义配置
     */
    private static InjectionConfig injectionConfig() {

        // 自定义日期和日期格式
        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd  HH:mm:ss");
        String dateString = format.format(new Date());
        Map<String,Object> userDefiedData = new HashMap<>();
        userDefiedData.put("createTime", dateString);
        userDefiedData.put("schema", DB_SCHEMA);


        return new InjectionConfig() {
            @Override
            public void initMap() {
                // 注入配置
            }
        }
                // 判断是否创建文件
                .setFileCreate(new IFileCreate() {
                    @Override
                    public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                        // 检查文件目录,不存在自动递归创建
                        createFile(filePath);

                        // 指定需要覆盖的文件, 文件不存在就创建,否则只覆盖Dao,Mapper.xml,Mapper.java,Model.cs
                        if (isExists(filePath)
                                && (!filePath.endsWith("Mapper.xml")
                                && !filePath.endsWith(Entity_SUFFIX+".java")
                                && !filePath.endsWith("Mapper.java")
                                && !filePath.endsWith("Model.cs")
                        )) {
                            return false;
                        }

                        return true;
                    }
                })
                // 自定义输出文件
                .setFileOutConfigList(fileOutConfigList())
                // 自定义参数使用cfg.xxx来调用
                .setMap(userDefiedData);
    }

    /**
     * 自定义输出文件配置
     */
    private static List<FileOutConfig> fileOutConfigList() {
        List<FileOutConfig> list = new ArrayList<>();
        String CONTROLLER_TEMPLATE = templates.getString("CONTROLLER_TEMPLATE");
        String SERVICE_TEMPLATE  =  templates.getString("SERVICE_TEMPLATE");
        String SERVICE_IMPL_TEMPLATE  = templates.getString("SERVICE_IMPL_TEMPLATE");
        String ENTITY_TEMPLATE  = templates.getString("ENTITY_TEMPLATE");
        String MAPPER_TEMPLATE = templates.getString("MAPPER_TEMPLATE");
        String MAPPER_XML_TEMPLATE  = templates.getString("MAPPER_XML_TEMPLATE");
        String C_SHARP_ENTITY_TEMPLATE = templates.getString("C_SHARP_ENTITY_TEMPLATE");
        // 实体类文件输出
        list.add(new FileOutConfig(ENTITY_TEMPLATE) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return OUTPUT_PATH + "/java/" + replaceDot(PARENT_PACKAGE,ENTITY_PACKAGE) +"/"+ tableInfo.getEntityName() + StringPool.DOT_JAVA;
            }
        });
        // C#实体类文件输出
        list.add(new FileOutConfig(C_SHARP_ENTITY_TEMPLATE) {
            @Override
            public String outputFile(TableInfo tableInfo) {

                return OUTPUT_PATH + "/java/" + replaceDot(PARENT_PACKAGE,C_SHARP_ENTITY_PACKAGE) +"/"+ tableInfo.getEntityName() + ".cs";
            }
        });

        // mapper xml文件输出
        list.add(new FileOutConfig(MAPPER_XML_TEMPLATE) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return OUTPUT_PATH + replaceDot("",MAPPER_XML_PACKAGE) +"/"+ tableInfo.getXmlName() + StringPool.DOT_XML;
            }
        });
        // mapper文件输出
        list.add(new FileOutConfig(MAPPER_TEMPLATE) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return OUTPUT_PATH + "/java/" + replaceDot(PARENT_PACKAGE,MAPPER_PACKAGE) +"/"+ tableInfo.getMapperName() + StringPool.DOT_JAVA;
            }
        });
        // service文件输出
        list.add(new FileOutConfig(SERVICE_TEMPLATE) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return OUTPUT_PATH + "/java/" + replaceDot(PARENT_PACKAGE,SERVICE_PACKAGE) +"/"+ tableInfo.getServiceName() + StringPool.DOT_JAVA;
            }
        });
        // service impl文件输出
        list.add(new FileOutConfig(SERVICE_IMPL_TEMPLATE) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return OUTPUT_PATH + "/java/" + replaceDot(PARENT_PACKAGE,SERVICE_IMPL_PACKAGE)+"/" + tableInfo.getServiceImplName() + StringPool.DOT_JAVA;
            }
        });
        // controller文件输出
        list.add(new FileOutConfig(CONTROLLER_TEMPLATE) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return OUTPUT_PATH + "/java/" + replaceDot(PARENT_PACKAGE,CONTROLLER_PACKAGE)+"/" + tableInfo.getControllerName() + StringPool.DOT_JAVA;
            }
        });

        return list;
    }

    /**
     * 判断文件是否存在
     * @param path 路径
     * @return
     */
    private static boolean isExists(String path) {
        File file = new File(path);
        return file.exists();
    }

    /**
     * 将.替换成为文件分隔符
     * */
    private static String replaceDot(String parent,String value){
        return (parent+"."+value).replaceAll("\\.","/");
    }

    /**
     * 自动创建
     */
    private static void  createFile(String filePath){
        File file = new File(filePath);
        if(!file.exists()){
            File folder = file.getParentFile();
            if(!folder.exists()){
                folder.mkdirs();
            }
            file = new File(filePath);
        }
    }
}

3 编写模板文件代码

3.1 contoller.java.ftl

package ${package.Controller};

import ${package.Entity}.${entity};
import ${package.Service}.${table.serviceName};
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSON;

<#if restControllerStyle>
<#else>
import org.springframework.stereotype.Controller;
</#if>
<#if superControllerClassPackage??>
import ${superControllerClassPackage};
</#if>


import javax.validation.Valid;
import java.util.List;

/**
* <p>
* ${table.comment} 前端控制器
* </p>
*
* @author ${author}
* @date   ${date}
*/
@Api(tags = "${table.comment}")
<#if restControllerStyle>
@RestController
<#else>
@Controller
</#if>
@RequestMapping("<#if package.ModuleName??>/${package.ModuleName}</#if>/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
<#if kotlin>
class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()</#if>
<#else>
<#if superControllerClass??>
public class ${table.controllerName} extends ${superControllerClass} {
<#else>
public class ${table.controllerName} {
</#if>

    @Autowired
    private ${table.serviceName} ${table.serviceName?uncap_first};

    @ApiOperation(value = "${table.comment}分页列表", response = ${entity}.class)
    @ApiImplicitParams({
        @ApiImplicitParam(name = "page", value = "页面", dataType = "Long"),
        @ApiImplicitParam(name = "size", value = "页面数据量", dataType = "Long"),
        @ApiImplicitParam(name = "sort", value = "排序方式排序[true:正序; false:倒序]", dataType = "Boolean"),
        @ApiImplicitParam(name = "sortName", value = "排序字段,参照返回字段", dataType = "String")})
    @PostMapping(value = "/page")
    public  String list(@Valid @RequestBody ${entity} param) {
        try{
            List<${entity}> data = ${table.serviceName?uncap_first}.list(param);
            return JSON.toJSONString(data);
        }catch(Exception e){
            return  e.getMessage();
        }
    }

    @ApiOperation(value = "${table.comment}详情", response = ${entity}.class)
    @GetMapping(value = "/info/{id}")
    public  String info(@PathVariable Long id) {
        try{
            ${entity} data = ${table.serviceName?uncap_first}.info(id);
            return JSON.toJSONString(data);
        }catch(Exception e){
            return  e.getMessage();
        }
    }

    @ApiOperation(value = "${table.comment}新增")
    @PostMapping(value = "/add")
    public  String add(@Valid @RequestBody ${entity} param) {
       try{
            ${table.serviceName?uncap_first}.add(param);
            return "发送成功!";
        }catch(Exception e){
            return  e.getMessage();
        }
    }

    @ApiOperation(value = "${table.comment}修改")
    @PostMapping(value = "/modify")
    public  Object modify(@Valid @RequestBody ${entity} param) {
       try{
            ${table.serviceName?uncap_first}.modify(param);
            return "修改成功!";
        }catch(Exception e){
            return  e.getMessage();
        }
    }

    @ApiOperation(value = "${table.comment}删除(单个条目)")
    @GetMapping(value = "/remove/{id}")
    public  Object remove(@PathVariable Long id) {

        try{
            ${table.serviceName?uncap_first}.remove(id);
            return "删除成功!";
        }catch(Exception e){
            return  e.getMessage();
        }

    }

    @ApiOperation(value = "${table.comment}删除(多个条目)")
    @PostMapping(value = "/removes")
    public  Object removes(@Valid @RequestBody List<Long> ids) {
        try{
            ${table.serviceName?uncap_first}.removes(ids);
            return "批量删除成功!";
        }catch(Exception e){
            return  e.getMessage();
        }
    }

}
</#if>

3.2 service.java.ftl

package ${package.Service};

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

import java.util.List;

/**
* ${table.comment!} 服务类
*
* @author ${author}
* @date   ${date}
*/
public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {

    /**
    * ${table.comment!}查询列表
    * @param param 根据需要进行传值
    * @return
    */
    List<${entity}> list(${entity} param) throws Exception;

    /**
    * ${table.comment!}详情
    * @param id
    * @return
    */
    ${entity} info(Long id) throws Exception;

    /**
    * ${table.comment!}新增
    * @param param 根据需要进行传值
    * @return
    */
    void add(${entity} param) throws Exception;

    /**
    * ${table.comment!}修改
    * @param param 根据需要进行传值
    * @return
    */
    void modify(${entity} param) throws Exception;

    /**
    * ${table.comment!}删除(单个条目)
    * @param id
    * @return
    */
    void remove(Long id) throws Exception;

    /**
    * 删除(多个条目)
    * @param ids
    * @return
    */
    void removes(List<Long> ids) throws Exception;
}

3.3 serviceImpl.java.ftl

package ${package.ServiceImpl};

import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import ${superServiceImplClassPackage};
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.List;
import com.alibaba.fastjson.JSON;

import java.util.List;

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

}
<#else>
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {



    /**
    * ${table.comment!}查询列表
    * @param param 根据需要进行传值
    * @return
    */
    @Override
    public List<${entity}> list(${entity} param) {

        QueryWrapper<${entity}> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda()
<#list table.fields as field>
            // ${field.comment}
<#if !entityLombokModel>
    <#if field.propertyType == "Boolean">
        <#assign getprefix="is"/>
    <#else>
        <#assign getprefix="get"/>
    </#if>
    <#if field.propertyType == "String">
                .eq(!StringUtils.isEmpty(param.${getprefix}${field.capitalName}()), ${entity}::${getprefix}${field.capitalName}, param.${getprefix}${field.capitalName}())
    <#else>
                .eq(param.${getprefix}${field.capitalName}() != null, ${entity}::${getprefix}${field.capitalName}, param.${getprefix}${field.capitalName}())
    </#if>
<#else>
    <#if field.propertyType == "String">
            .eq(!StringUtils.isEmpty(param.get${field.capitalName}()), ${entity}::get${field.capitalName}, param.get${field.capitalName}())
    <#else>
            .eq(param.get${field.capitalName}() != null, ${entity}::get${field.capitalName}, param.get${field.capitalName}())
    </#if>
</#if>
</#list>;

        List<${entity}> result = list(queryWrapper);

        return result;
    }

    /**
    * ${table.comment!}详情
    * @param id
    * @return
    */
    @Override
    public ${entity} info(Long id) {

        return getById(id);
    }

    /**
    * ${table.comment!}新增
    * @param param 根据需要进行传值
    * @return
    */
    @Override
    public void add(${entity} param) throws Exception {

        if (!save(param)) {
            throw new Exception("添加"+JSON.toJSONString(param)+"失败!");
        }
    }

    /**
    * ${table.comment!}修改
    * @param param 根据需要进行传值
    * @return
    */
    @Override
    public void modify(${entity} param) throws Exception {

        if (!updateById(param)) {
            throw new Exception("修改"+JSON.toJSONString(param)+"失败!");
        }
    }

    /**
    * ${table.comment!}删除(单个条目)
    * @param id
    * @return
    */
    @Override
    public void remove(Long id) throws Exception {
        if (!removeById(id)) {
            throw new Exception("删除: "+id+" 失败!");
        }
    }

    /**
    * ${table.comment!}删除(多个条目)
    * @param ids
    * @return
    */
    @Override
    public void removes(List<Long> ids) throws Exception {
        removeByIds(ids);
    }
}
</#if>

3.4 mapper.java.ftl

package ${package.Mapper};

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

/**
 * @author ${author}
 * @date   ${date}
 */
public interface ${table.mapperName} extends BaseMapper<${table.entityName}> {

      // 自定义自增主键插入
      public int insertOne(${table.entityName} entity);
}

3.5 entity.java.ftl

package ${package.Entity};

import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;

/**
${table.comment}
@author ${author}
@date   ${cfg.createTime}
*/
@Data
public class ${entity} {

    <#list table.commonFields as value>
      <#if value.comment!="">
      // ${value.comment}
      </#if>
      private  ${value.propertyType}  ${value.capitalName};
    </#list>
    <#list table.fields as value>
      <#if value.comment!="">
      // ${value.comment}
      </#if>
      private  ${value.propertyType}  ${value.capitalName};
    </#list>

}

3.6 mapper.xml.ftl

<#function transType javaType>
   <#local result = "">
   <#switch javaType>
   <#case "BigDecimal"><#local result = "java.math.BigDecimal"><#break>
   <#case "Date"><#local result = "java.util.Date"><#break>
   <#default> <#local result = javaType>
   </#switch>
   <#return result>
</#function>
<?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.entityName}Mapper">

    <resultMap  id="BaseResultMap" type="${package.Entity}.${table.entityName}">
    <#list table.commonFields as value>
       <result column="${value.propertyName}" property="${value.capitalName}"  jdbcType="${value.columnType}" javaType="${transType(value.propertyType)}"></result>
    </#list>
    <#list table.fields as value>
       <result column="${value.propertyName}" property="${value.capitalName}"  jdbcType="${value.columnType}" javaType="${transType(value.propertyType)}"></result>
    </#list>
    </resultMap>


    <!-- 自定义自增主键插入 -->
    <insert id="insertOne" parameterType="${package.Entity}.${table.entityName}">
        <selectKey resultType="Long" keyColumn="id" keyProperty="id">
            select max(id)
            from
            ${table.name}
        </selectKey>
        insert into ${table.name}
        (
     <#list table.fields as value>
      <#if value_index = table.fields?size-1>
           ${value.columnName}
         <#else>
           ${value.columnName},
      </#if>
     </#list>

        ) values
        (
    <#list table.fields as value>
     <#if value_index = table.fields?size-1>
          <#noparse>#{</#noparse>${value.capitalName}<#noparse>}</#noparse>
        <#else>
          <#noparse>#{</#noparse>${value.capitalName}<#noparse>},</#noparse>
     </#if>
    </#list>
        )
    </insert>


</mapper>

3.7 最骚的操作来啦,甚至还可以生成C#的文件呢,反正是模板,你想怎么生成就怎么生成!

using System;

<#function transType javaType>
   <#local result = "">
   <#switch javaType>
   <#case "Long"><#local result = "long"><#break>
   <#case "Integer"><#local result = "int"><#break>
   <#case "Boolean"><#local result = "bool"><#break>
   <#case "BigDecimal"><#local result = "decimal"><#break>
   <#case "String"><#local result = "string"><#break>
   <#case "Float"><#local result = "float"><#break>
   <#case "Double"><#local result = "double"><#break>
   <#case "Short"><#local result = "short"><#break>
   <#case "Byte"><#local result = "byte"><#break>
   <#default> <#local result = javaType>
   </#switch>

   <#return result>
</#function>

namespace ShgFICCDataAnaClient.Model.DailyReport
{


    /// <summary>
    /// ${table.comment}
    /// </summary>
    public class ${entity}Model : ShgModelBase
    {


        <#list table.commonFields as value>
          <#if value.comment!="">
        // ${value.comment}
          </#if>
        private  ${transType(value.propertyType)}  _${value.columnName};
        </#list>
        <#list table.fields as value>
          <#if value.comment!="">
        // ${value.comment}
          </#if>
        private  ${transType(value.propertyType)}  _${value.columnName};
        </#list>


        <#list table.commonFields as value>
        public  ${transType(value.propertyType)}  ${value.capitalName}  { get { return _${value.columnName}; } set { _${value.columnName} = value; } };
        </#list>
        <#list table.fields as value>
        public  ${transType(value.propertyType)}  ${value.capitalName}  { get { return _${value.columnName}; } set { _${value.columnName} = value; } }
        </#list>
    }

}

4 接下来,美好的事情即将发生……

从Github 上导入程序之后,修改项目配置,点击RunMain,具体效果请看文章开头,哈哈哈!

本文地址:https://blog.csdn.net/nnlzb66/article/details/110236124

《使用Mybatis Plus 自动创建模板文件.doc》

下载本文的Word格式文档,以方便收藏与打印。