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

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

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

    cuiyi's blog(崔毅 crazycy)

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

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

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

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

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

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

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

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

    共享我在工程中的使用方法:
    插入操作:
    /**
    ?????*?執(zhí)行插入數(shù)據(jù)庫(kù)的語(yǔ)句
    ?????*?
    @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?獲得語(yǔ)句對(duì)象
    ????????????pstmt?=?conn.prepareStatement(sql,?Statement.RETURN_GENERATED_KEYS);
    ????????????
    //4?設(shè)置SQL語(yǔ)句的參數(shù)
    ????????????if?(null?!=?params?&&?0?<?params.length)?{
    ????????????????setParams(pstmt,?params);
    ????????????}
    ????????????
    //5?打印SQL語(yǔ)句
    ????????????if?(MyDBConstants.showSQL)?{
    ????????????????getPreparedSQL(sql,?params);
    ????????????}
    ????????????
    //6?執(zhí)行語(yǔ)句
    ????????????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("插入記錄時(shí)出錯(cuò)");
    ????????????
    return?generatedKey;
    ????????}?
    catch?(SQLException?e)?{
    ????????????
    //回滾
    ????????????MyDBUtil.rollBack(conn);
    ????????????
    throw?new?MySQLException(e);
    ????????}?
    finally?{
    ????????????
    //關(guān)閉打開(kāi)的操作
    ????????????MyDBUtil.close(conn,?pstmt,?rs);
    ????????}
    ????}


    更新查找操作:
    /**
    ?????*?執(zhí)行更新或者刪除數(shù)據(jù)庫(kù)的語(yǔ)句
    ?????*?
    @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?獲得語(yǔ)句對(duì)象
    ????????????pstmt?=?conn.prepareStatement(sql);
    ????????????
    //4?設(shè)置SQL語(yǔ)句的參數(shù)
    ????????????if?(null?!=?params?&&?0?<?params.length)?{
    ????????????????setParams(pstmt,?params);
    ????????????}
    ????????????
    //5?打印SQL語(yǔ)句
    ????????????if?(MyDBConstants.showSQL)?{
    ????????????????getPreparedSQL(sql,?params);
    ????????????}
    ????????????
    //6?執(zhí)行語(yǔ)句
    ????????????pstmt.executeUpdate();
    ????????????
    //7?程序提交
    ????????????conn.commit();
    ????????????
    //8?設(shè)置語(yǔ)句執(zhí)行的標(biāo)記
    ????????????isSuccess?=?true;
    ????????}?
    catch?(SQLException?e)?{
    ????????????
    //回滾
    ????????????MyDBUtil.rollBack(conn);
    ????????????
    throw?new?MySQLException(e);
    ????????}?
    finally?{
    ????????????
    //關(guān)閉打開(kāi)的操作
    ????????????MyDBUtil.close(conn,?pstmt);
    ????????}
    ????????
    return?isSuccess;
    ????}

    執(zhí)行查詢(xún)
    ?1?/**
    ?2??????*?執(zhí)行查詢(xún)數(shù)據(jù)庫(kù)的語(yǔ)句;
    ?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?獲得語(yǔ)句對(duì)象
    22?????????????pstmt?=?conn.prepareStatement(sql,?ResultSet.TYPE_SCROLL_SENSITIVE,?ResultSet.CONCUR_UPDATABLE);
    23?????????????//4?設(shè)置SQL語(yǔ)句的參數(shù)
    24?????????????if?(null?!=?params?&&?0?<?params.length)?{
    25?????????????????setParams(pstmt,?params);
    26?????????????}
    27?????????????//5?打印SQL語(yǔ)句
    28?????????????if?(MyDBConstants.showSQL)?{
    29?????????????????getPreparedSQL(sql,?params);
    30?????????????}
    31?????????????//6?執(zhí)行語(yǔ)句
    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)閉打開(kāi)的操作
    50?????????????MyDBUtil.close(conn,?pstmt,?rs);
    51?????????}
    52?????}

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

    然后輕松核實(shí)你的控制臺(tái)或者日志文件吧......

    posted on 2006-07-22 21:53 crazycy 閱讀(46657) 評(píng)論(18)  編輯  收藏 所屬分類(lèi): JavaEE技術(shù)DBMS

    評(píng)論

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

    呵,不錯(cuò)的方法。不過(guò)采用p6spy也是一個(gè)很好的選擇!
    2006-07-23 11:49 | 胡子魚(yú)

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

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

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

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

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

    原來(lái)是需要自己寫(xiě)的class,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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語(yǔ)句的方法  回復(fù)  更多評(píng)論   

    請(qǐng)問(wèn)主人,能不能個(gè)iekankanMyDBConnection類(lèi)的實(shí)現(xiàn)呀,謝謝
    2009-05-31 09:05 | gousehng123

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

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

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

    gei ge yuanma kan kan a

    2012-01-06 16:42 | xxx

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

    sdasd
    2012-08-17 16:07 | adead

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

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

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

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

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

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

    @liang 說(shuō)的有道理 為什么不適用tostring()?就是在設(shè)置好參數(shù)后,調(diào)用它
    2015-08-24 10:00 | angelmom
    主站蜘蛛池模板: 日日夜夜精品免费视频| 99国产精品永久免费视频| 久久这里只精品99re免费| 99精品免费观看| 免费在线看v网址| 四虎成人精品在永久免费| 国产亚洲精品成人AA片新蒲金| 亚洲AV日韩AV鸥美在线观看| 亚洲国产品综合人成综合网站| 亚洲欧美日韩中文字幕一区二区三区| 美女被吸屁股免费网站| 人妻在线日韩免费视频| 男女超爽刺激视频免费播放| 无码专区一va亚洲v专区在线| 国产AV无码专区亚洲精品| 亚洲国产品综合人成综合网站| 理论亚洲区美一区二区三区| 91成人免费观看在线观看| 免费A级毛片无码A∨免费| 曰皮全部过程视频免费国产30分钟| 亚洲情a成黄在线观看| 亚洲美女视频一区| 理论片在线观看免费| 热re99久久6国产精品免费| 精品国产免费观看一区| 亚洲精品制服丝袜四区| 国产成人精品日本亚洲专区6| 国产乱子伦精品免费视频| 色片在线免费观看| 亚洲精品网站在线观看不卡无广告 | 国产高清免费在线| 久久精品国产亚洲一区二区| 亚洲 日韩 色 图网站| 国产裸体美女永久免费无遮挡| 91在线视频免费看| 亚洲人精品午夜射精日韩| 麻豆狠色伊人亚洲综合网站| 中文字幕一区二区三区免费视频 | 亚洲视频免费观看| 亚洲日本中文字幕一区二区三区| 亚洲第一页中文字幕|