欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-07 18:29:19
使用Mybatis Plus 自动创建模板文件0 使用效果![完整视频.gif](https://img-blog.csdnimg.cn/img_convert/2e44ac5b763794f2b64492dacd72cd2e.gif#align=left&display=inline&height=971&margin=[object Object]&name=完整视频.gif&originHeight=971&originWidth=1907&...

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

0 使用效果

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

使用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,具体效果请看文章开头,哈哈哈!

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

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