All Downloads are FREE. Search and download functionalities are using the official Maven repository.

top.zeimao77.product.sql.AbstractStatementParamResolver Maven / Gradle / Ivy

package top.zeimao77.product.sql;

import top.zeimao77.product.util.AssertUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * JDBC参数解析器
 */
public abstract class AbstractStatementParamResolver implements StatementParamResolver {

    /**
     * sqlt 源SQL
     * sql 解析后的SQL 预处理的值使用 ? 点位;
     */
    protected String sqlt,sql;
    /**
     * 存储JDBC参数列表
     */
    protected List statementParams;
    private static final Pattern PATTERN = Pattern.compile("[$|#]\\{([,=\\w]+)\\}");

    /**
     * 解析的基础方法
     * @param fun JDBC参数值的解析策略函数
     */
    public void resolve(Function fun) {
        statementParams = new ArrayList<>(16);
        Matcher matcher = PATTERN.matcher(sqlt);
        int paramIndex = 0,flag = 0;
        if(!matcher.find()) {
            sql = sqlt;
            return;
        }
        StringBuilder sqlBuilder = new StringBuilder(sqlt.length());
        do {
            String group = matcher.group(1);
            sqlBuilder.append(sqlt, flag, matcher.start());
            flag = matcher.end();
            if(sqlt.charAt(matcher.start())== '$') {
                Object o = fun.apply(group);
                AssertUtil.notEmpty(o,String.format("参数 %s 必需",group));
                sqlBuilder.append(o.toString());
            } else {
                sqlBuilder.append("?");
                StatementParameter build = StatementParameter.Builder.create(group).index(++paramIndex).build();
                if(build.getMode() == 1) {
                    Object o = fun.apply(build.getName());
                    build.setValue(o);
                    if (build.getJavaType() == null && o != null) {
                        build.setJavaType(o.getClass());
                    }
                }
                statementParams.add(build);
            }
        } while (matcher.find());
        sqlBuilder.append(sqlt,flag,sqlt.length());
        sql = sqlBuilder.toString();
    }

    @Override
    public List getStatementParams() {
        return statementParams;
    }

    @Override
    public String getSql() {
        return sql;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy