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

com.loocme.sys.util.SqlUtil Maven / Gradle / Ivy

package com.loocme.sys.util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import com.loocme.sys.constance.RegConst;

/**
 * sql语句帮助类
 * 
 * @author loocme
 * 
 */
public class SqlUtil
{

    /**
     * 获取需要执行的sql语句
     * 
     * @param sql
     *            原始sql语句
     * @param params
     *            参数键值对
     * @return 可执行的sql语句
     */
    public static String getPstmtSql(String sql, Map params)
    {
        return getPstmtSql(sql, params, null);
    }

    /**
     * 获取预编译sql语句及参数的值
     * 
     * @param sql
     *            原始sql语句
     * @param params
     *            参数-值
     * @param pstmtParams
     *            转换后的预编译参数的值(顺序与预编译对应)
     * @return 预编译的sql语句
     */
    public static String getPstmtSql(String sql, Map params,
            List pstmtParams)
    {
        String retSql = sql;
        if (null != pstmtParams)
        {
            pstmtParams.clear();

            // 将where条件中的查询参数替换为?并记录相应的变量值
            String[] matches = PatternUtil.getMatch(sql,
                    RegConst.SQL_WHERE_PARAM, Pattern.CASE_INSENSITIVE);
            while (null != matches)
            {
                retSql = retSql.replaceFirst(matches[0].replaceAll("(\\(|\\?|\\))", "\\\\$1"), matches[1] + matches[2]
                        + matches[4]);
                pstmtParams.add(params.get(matches[3]));

                matches = PatternUtil.getMatch(retSql, RegConst.SQL_WHERE_PARAM,
                        Pattern.CASE_INSENSITIVE);
            }
        }

        // 将where条件之外的变量直接替换
        Iterator it = params.keySet().iterator();
        while (it.hasNext())
        {
            String key = it.next();
            retSql = retSql.replaceAll("([=\\s(']):" + key + "([\\s,)'])", "$1"
                    + params.get(key) + "$2");
        }

        return retSql;
    }

    /**
     * 获取需要执行的sql语句
     * 
     * @param sql
     *            原始sql语句
     * @param paramNames
     *            参数名数组
     * @param paramValues
     *            参数值数组
     * @return 可执行的sql语句
     */
    public static String getPstmtSql(String sql, String[] paramNames,
            Object[] paramValues)
    {
        return getPstmtSql(sql, paramNames, paramValues, null);
    }

    /**
     * 获取预编译sql语句及参数的值
     * 
     * @param sql
     *            原始sql语句
     * @param paramNames
     *            参数名数组
     * @param paramValues
     *            参数值数组
     * @param pstmtParams
     *            转换后的预编译参数的值(顺序与预编译对应)
     * @return 预编译的sql语句
     */
    public static String getPstmtSql(String sql, String[] paramNames,
            Object[] paramValues, List pstmtParams)
    {
        Map params = new HashMap(16);
        if (ArrayUtil.isNotNull(paramNames))
        {
            for (int i = 0; i < paramNames.length; i++)
            {
                params.put(paramNames[i], paramValues[i]);
            }
        }

        return getPstmtSql(sql, params, pstmtParams);
    }
}