第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何獲取PreparedStatement的SQL?

如何獲取PreparedStatement的SQL?

收到一只叮咚 2019-07-26 17:03:33
如何獲取PreparedStatement的SQL?我有一個(gè)通用的Java方法,具有以下方法簽名:private static ResultSet runSQLResultSet(String sql, Object... queryParams)它打開(kāi)一個(gè)連接,PreparedStatement使用sql語(yǔ)句和queryParams變量長(zhǎng)度數(shù)組中的參數(shù)構(gòu)建一個(gè),運(yùn)行它,緩存ResultSet(在a中CachedRowSetImpl),關(guān)閉連接,并返回緩存的結(jié)果集。我在記錄錯(cuò)誤的方法中有異常處理。我將sql語(yǔ)句記錄為日志的一部分,因?yàn)樗鼘?duì)調(diào)試很有幫助。我的問(wèn)題是記錄String變量會(huì)sql使用?而不是實(shí)際值記錄模板語(yǔ)句。我想記錄已執(zhí)行(或嘗試執(zhí)行)的實(shí)際語(yǔ)句。那么......有沒(méi)有辦法獲得將由a運(yùn)行的實(shí)際SQL語(yǔ)句PreparedStatement?(沒(méi)有自己構(gòu)建它。如果我找不到訪問(wèn)PreparedStatement'sSQL的方法,我可能最終會(huì)自己構(gòu)建它c(diǎn)atch。)
查看完整描述

3 回答

?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

使用預(yù)準(zhǔn)備語(yǔ)句,沒(méi)有“SQL查詢(xún)”:

  • 您有一個(gè)包含占位符的聲明

    • 它被發(fā)送到DB服務(wù)器

    • 并在那里準(zhǔn)備

    • 這意味著SQL語(yǔ)句被“分析”,解析,表示它的一些數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中準(zhǔn)備

  • 然后,你已經(jīng)綁定了變量

    • 它們被發(fā)送到服務(wù)器

    • 并執(zhí)行準(zhǔn)備好的聲明 - 處理這些數(shù)據(jù)

但是沒(méi)有重構(gòu)真正的實(shí)際SQL查詢(xún) - 既不在Java端,也不在數(shù)據(jù)庫(kù)端。

因此,沒(méi)有辦法獲得準(zhǔn)備好的語(yǔ)句的SQL - 因?yàn)闆](méi)有這樣的SQL。


出于調(diào)試目的,解決方案要么:

  • 使用占位符和數(shù)據(jù)列表輸出語(yǔ)句的代碼

  • 或者“手動(dòng)”“構(gòu)建”一些SQL查詢(xún)。


查看完整回答
反對(duì) 回復(fù) 2019-07-26
?
幕布斯6054654

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊

它在JDBC API合同中沒(méi)有任何定義,但是如果你很幸運(yùn),有問(wèn)題的JDBC驅(qū)動(dòng)程序可以通過(guò)調(diào)用返回完整的SQL PreparedStatement#toString()。即

System.out.println(preparedStatement);

至少M(fèi)ySQL 5.x和PostgreSQL 8.x JDBC驅(qū)動(dòng)程序支持它。但是,大多數(shù)其他JDBC驅(qū)動(dòng)程序不支持它。如果你有這樣的,那么你最好的選擇是使用Log4jdbcP6Spy。

或者,您也可以編寫(xiě)一個(gè)泛型函數(shù),它接受一個(gè)ConnectionSQL字符串和語(yǔ)句值,并PreparedStatement在記錄SQL字符串和值后返回一個(gè)。開(kāi)球示例:

public static PreparedStatement prepareStatement(Connection connection, String sql, Object... values) throws SQLException {
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
    logger.debug(sql + " " + Arrays.asList(values));
    return preparedStatement;}

并用它作為

try {
    connection = database.getConnection();
    preparedStatement = prepareStatement(connection, SQL, values);
    resultSet = preparedStatement.executeQuery();
    // ...

另一個(gè)替代方法是實(shí)現(xiàn)一個(gè)自定義PreparedStatement,它包裝(修飾)構(gòu)造中的實(shí)際 PreparedStatement內(nèi)容并覆蓋所有方法,以便它調(diào)用真實(shí) 的方法PreparedStatement并收集所有setXXX()方法中的值,并且懶惰地構(gòu)造“實(shí)際”SQL字符串,只要其中一個(gè)executeXXX()調(diào)用這些方法(非常有用,但是大多數(shù)IDE為裝飾器方法提供了自動(dòng)生成器,Eclipse確實(shí)如此)。最后只需使用它。這也基本上是P6Spy和配件已經(jīng)在引擎蓋下做的事情。


查看完整回答
反對(duì) 回復(fù) 2019-07-26
?
開(kāi)心每一天1111

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊

我正在使用帶有MySQL連接器v.5.1.31的Java 8,JDBC驅(qū)動(dòng)程序。

我可以使用此方法獲得真正的SQL字符串:

// 1. make connection somehow, it's conn variable// 2. make prepered statement templatePreparedStatement stmt = conn.prepareStatement(
    "INSERT INTO oc_manufacturer" +
    " SET" +
    " manufacturer_id = ?," +
    " name = ?," +
    " sort_order=0;");// 3. fill templatestmt.setInt(1, 23);stmt.setString(2, 'Google');// 4. print sql stringSystem.out.println(((JDBC4PreparedStatement)stmt).asSql());

所以它返回像這樣的smth:

INSERT INTO oc_manufacturer SET manufacturer_id = 23, name = 'Google', sort_order=0;


查看完整回答
反對(duì) 回復(fù) 2019-07-26
  • 3 回答
  • 0 關(guān)注
  • 4093 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)