这期内容当中小编将会给大家带来有关SQL语句怎么利用PrepareStatement方法进行打印,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
方法如下:
首先,我们看看典型的一个 PrepareStatement 调用方法,如下一个函数,
/**
* 查询单个结果,保存为 Map<String, Object> 结构。如果查询不到任何数据返回 null。
*
* @param conn
* 数据库连接对象
* @param sql
* SQL 语句,可以带有 ? 的占位符
* @param params
* 插入到 SQL 中的参数,可单个可多个可不填
* @return Map<String, Object> 结构的结果。如果查询不到任何数据返回 null。
*/
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 函数源码如下:
/**
* 在开发过程,SQL语句有可能写错,如果能把运行时出错的 SQL 语句直接打印出来,那对排错非常方便,因为其可以直接拷贝到数据库客户端进行调试。
*
* @param sql
* SQL 语句,可以带有 ? 的占位符
* @param params
* 插入到 SQL 中的参数,可单个可多个可不填
* @return 实际 sql 语句
*/
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;
}
/**
* ? 和参数的实际个数是否匹配
*
* @param sql
* SQL 语句,可以带有 ? 的占位符
* @param params
* 插入到 SQL 中的参数,可单个可多个可不填
* @return true 表示为 ? 和参数的实际个数匹配
*/
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方法进行打印了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。