這期內容當中小編將會給大家帶來有關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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。