溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL語句怎么利用PrepareStatement方法進行打印

發布時間:2020-11-27 15:47:55 來源:億速云 閱讀:1632 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關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方法進行打印了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女