<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    cuiyi's blog(崔毅 crazycy)

    記錄點滴 鑒往事之得失 以資于發(fā)展
    數(shù)據(jù)加載中……

    得到PrepareStatement最終執(zhí)行的sql語句的方法

    在CSDN的JAVA基礎(chǔ)版,常常有人問及如何得到PreparedStatement最終執(zhí)行的SQL語句;或者如何在控制臺輸出占位符的真實值.....

    原因就是PreparedStatement執(zhí)行的sql語句有大量的占位符?....

    問題諸如JDBC中:
    如何得到?conn.prepareStatement?最終執(zhí)行的sql語句。
    sql
    ="update?table1?set?a=?,b=?"
    stmt?
    =?con.prepareStatement(sql);
    stmt.setObjec?t(
    1,"a");
    stmt.setObjec?t(
    2,"b");

    希望可以通過stmt或者conn?得到:
    update?table1?set?a
    ='a',b='b'

    亦或Hibernate中
    如我執(zhí)行:find("select?*?from?t_table?where?id?=??",new?Integer(5));
    在控制臺顯示SQL時只顯示:select?
    *?from?t_table?where?id?=??
    如何才能做到將控制臺顯示的占位符用其真實的值來替換?
    即控制臺輸出時顯示:select?
    *?from?t_table?where?id?=?5

    無它,無論JDBC還是Hiberante都不提供默認(rèn)解決方案,但是參數(shù)是設(shè)置進(jìn)去的,我們在設(shè)置的過程中可以有充分的理由來截取并獲得自己想要的東西,類似于AOP理論。

    共享我在工程中的使用方法:
    插入操作:
    /**
    ?????*?執(zhí)行插入數(shù)據(jù)庫的語句
    ?????*?
    @param?sql
    ?????*?
    @param?params
    ?????*?
    @return?返回生成的主鍵
    ?????
    */
    ????
    public?int?executeInsert(String?sql,?Object[]?params)?{
    ????????Connection?conn?
    =?null;
    ????????PreparedStatement?pstmt?
    =?null;
    ????????ResultSet?rs?
    =?null;
    ????????
    try?{
    ????????????
    //1?獲得連接
    ????????????conn?=?MyDBConnection.getInstance().getConnection();
    ????????????
    //2?設(shè)置提交方式為程序控制
    ????????????conn.setAutoCommit(false);
    ????????????
    //3?獲得語句對象
    ????????????pstmt?=?conn.prepareStatement(sql,?Statement.RETURN_GENERATED_KEYS);
    ????????????
    //4?設(shè)置SQL語句的參數(shù)
    ????????????if?(null?!=?params?&&?0?<?params.length)?{
    ????????????????setParams(pstmt,?params);
    ????????????}
    ????????????
    //5?打印SQL語句
    ????????????if?(MyDBConstants.showSQL)?{
    ????????????????getPreparedSQL(sql,?params);
    ????????????}
    ????????????
    //6?執(zhí)行語句
    ????????????pstmt.executeUpdate();
    ????????????
    //7?程序提交
    ????????????conn.commit();
    ????????????
    //8?返回生成的主鍵
    ????????????rs?=?pstmt.getGeneratedKeys();
    ????????????
    int?generatedKey?=?0;
    ????????????
    if?(rs.next())?{
    ????????????????generatedKey?
    =?rs.getInt(1);
    ????????????}
    ????????????
    if?(0?<?generatedKey)
    ????????????????
    throw?new?MySQLException("插入記錄時出錯");
    ????????????
    return?generatedKey;
    ????????}?
    catch?(SQLException?e)?{
    ????????????
    //回滾
    ????????????MyDBUtil.rollBack(conn);
    ????????????
    throw?new?MySQLException(e);
    ????????}?
    finally?{
    ????????????
    //關(guān)閉打開的操作
    ????????????MyDBUtil.close(conn,?pstmt,?rs);
    ????????}
    ????}


    更新查找操作:
    /**
    ?????*?執(zhí)行更新或者刪除數(shù)據(jù)庫的語句
    ?????*?
    @param?sql
    ?????*?
    @param?params
    ?????*?
    @return?返回執(zhí)行成功與否
    ?????
    */
    ????
    public?boolean?executeUpdateDel(String?sql,?Object[]?params)?{
    ????????
    boolean?isSuccess?=?false;
    ????????Connection?conn?
    =?null;
    ????????PreparedStatement?pstmt?
    =?null;
    ????????
    try?{
    ????????????
    //1?獲得連接
    ????????????conn?=?MyDBConnection.getInstance().getConnection();
    ????????????
    //2?設(shè)置提交方式為程序控制
    ????????????conn.setAutoCommit(false);
    ????????????
    //3?獲得語句對象
    ????????????pstmt?=?conn.prepareStatement(sql);
    ????????????
    //4?設(shè)置SQL語句的參數(shù)
    ????????????if?(null?!=?params?&&?0?<?params.length)?{
    ????????????????setParams(pstmt,?params);
    ????????????}
    ????????????
    //5?打印SQL語句
    ????????????if?(MyDBConstants.showSQL)?{
    ????????????????getPreparedSQL(sql,?params);
    ????????????}
    ????????????
    //6?執(zhí)行語句
    ????????????pstmt.executeUpdate();
    ????????????
    //7?程序提交
    ????????????conn.commit();
    ????????????
    //8?設(shè)置語句執(zhí)行的標(biāo)記
    ????????????isSuccess?=?true;
    ????????}?
    catch?(SQLException?e)?{
    ????????????
    //回滾
    ????????????MyDBUtil.rollBack(conn);
    ????????????
    throw?new?MySQLException(e);
    ????????}?
    finally?{
    ????????????
    //關(guān)閉打開的操作
    ????????????MyDBUtil.close(conn,?pstmt);
    ????????}
    ????????
    return?isSuccess;
    ????}

    執(zhí)行查詢
    ?1?/**
    ?2??????*?執(zhí)行查詢數(shù)據(jù)庫的語句;
    ?9??????*
    10??????*?@return
    11??????*/
    12?????public?Object?executeQuery(String?sql,?Object[]?params)?{
    13?????????Connection?conn?=?null;
    14?????????PreparedStatement?pstmt?=?null;
    15?????????ResultSet?rs?=?null;
    16?????????try?{
    17?????????????//1?獲得連接
    18?????????????conn?=?MyDBConnection.getInstance().getConnection();
    19?????????????//2?設(shè)置提交方式為程序控制
    20?????????????conn.setAutoCommit(false);
    21?????????????//3?獲得語句對象
    22?????????????pstmt?=?conn.prepareStatement(sql,?ResultSet.TYPE_SCROLL_SENSITIVE,?ResultSet.CONCUR_UPDATABLE);
    23?????????????//4?設(shè)置SQL語句的參數(shù)
    24?????????????if?(null?!=?params?&&?0?<?params.length)?{
    25?????????????????setParams(pstmt,?params);
    26?????????????}
    27?????????????//5?打印SQL語句
    28?????????????if?(MyDBConstants.showSQL)?{
    29?????????????????getPreparedSQL(sql,?params);
    30?????????????}
    31?????????????//6?執(zhí)行語句
    32?????????????rs?=?pstmt.executeQuery();
    33?
    34?????????????//9?程序提交
    35?????????????conn.commit();
    36?
    37?????????????//10?獲得記錄
    38?????????????Object?vo?=?new?Object();
    39?????????????if?(null?!=?rs?&&?rs.next())?{
    40?????????????????vo?=?rs2vo(rs);
    41?????????????}
    42?//????????????return?results;
    43?????????????return?vo;
    44?????????}?catch?(SQLException?e)?{
    45?????????????//回滾
    46?????????????MyDBUtil.rollBack(conn);
    47?????????????throw?new?MySQLException(e);
    48?????????}?finally?{
    49?????????????//關(guān)閉打開的操作
    50?????????????MyDBUtil.close(conn,?pstmt,?rs);
    51?????????}
    52?????}

    看到getPreparedSQL(sql,?params)了么? 這個地方就是要實現(xiàn)我們預(yù)期效果的地方:
    得到PrepareStatement最終執(zhí)行的sql語句的方法

    然后輕松核實你的控制臺或者日志文件吧......

    posted on 2006-07-22 21:53 crazycy 閱讀(46678) 評論(18)  編輯  收藏 所屬分類: JavaEE技術(shù) 、DBMS

    評論

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    呵,不錯的方法。不過采用p6spy也是一個很好的選擇!
    2006-07-23 11:49 | 胡子魚

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    @胡子魚
    呵呵,多謝多謝;share一些摸索,可以換來更好的建議,高興一個.....
    p6sky?查查去
    2006-07-23 13:20 | crazycy

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    里面用到了自己寫的一些類,不具有通用功能.
    2006-07-24 15:02 | THEMAX

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    原來是需要自己寫的class,

    還以為不需要自己寫class,就可以搞定呢。。。
    2007-05-02 15:43 | ddd

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    遇到 INt型如何處理 存不進(jìn)這個Object[] params數(shù)組
    還想看看setParams(pstmt, params)這個函數(shù)
    2007-05-13 12:20 | 新手

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    int ==> Integer new Integer(int)
    2007-05-13 23:42 | crazycy

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    String sql = "SELECT 學(xué)號,姓名,班級,數(shù)學(xué),英語,JAVA,計算機導(dǎo)引,思想道德,馬克思主義 FROM Student1"+" WHERE 班級=?";
    PreparedStatement preSt = con.prepareStatement(sql);
    preSt.setString(1,ban);
    ResultSet rs1 = preSt.executeQuery();
    2007-12-25 15:51 | slang

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    還得把 int, double, long, float, boolean 變成對應(yīng)的 Object, 麻煩。
    2008-02-14 22:09 | fz_zhou

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    關(guān)注一下,有用到的時候回頭看看
    2008-03-11 12:03 | 隔葉黃鶯

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    why not just prepstmt.toString(), and grab the useful sql from it?
    2008-03-28 08:25 | Liang

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    The purpose of tracing prepared sql is to check the fields while doing insert, as you know, sometimes some filed would be "" or null while it isnot mandory in database, but should not be "" or null
    2008-03-31 22:05 | crazycy

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    請問主人,能不能個iekankanMyDBConnection類的實現(xiàn)呀,謝謝
    2009-05-31 09:05 | gousehng123

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    能不能提供下載呀...
    2009-06-25 11:29 | zstop

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法[未登錄]  回復(fù)  更多評論   

    gei ge yuanma kan kan a

    2012-01-06 16:42 | xxx

    # wrwe  回復(fù)  更多評論   

    sdasd
    2012-08-17 16:07 | adead

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    請問:方法里面的參數(shù)sql要怎么獲取得到?像insert,update,delete這種更新操作的sql語句, query語句的獲取我已經(jīng)實現(xiàn)了,我的博文地址: http://www.cnblogs.com/huangxiufen/p/3845288.html
    2014-07-29 15:46 | 大象與螞蟻

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    if (0 < generatedKey)
    throw new MySQLException("插入記錄時出錯");
    return generatedKey;

    //這里的 判斷gennerateKey 判斷會出現(xiàn)BUG
    應(yīng)該是
    if (generatedKey<0)
    throw new MySQLException("插入記錄時出錯");
    return generatedKey;
    2015-02-03 17:58 | #RES

    # re: 得到PrepareStatement最終執(zhí)行的sql語句的方法  回復(fù)  更多評論   

    @liang 說的有道理 為什么不適用tostring()?就是在設(shè)置好參數(shù)后,調(diào)用它
    2015-08-24 10:00 | angelmom
    主站蜘蛛池模板: 亚洲成av人片不卡无码久久| 国产极品粉嫩泬免费观看| 久久亚洲精品中文字幕| 精品无码无人网站免费视频 | 亚洲电影中文字幕| 99在线观看免费视频| 久久久久精品国产亚洲AV无码| 搡女人免费视频大全| 美女视频黄频a免费大全视频| 国产又大又黑又粗免费视频| h视频在线免费看| 偷自拍亚洲视频在线观看| 亚洲AV一宅男色影视| 亚洲人成网站免费播放| 麻豆一区二区三区蜜桃免费| 亚洲人成影院午夜网站| 亚洲综合色成在线播放| 曰批视频免费30分钟成人| 一级毛片成人免费看a| 亚洲精品在线播放| 亚洲日韩中文在线精品第一| 国产精品久久免费视频| 青青青青青青久久久免费观看| 中国一级毛片视频免费看| 在线aⅴ亚洲中文字幕| 亚洲精品乱码久久久久久按摩| 亚洲人成在线免费观看| 免费观看男人吊女人视频| 亚洲久热无码av中文字幕| 亚洲AV第一页国产精品| 最新国产AV无码专区亚洲| 成全视频免费高清| 国产精品视频免费一区二区| 91福利免费网站在线观看| 亚洲精品蜜夜内射| 亚洲精品在线免费观看视频| 精品无码一区二区三区亚洲桃色| 亚洲AV成人片色在线观看| 亚洲美女大bbbbbbbbb| 色久悠悠婷婷综合在线亚洲| 亚洲欧洲精品成人久久奇米网|