这期内容当中小编将会给大家带来有关SQL语句怎么利用PrepareStatement方法进行打印,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
方法如下:
首先,我们看看典型的一个 PrepareStatement 调用方法,如下一个函数,
public static Map<String, Object> query(Connection conn, String sql, Object... params) { Map<String, Object> map = null; printRealSql(sql, params); // 打印真实 SQL 的函数 try (PreparedStatement ps = conn.prepareStatement(sql);) { if(params != null) for (int i = 0; i < params.length; i++) ps.setObject(i + 1, params[i]); try (ResultSet rs = ps.executeQuery();) { if (rs.isBeforeFirst()) { map = getResultMap(rs); } else { LOGGER.info("查询 SQL:{0} 没有符合的记录!", sql); } } } catch (SQLException e) { LOGGER.warning(e); } return map; }
值得注意该函数里面:
printRealSql(sql, params); // 打印真实 SQL 的函数
其参数一 sql 就是类似 SELECT * FROM table WHERE id = ?
的语句,参数二 params 为 Object... params 的参数列表,可以是任意类似的合法 SQL 值。最后,通过 printRealSql 函数最终得出形如 SELECT * FROM table WHERE id = 12
的结果。
printRealSql 函数源码如下:
public static String printRealSql(String sql, Object[] params) { if(params == null || params.length == 0) { LOGGER.info("The SQL is------------>\n" + sql); return sql; } if (!match(sql, params)) { LOGGER.info("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); LOGGER.info("The SQL is------------>\n" + statement); ConnectionMgr.addSql(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; }
上述就是小编为大家分享的SQL语句怎么利用PrepareStatement方法进行打印了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。