Mybatis实战(2)

mysql generate

1,引入依赖:

<!-- MyBatis 生成器 -->
<dependency>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-core</artifactId>
  <version>1.3.7</version>
</dependency>
<dependency>
  <groupId>org.apache.velocity</groupId>
  <artifactId>velocity</artifactId>
  <version>1.7</version>
</dependency>

2,数据库连接配置文件 generator.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://127.0.0.1:3306/lottery?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&rewriteBatchedStatements=true&useSSL=false
jdbc.userId=root
jdbc.password=root

3,代码生成配置文件:generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!--数据库驱动-->
    <properties resource="generator.properties"/> <!--添加配置数据源文件-->
    <context id="DB2Tables"    targetRuntime="MyBatis3" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 为模型生成序列化方法-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <!-- 为生成的Java模型创建一个toString方法 -->
        <!--<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>-->

        <!--可以自定义生成model的代码注释,-->
        <!--生成mapper.xml时覆盖原文件-->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

        <!--引入LombokPlugin自定义插件-->
        <plugin type="org.example.generate.LombokPlugin" >
            <property name="hasLombok" value="true"/>
        </plugin>

        <commentGenerator type="org.example.generate.CommentGenerator">
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        <!--数据库链接地址账号密码-->
        <jdbcConnection driverClass="${jdbc.driverClass}"
                          connectionURL="${jdbc.connectionURL}"
                          userId="${jdbc.userId}"
                         password="${jdbc.password}">
                     <!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
                    <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!--生成Model类存放位置-->
        <javaModelGenerator targetPackage="org.example.domain.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
           <!-- <property name="trimStrings" value="true"/>-->
        </javaModelGenerator>
        <!--指定生成mapper.xml的路径-->
        <sqlMapGenerator targetPackage="org.example.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!--生成Dao类存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="mapper" targetProject="resources">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!--生成对应表及类名 tableName填表名  domainObjectName生成实体名称-->
        <table tableName="current_lottery" domainObjectName="CurrentLottery"
               enableCountByExample="false" enableUpdateByExample="false" 
               enableDeleteByExample="false" enableSelectByExample="false" 
               selectByExampleQueryId="false">
            <!--添加此配置: 不使用默认驼峰格式-->
            <!--<property name="useActualColumnNames" value="true"/>-->
            <!--<generatedKey column="id" sqlStatement="MySql" identity="true"/>-->
        </table>
    </context>
</generatorConfiguration>

4,LombokPlugin插件类

package org.example.generate;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author : zhang sq
 * @date : 2019/12/24 11:40
 **/
public class LombokPlugin extends PluginAdapter {

    @Override
    public boolean validate(List<String> warnings) {
        return true;
    }

    //todo 实体model添加信息
    @Override
    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        //todo 实体添加import信息
        topLevelClass.addImportedType("lombok.AllArgsConstructor");
        topLevelClass.addImportedType("lombok.NoArgsConstructor");
        topLevelClass.addImportedType("lombok.Data");
//        topLevelClass.addImportedType("io.swagger.annotations.ApiModel");
//        topLevelClass.addImportedType("io.swagger.annotations.ApiModelProperty");
        topLevelClass.addImportedType("com.fasterxml.jackson.annotation.JsonFormat");
//        topLevelClass.addImportedType("javax.validation.constraints.NotBlank");
//        topLevelClass.addImportedType("javax.validation.constraints.NotNull");
        //topLevelClass.addImportedType("org.apache.solr.client.solrj.beans.Field");  //solr注解导包
        //todo 实体添加注解信息
        topLevelClass.addAnnotation("@AllArgsConstructor");
        topLevelClass.addAnnotation("@NoArgsConstructor");
        topLevelClass.addAnnotation("@Data");
//        topLevelClass.addAnnotation("@ApiModel(description = \"" + "" + "\")");
        //todo 实体添加作者时间
        topLevelClass.addJavaDocLine("/**");
        topLevelClass.addJavaDocLine(" * @author : zhang sq ");
        topLevelClass.addJavaDocLine(" * @date : "+ date2Str(new Date()));
        topLevelClass.addJavaDocLine(" **/");
        return true;
    }

    //todo mapper 添加注解信息 import信息
    @Override
    public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        //todo mapper添加import  和注解
        FullyQualifiedJavaType importedType1=new FullyQualifiedJavaType("org.apache.ibatis.annotations.Mapper");
        FullyQualifiedJavaType importedType2=new FullyQualifiedJavaType("org.apache.ibatis.annotations.Param");
        Set set=new HashSet();
        set.add(importedType1); set.add(importedType2);
        interfaze.addImportedTypes(set);
        interfaze.addAnnotation("@Mapper");
        //todo Mapper添加作者时间
        interfaze.addJavaDocLine("/**");
        interfaze.addJavaDocLine(" * @author : zhang sq ");
        interfaze.addJavaDocLine(" * @date : "+ date2Str(new Date()));
        interfaze.addJavaDocLine(" **/");
        return true;
    }

    //todo 控制是否生成get方法   false不生成  true生成
    @Override
    public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        //不生成getter
        return false;
    }

    //todo 控制是否生成set方法   false不生成  true生成
    @Override
    public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        //不生成setter
        return false;
    }

    private String date2Str(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        return sdf.format(date);
    }
}

5,Generator生成主类:

package org.example.generate;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @ Author : zhangshengqiang
 * @ Date   : 2019/5/23 16:39
 **/
public class Generator {
    public static void main(String[] args) throws Exception {
        String functionName="当前期号";   //类描述
        String ClassName="CurrentLottery";     //类名
        String className="currentLottery";     //类名驼峰
        String path="C:\\project\\com.cn.lottery\\src\\main\\java\\org\\example\\";
        //MBG 执行过程中的警告信息
        List<String> warnings = new ArrayList<String>();
        //当生成的代码重复时,覆盖原代码
        boolean overwrite = true;
        //读取我们的 MBG 配置文件
        InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        //创建 MBG
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        //执行生成代码
        myBatisGenerator.generate(null);
        //获取保存的注释信息
        List<String> request = CommentGenerator.request;
        List<String> response = CommentGenerator.response;
        ClassCreate.generate(path,functionName,ClassName,className,request,response);
        //输出警告信息
        for (String warning : warnings) {
            System.out.println(warning);
        }
    }
}

6,生成共有类CommentGenerator:

package org.example.generate;


import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * @ Author : zhangshengqiang
 * @ Date   : 2019/5/23 17:36
 **/
public class CommentGenerator extends DefaultCommentGenerator {

    public static List<String> request = new ArrayList<>();

    public static List<String> response = new ArrayList<>();

    private boolean addRemarkComments = false;
    private static final String EXAMPLE_SUFFIX = "Example";
    private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME = "io.swagger.annotations.ApiModelProperty";
    private int i = 0;

    /**
     * 设置用户配置的参数
     */
    @Override
    public void addConfigurationProperties(Properties properties) {
        super.addConfigurationProperties(properties);
        this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
    }

    /**
     * 给字段添加注释
     */
    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        String remarks = introspectedColumn.getRemarks();
        String jdbcTypeName = introspectedColumn.getJdbcTypeName();

        //todo 添加api文档注释信息
        String name = field.getName();
        String shortName = field.getType().getShortName();
        String re = "@apiParam     {" + shortName + "}      " + name + "       " + remarks;
        String rs = "@apiSuccess     {" + shortName + "}      " + name + "       " + remarks;
        request.add(re);
        response.add(rs);


        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
            addFieldJavaDoc(field, remarks);
            //数据库中特殊字符需要转义
            if (remarks.contains("\"")) {
                remarks = remarks.replace("\"", "'");
            }

            //todo 给model的字段添加swagger注解 swagger二选一  格式例: @ApiModelProperty(value = "确认收货时间" ,example = "")
//            Object example = setExample(jdbcTypeName, remarks);
//            field.addJavaDocLine("@ApiModelProperty(value = \"" + remarks + "\" ,example = \"" + example + "\")");

            //todo 给model的字段添加swagger注解 swagger二选一  格式例: @ApiModelProperty(value = "确认收货时间")
            //field.addJavaDocLine("@ApiModelProperty(value = \"" + remarks + "\" )");

            //todo solr注解
//            field.addJavaDocLine("@Field( \""+ field.getName() + "\")");

            //todo 为date类型字段自动添加@JsonFormat 注解
            if (jdbcTypeName.equals("TIMESTAMP") || jdbcTypeName.equals("TIME")) {
                field.addJavaDocLine("@JsonFormat(locale=\"zh\", timezone=\"GMT+8\", pattern=\"yyyy-MM-dd HH:mm:ss\")");
            }
            //todo 为字段添加校验
//            if(jdbcTypeName.equals("VARCHAR")||jdbcTypeName.equals("LONGVARCHAR")){
//                if(remarks.contains("时间")){
//
//                }else {
//                    field.addJavaDocLine("@NotBlank(message=\""+remarks+"不能为空\")");
//                }
//            }
//            if(jdbcTypeName.equals("INTEGER")||jdbcTypeName.equals("BIGINT")||jdbcTypeName.equals("DECIMAL")){
//                field.addJavaDocLine("@NotNull(message=\""+remarks+"不能为空\")");
//            }
        }
        super.addFieldComment(field, introspectedTable, introspectedColumn);
    }

    /**
     * todo 给model的字段添加注释 例://订单id 注释格式二选一
     */
    private void addFieldJavaDoc(Field field, String remarks) {
        //todo 给model的字段添加注释 例://订单id
//        String[] remarkLines=remarks.split(System.getProperty("line.separator"));//换行
//        field.addJavaDocLine("//"+remarkLines[0]);
        //todo 给model的字段添加注释 例: /**
        //todo                           *  订单id
        //todo                           */
//        field.addJavaDocLine("/**");
//        String[] remarkLines=remarks.split(System.getProperty("line.separator"));//换行
//        field.addJavaDocLine(" * "+remarkLines[0]);
//        field.addJavaDocLine(" */");
    }

    @Override
    public void addJavaFileComment(CompilationUnit compilationUnit) {
//        super.addJavaFileComment(compilationUnit);
//        if (compilationUnit.isJavaInterface() && compilationUnit.
//                getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)) {
//            compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
//        }
    }


    private Object setExample(String jdbcTypeName, String remarks) {
        switch (jdbcTypeName) {
            case "BIGINT":
                return 2L;
            case "VARCHAR":
                if (remarks.contains("时间")) {
                    return "2018-08-08 20:00:00";
                } else {
                    return remarks;
                }
            case "LONGVARCHAR":
                return remarks;
            case "TIMESTAMP":
                return "2018-08-08 20:00:00";
            case "TIME":
                return "2018-08-08 20:00:00";
            case "DECIMAL":
                return "6.66";
            case "INTEGER":
                return "1";
        }
        return null;
    }

}

7,类生成类ClassCreate

package org.example.generate;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.example.constant.Constants;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

/**
 * @author : zhang sq
 * @date : 2020/8/27 15:07
 **/
public class ClassCreate {
    public static void generate(String path,String functionName, String ClassName, String className,List<String> request,List<String> response) throws Exception {
        Properties p = new Properties();
        // 加载classpath目录下的vm文件
        p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        // 定义字符集
        p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8);
        p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8);
        // 初始化Velocity引擎,指定配置Properties
        Velocity.init(p);
        VelocityContext context = new VelocityContext();
        context.put("functionName", functionName);
        context.put("ClassName", ClassName);
        context.put("className",className);
        context.put("request",request);
        context.put("response",response);
        context.put("date",new SimpleDateFormat(Constants.YYYY_MM_DD).format(new Date()));
        List<String> templateList = getTemplateList();
        int i=0;
        for (String template :templateList){
            // 渲染模板
            StringWriter sw = new StringWriter();
            Template tpl = Velocity.getTemplate(template, Constants.UTF8);
            tpl.merge(context, sw);
            OutputStream out = null;
            if(i==0){
                out = new FileOutputStream(path+"controller\\"+ClassName+"Controller.java");
            }else if(i==1){
                out = new FileOutputStream(path+"service\\"+ClassName+"Service.java");
            }else if(i==2){
                out = new FileOutputStream(path+"service\\impl\\"+ClassName+"ServiceImpl.java");
            }else if(i==3){
                out = new FileOutputStream(path+"mapper\\"+ClassName+"Mapper.java");
            }
            Writer writer = new BufferedWriter(new OutputStreamWriter(out, "utf-8"));//解决乱码问题
            // 转换输出
            tpl.merge(context, writer);
            writer.flush();
            out.close();
            i++;
        }
    }


    public static List<String> getTemplateList() {
        List<String> templates = new ArrayList<String>();
        String resourcePath = "vm/java/";
        templates.add(resourcePath+"controller.java.vm");
        templates.add(resourcePath+"service.java.vm");
        templates.add(resourcePath+"serviceImpl.java.vm");
        templates.add(resourcePath+"mapper.java.vm");
        return templates;
    }

}

8,resources下vm/java/的模板文件:controller.java.vm

package classfile;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import util.PaginationResponse;
import util.QueryParam;
import util.ResultVO;
import util.StatusCode;
import model.${ClassName};
/**
 * ${functionName}Controller
 * @author zhang sq
 * @date ${date}
 */
@Api(tags = "${functionName}",description = "${ClassName}")
@RestController
@RequestMapping("/manager/${className}")
public class ${ClassName}Controller{

    @Autowired
    private ${ClassName}Service ${className}Service;

    /**
     * @api {post}  /manager/${className}/insert   新增${functionName}
     * @apiName insert
     * @apiGroup ${functionName}
     * @apiVersion 0.1.0
     * @apiDescription 新增${functionName}
     #foreach( $rs in $request )
* ${rs}
     #end

     * @apiSuccess {String} code 结果码
     * @apiSuccess {String} msg  消息说明
     * @apiSuccess {String} rows 数据组合
     * @apiSuccessExample Success-Response:
     *  HTTP/1.1 200 OK
     *     {
     *          "code": "200",
     *          "msg": "SUCCESS",
     *          "rows": 1
     *      }
     *
     *  @apiErrorExample {json} Error-Response:
     *  HTTP/1.1 404 Not Found
     *    {
     *    "code": "999",
     *    "msg": "操作失败,异常信息为:参数id不能为空",
     *     "rows": ""
     *   }
     */
    @ApiOperation("新增${functionName}")
    @CrossOrigin
    @PostMapping("/insert")
    public ResultVO insert(${ClassName} ${className}) {
        int count = ${className}Service.insert(${className});
        return new ResultVO(StatusCode.RESULT_SUCCESS,count);
    }


    /**
     * @api {post}  /manager/${className}/update   修改${functionName}
     * @apiName update
     * @apiGroup ${functionName}
     * @apiVersion 0.1.0
     * @apiDescription 修改${functionName}
     #foreach( $rs in $request )
* ${rs}
     #end

     * @apiSuccess {String} code 结果码
     * @apiSuccess {String} msg  消息说明
     * @apiSuccess {String} rows 数据组合
     * @apiSuccessExample Success-Response:
     *  HTTP/1.1 200 OK
     *     {
     *          "code": "200",
     *          "msg": "SUCCESS",
     *          "rows": 1
     *      }
     *
     *  @apiErrorExample {json} Error-Response:
     *  HTTP/1.1 404 Not Found
     *    {
     *    "code": "999",
     *    "msg": "操作失败,异常信息为:参数id不能为空",
     *     "rows": ""
     *   }
     */
    @ApiOperation("修改${functionName}")
    @CrossOrigin
    @PostMapping("/update")
    public ResultVO update(${ClassName} ${className}) {
        int count = ${className}Service.update(${className});
        return new ResultVO(StatusCode.RESULT_SUCCESS,count);
    }


    /**
     * @api {get}  /manager/${className}/findList   条件分页查询${functionName}列表
     * @apiName findList
     * @apiGroup ${functionName}
     * @apiVersion 0.1.0
     * @apiDescription ${functionName}
     *
     * @apiParam {Integer}        pageNum       当前数据页码(必填)
     * @apiParam {Integer}        pageSize        单页数据量(必填)
     * @apiParam {String}         A              无敌 (选填)
     * @apiParam {String}         A             无敌 (选填)
     * @apiParam {String}         A             无敌 (选填)

     #foreach( $rs in $response )
* ${rs}
     #end

     * @apiSuccess {Long}         pageDataSize    数据总数
     * @apiSuccess {String}       pageDataList    数据结果集
     * @apiSuccess {Integer}      pageNum       当前数据页码
     * @apiSuccess {Integer}      pageSize        单页数据量
     * @apiSuccess {Integer}      total        总页数
     * @apiSuccess {String}       code 结果码
     * @apiSuccess {String}       msg  消息说明
     * @apiSuccess {String}       rows 数据组合
     * @apiSuccessExample Success-Response:
     *  HTTP/1.1 200 OK
     *     {
     *          "code": "200",
     *          "msg": "SUCCESS",
     *          "rows": 1
     *      }
     *
     *  @apiErrorExample {json} Error-Response:
     *  HTTP/1.1 404 Not Found
     *    {
     *    "code": "999",
     *    "msg": "操作失败,异常信息为:参数id不能为空",
     *     "rows": ""
     *   }
     */
    @CrossOrigin
    @ApiOperation("条件分页查询${functionName}列表")
    @GetMapping("/findList")
    public ResultVO findList(QueryParam param){
        PaginationResponse<${ClassName}> response = ${className}Service.findList(param);
        return new ResultVO(StatusCode.RESULT_SUCCESS,response);
    }


    /**
     * @api {get}  /manager//${className}/findById   通过id查看${functionName}详细信息
     * @apiName findById
     * @apiGroup ${functionName}
     * @apiVersion 0.1.0
     * @apiDescription 通过id查看${functionName}详细信息
     *
     * @apiParam {Integer}        id              主键id(必填)
     *
     #foreach( $rs in $response )
* ${rs}
     #end

     * @apiSuccess {String} code 结果码
     * @apiSuccess {String} msg  消息说明
     * @apiSuccess {String} rows 数据组合
     * @apiSuccessExample Success-Response:
     *  HTTP/1.1 200 OK
     *     {
     *          "code": "200",
     *          "msg": "SUCCESS",
     *          "rows": 1
     *      }
     *
     *  @apiErrorExample {json} Error-Response:
     *  HTTP/1.1 404 Not Found
     *    {
     *    "code": "999",
     *    "msg": "操作失败,异常信息为:参数id不能为空",
     *     "rows": ""
     *   }
     */
    @CrossOrigin
    @ApiOperation("通过id查看${functionName}详细信息")
    @GetMapping("/findById")
    public ResultVO getInfo(Integer id) {
        ${ClassName} ${className} = ${className}Service.findById(id);
        if(${className}==null){
            return new ResultVO(StatusCode.DATA_NULL);
        }
        return new ResultVO(StatusCode.RESULT_SUCCESS,${className});
    }


    /**
     * @api {get}  /manager/test/deleteById     通过id删除测试
     * @apiName deleteById
     * @apiGroup 测试
     * @apiVersion 0.1.0
     * @apiDescription 通过id删除测试
     *
     * @apiParam   {Integer}       id            id(必填)

     * @apiSuccess {String} code 结果码
     * @apiSuccess {String} msg  消息说明
     * @apiSuccess {String} rows 数据组合
     * @apiSuccessExample Success-Response:
     *  HTTP/1.1 200 OK
     *     {
     *          "code": "200",
     *          "msg": "SUCCESS",
     *          "rows": 1
     *      }
     *
     *  @apiErrorExample {json} Error-Response:
     *  HTTP/1.1 404 Not Found
     *    {
     *    "code": "999",
     *    "msg": "操作失败,异常信息为:参数id不能为空",
     *     "rows": ""
     *   }
     */
    @CrossOrigin
    @ApiOperation("通过id删除${functionName}")
    @GetMapping("/deleteById")
    public ResultVO deleteById(Integer id) {
        int count = ${className}Service.deleteById(id);
        if(count==0){
            return new ResultVO(StatusCode.OPERA_DATA_NULL);
        }else {
            return new ResultVO(StatusCode.RESULT_SUCCESS,count);
        }
    }

}

mapper.java.vm文件:

package classfile;

import org.apache.ibatis.annotations.Param;
import util.QueryParam;
import java.util.List;
import model.${ClassName};


/**
 * ${functionName}Mapper接口
 * @author zhang sq
 * @date ${date}
 */
public interface ${ClassName}Mapper {

    //新增${functionName}
    int insert(${ClassName} ${className});

    //修改${functionName}
    int update(${ClassName} ${className});

    //通过id查看${functionName}
    ${ClassName} findById(@Param("id") Integer id);

    //通过id删除${functionName}
    int deleteById(@Param("id") Integer id);

    //条件分页查询${functionName}
    List<${ClassName}> findList(QueryParam param);
}

service.java.vm文件:

package classfile;
import util.PaginationResponse;
import util.QueryParam;
import model.${ClassName};

/**
 * ${functionName}Service接口
 * @author zhang sq
 * @date ${date}
 */
public interface ${ClassName}Service {

    //新增${functionName}
    int insert(${ClassName} ${className});

    //修改${functionName}
    int update(${ClassName} ${className});

    //通过id查看${functionName}
    ${ClassName} findById(Integer id);

    //条件分页查询${functionName}列表
    PaginationResponse<${ClassName}> findList(QueryParam param);

    //通过id删除${functionName}信息
    int deleteById(Integer id);





}

serviceImpl.java.vm文件:

package classfile;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import util.Constants;
import util.GlobalException;
import util.PaginationResponse;
import util.QueryParam;
import java.util.List;
import model.${ClassName};

/**
 * ${functionName}Service业务层处理
 * @author zhang sq
 * @date ${date}
 */
@Service
public class ${ClassName}ServiceImpl implements ${ClassName}Service {
    
    private static Logger log=LoggerFactory.getLogger(${ClassName}ServiceImpl.class);
    
    @Autowired
    private ${ClassName}Mapper ${className}Mapper;

    //新增${functionName}
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insert(${ClassName} ${className}) {
        check${ClassName}(${className}, Constants.METHOD_ADD);
        int count = ${className}Mapper.insert(${className});
        log.info("新增${functionName}请求成功 ==>>返回结果 ==>>> {}",count);
        return count;
    }

    //修改${functionName}
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int update(${ClassName} ${className}) {
        check${ClassName}(${className}, Constants.METHOD_UPDATE);
        int count = ${className}Mapper.update(${className});
        log.info("修改${functionName}请求成功 ==>>返回结果 ==>>> {}",count);
        return count;
    }

    //通过id查看${functionName}
    @Override
    public ${ClassName} findById(Integer id) {
        log.info("进入通过id查看${functionName} ==>> 参数id为==>>> {}",id);
        check${ClassName}(id, Constants.METHOD_INFO);
        ${ClassName} ${className} = ${className}Mapper.findById(id);
        log.info("通过id查看${functionName}请求成功 ==>> 返回结果为==>>> {}",${className}==null? null:${className}.toString());
        return ${className};
    }

    //通过id删除${functionName}
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteById(Integer id) {
        log.info("进入通过id删除${functionName} ==>> 参数id为==>>> {}",id);
        check${ClassName}(id, Constants.METHOD_DEL);
        int count = ${className}Mapper.deleteById(id);
        log.info("通过id删除${functionName}请求成功 ==>> 返回结果为==>>> {}",count);
        return count;
    }

    //条件分页查询${functionName}
    @Override
    public PaginationResponse<${ClassName}> findList(QueryParam param) {
        check${ClassName}(param, Constants.METHOD_LIST);
        log.info("进入条件分页查询${functionName} ==>> 参数param为==>>> {}",param.toString());
        Page<Object> page = PageHelper.startPage(param.getPageNum(), param.getPageSize(), true);
        List<${ClassName}> ${className}List=${className}Mapper.findList(param);
        PaginationResponse<${ClassName}> response =
                PaginationResponse.getPagination(param, page.getTotal(), ${className}List, page.getPages());
        log.info("条件分页查询${functionName}请求成功 ==>> 返回结果为==>>> {}",response==null? null:response.toString());
        return response;
    }

    //根据请求类型效验参数
    private void check${ClassName}(QueryParam param, String type) {
        if(type.equals(Constants.METHOD_LIST)) { //查询列表

        }
    }

    //根据请求类型效验参数
    private void check${ClassName}(${ClassName} ${className}, String type) {
        if(${className}==null){
            throw new GlobalException(Constants.PARAM_ERROR,"${className}不能为空");
        }
        if(type.equals(Constants.METHOD_ADD)){ //新增
            log.info("进入新增${functionName} ==>> 参数${className}为==>>> {}",${className}.toString());
            if(StringUtils.isEmpty(${className}.getCreateUser())){
                throw new GlobalException(Constants.PARAM_ERROR,"创建人 createUser 不能为空");
            }
            if(StringUtils.isEmpty("12")){
                throw new GlobalException(Constants.PARAM_ERROR,"标题 title 不能为空");
            }
            log.info("新增${functionName}参数校验通过");
        }else if(type.equals(Constants.METHOD_UPDATE)){ //修改
            log.info("进入修改${functionName} ==>>参数${className}为==>>> {}",${className}.toString());
            if(StringUtils.isEmpty(${className}.getId())){
                throw new GlobalException(Constants.PARAM_ERROR,"主键 id 不能为空");
            }
            if(StringUtils.isEmpty(${className}.getUpdateUser())){
                throw new GlobalException(Constants.PARAM_ERROR,"修改人 updateUser 不能为空");
            }
            log.info("修改${functionName}参数校验通过");
        }
    }

    //根据请求类型效验参数
    private void check${ClassName}(Integer id, String type) {
        if(type.equals(Constants.METHOD_DEL)||type.equals(Constants.METHOD_INFO)) { //删除和查询单条
            if(id==null||id<=0){
                throw new GlobalException(Constants.PARAM_ERROR,"参数 id 不能为空或者小于0");
            }
        }
    }
    
}

注:如果报找不到vm模板文件,可能是加载路径不对,也可能是maven有缓存需要clean一下。

参照:

Velocity模板:Velocity官方指南-使用Velocity-阿里云开发者社区

使用mybatis-plus-generator进行代码自动生成

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loren_云淡风轻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值