自定义校验器

ezasse只提供了一些基础的校验规则与校验关键字,如果这些校验关键字你不喜欢,或者觉得校验规则与现有的功能不匹配,你可以自行实现校验器,实现方式和方法也很简单

修改关键字

如果只是修改关键字,可以继承具体的校验器的实现,或者直接修改配置文件,下面演示修改默认执行器的关键字EXEC修改为IF

  1. 创建一个类EzasseDefaultChecker.java
  2. 继承DefaultKeyWordEzasseChecker并复写getId方法
package cn.com.pism.ezasse.demo.singledb.config;

import cn.com.pism.ezasse.checker.DefaultKeyWordEzasseChecker;
import cn.com.pism.ezasse.model.EzasseConfig;
import org.springframework.stereotype.Component;

/**
 * @author PerccyKing
 */
@Component
public class EzasseDefaultChecker extends DefaultKeyWordEzasseChecker {
    @Override
    public String getId(EzasseConfig config) {
        return "IF";
    }
}

  1. 修改后的语句将变为 -- IF(select 0)

完全定制

以下教程,将实现一个自定义校验器,校验关键字为 HAVE_TABLE,作用为当数据库中存在某一张表的时候,执行脚本

  1. 创建一个类 EzasseHaveTableChecker.java
  2. 继承EzasseChecker,复写所有的方法,以下是具体实现
package cn.com.pism.ezasse.demo.singledb.config;

import cn.com.pism.ezasse.checker.EzasseChecker;
import cn.com.pism.ezasse.executor.EzasseExecutor;
import cn.com.pism.ezasse.model.EzasseConfig;
import cn.com.pism.ezasse.model.EzasseTableInfo;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.sql.DataSource;
import java.util.List;

/**
 * 校验行语法:{@code -- HAVE_TABLE(table_name)}<br/>
 * 校验规则:当数据库中存在定义的表时,执行SQL
 *
 * @author PerccyKing
 */
@Component
public class EzasseHaveTableChecker extends EzasseChecker {
    @Override
    public boolean needToExecute(DataSource checkDataSource, String checkContent, EzasseExecutor executor) {
        //可以使用 publicCheck,当执行器与校验器不为空的时候,再执行校验逻辑,否则执行跳过校验行
        return publicCheck(checkContent, executor, () -> {
            //获取表的基本信息,如果响应结果不为空,表示可以执行SQL脚本
            List<EzasseTableInfo> tableInfo = executor.getTableInfo(checkContent);
            return !CollectionUtils.isEmpty(tableInfo);
        });
    }

    @Override
    public String getId(EzasseConfig config) {
        return "HAVE_TABLE";
    }
}

WARNING

关键字的定义需要遵循以下规则

  1. 关键字不宜过长,如果关键字定义与现存的关键字一样,则会覆盖现有的关键字
  2. 关键字中不能包含符号【.】
  1. 使用测试,在SQL脚本中添加以下脚本进行测试
-- 当表t_user存在时,清空表数据
-- HAVE_TABLE(t_user)
truncate table t_user;
Last Updated:
Contributors: PerccyKing