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

cn.org.atool.fluent.mybatis.utility.CustomizedSql Maven / Gradle / Ivy

package cn.org.atool.fluent.mybatis.utility;

import cn.org.atool.fluent.mybatis.segment.model.Parameters;

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

import static cn.org.atool.fluent.mybatis.mapper.StrConstant.*;
import static cn.org.atool.fluent.mybatis.utility.MybatisUtil.isSpace;
import static java.lang.Math.min;

/**
 * 完整自定义的sql语句解析重写工具类
 *
 * @author wudarui
 */
public class CustomizedSql {
    static List parse(String sql) {
        List list = new ArrayList<>();
        int index = 0;
        while (index < sql.length()) {
            int start = getStart(sql, index);
            if (start == -1) {
                list.add(sql.substring(index));
                break;
            } else {
                list.add(sql.substring(index, start));
            }
            int end = sql.indexOf(RIGHT_CURLY_BRACKET, start);
            if (end == -1) {
                throw new RuntimeException("illegal sql, starts '#{' or '${' in[" + start + "], but '}' not found. sql:" + sql);
            }
            String variable = sql.substring(start, end + 1);
            list.add(variable);
            index = end + 1;
        }
        return list;
    }

    private static int getStart(String sql, int index) {
        int start1 = sql.indexOf(HASH_MARK_LEFT_CURLY, index);
        int start2 = sql.indexOf(DOLLAR_LEFT_CURLY, index);
        if (start1 == -1) {
            return start2;
        } else if (start2 == -1) {
            return start1;
        } else {
            return min(start1, start2);
        }
    }

    /**
     * 对自定义的sql中的#{var}和${var}按照ew变量(#{ew.parameters...var})进行重写
     *
     * @param sql        sql
     * @param parameters Parameters
     * @param variable   parameter of sql
     * @return rewrite sql
     */
    public static String rewriteSql(String sql, Parameters parameters, Object variable) {
        String prefix = getVarName(parameters.putParameter(null, variable));
        List segments = parse(sql);
        StringBuilder buff = new StringBuilder();
        for (String segment : segments) {
            if (segment.startsWith(HASH_MARK_LEFT_CURLY) && segment.endsWith(RIGHT_CURLY_BRACKET)) {
                variable = renameVariable(prefix, getVarName(segment));
                buff.append(HASH_MARK_LEFT_CURLY).append(variable).append(RIGHT_CURLY_BRACKET);
            } else if (segment.startsWith(DOLLAR_LEFT_CURLY) && segment.endsWith(RIGHT_CURLY_BRACKET)) {
                variable = renameVariable(prefix, getVarName(segment));
                buff.append(DOLLAR_LEFT_CURLY).append(variable).append(RIGHT_CURLY_BRACKET);
            } else {
                buff.append(segment);
            }
        }
        return buff.toString();
    }

    /**
     * 去掉${var}或#{var}格式化符号后的var名称
     *
     * @param variable variable
     * @return name of var
     */
    private static String getVarName(String variable) {
        return variable.substring(2, variable.length() - 1).trim();
    }

    public static String renameVariable(String prefix, String variable) {
        if (variable.equals(STR_VALUE)) {
            return prefix;
        }
        if (variable.startsWith(STR_VALUE)) {
            char ch = variable.charAt(5);
            if (isSpace(ch) || ch == '[' || ch == ',') {
                return prefix + variable.substring(5);
            }
        }
        return prefix + '.' + variable;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy