为了能到远方,脚下的每一步都不能少.|

岁月记忆

园龄:3年8个月粉丝:2关注:3

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;
    }

}
复制代码

 

本文作者:岁月记忆

本文链接:https://www.cnblogs.com/huang2979127746/p/17428676.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   岁月记忆  阅读(260)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起