jdbc PrepareStatement 控制台打印组装后的 SQL

import java.sql.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @describe jdbc  PrepareStatement  控制台打印组装后的 SQL
 */
public class PrintSql {
    public static String printRealSql(String sql, Object[] params) {
        if(params == null || params.length == 0) {
            System.out.println("the SQL is------------>\n" + sql);;
            return sql;
        }

        if (!match(sql, params)) {
            System.out.println("SQL 语句中的占位符与参数个数不匹配。SQL:" + sql);;
            return null;
        }

        int cols = params.length;
        Object[] values = new Object[cols];
        System.arraycopy(params, 0, values, 0, cols);

        for (int i = 0; i < cols; i++) {
            Object value = values[i];
            if (value instanceof Date) {
                values[i] = "'" + value + "'";
            } else if (value instanceof String) {
                values[i] = "'" + value + "'";
            } else if (value instanceof Boolean) {
                values[i] = (Boolean) value ? 1 : 0;
            }
        }

        String statement = String.format(sql.replaceAll("\\?", "%s"), values);

        System.out.println("The SQL is------------>\n" + statement);;

        return statement;
    }

    private static boolean match(String sql, Object[] params) {
        if(params == null || params.length == 0) {
            return true; // 没有参数,完整输出
        }

        Matcher m = Pattern.compile("(\\?)").matcher(sql);
        int count = 0;
        while (m.find()) {
            count++;
        }

        return count == params.length;
    }

}

 

posted @ 2023-05-24 16:17  岁月记忆  阅读(267)  评论(0)    收藏  举报