本文整理自网络,侵删。
前言
本文主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:
我们知道,JDBC 的 PrepareStatement 优点多多,通常都是推荐使用 PrepareStatement 而不是其基类 Statment。PrepareStatement 支持 ? 占位符,可以将参数按照类型转自动换为真实的值。既然这一过程是自动的,封装在 JDBC 内部的,那么我们外部就不得而知目标的 SQL 最终生成怎么样——于是在调试过程中便有一个打印 SQL 的问题。我们对 PrepareStatement 传入 SQL 语句,如 SELECT * FROM table WHERE id = ?,然后我们传入对应的 id 参数,假设是 id = 10,那怎么把得到参数的 SELECT * FROM table WHERE id = 12 结果完整地得出来呢?——这便是本文所要探讨的问题。下面话不多说了,来一起看看详细的介绍:
方法如下:
首先,我们看看典型的一个 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
的结果。
相关阅读 >>
更多相关阅读请进入《sql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。