這期內容當中小編將會給大家帶來有關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方法進行打印了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。