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

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

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

    love fish大鵬一曰同風起,扶搖直上九萬里

    常用鏈接

    統計

    積分與排名

    friends

    link

    最新評論

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

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

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

    問題諸如JDBC中:
    如何得到?conn.prepareStatement?最終執行的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中
    如我執行: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都不提供默認解決方案,但是參數是設置進去的,我們在設置的過程中可以有充分的理由來截取并獲得自己想要的東西,類似于AOP理論。

    共享我在工程中的使用方法:
    插入操作:
    /**
    ?????*?執行插入數據庫的語句
    ?????*?
    @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?設置提交方式為程序控制
    ????????????conn.setAutoCommit(false);
    ????????????
    //3?獲得語句對象
    ????????????pstmt?=?conn.prepareStatement(sql,?Statement.RETURN_GENERATED_KEYS);
    ????????????
    //4?設置SQL語句的參數
    ????????????if?(null?!=?params?&&?0?<?params.length)?{
    ????????????????setParams(pstmt,?params);
    ????????????}
    ????????????
    //5?打印SQL語句
    ????????????if?(MyDBConstants.showSQL)?{
    ????????????????getPreparedSQL(sql,?params);
    ????????????}
    ????????????
    //6?執行語句
    ????????????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?{
    ????????????
    //關閉打開的操作
    ????????????MyDBUtil.close(conn,?pstmt,?rs);
    ????????}
    ????}


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

    執行查詢
    ?1?/**
    ?2??????*?執行查詢數據庫的語句;
    ?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?設置提交方式為程序控制
    20?????????????conn.setAutoCommit(false);
    21?????????????//3?獲得語句對象
    22?????????????pstmt?=?conn.prepareStatement(sql,?ResultSet.TYPE_SCROLL_SENSITIVE,?ResultSet.CONCUR_UPDATABLE);
    23?????????????//4?設置SQL語句的參數
    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?執行語句
    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?????????????//關閉打開的操作
    50?????????????MyDBUtil.close(conn,?pstmt,?rs);
    51?????????}
    52?????}

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

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

    posted on 2006-07-24 16:22 liaojiyong 閱讀(2014) 評論(0)  編輯  收藏 所屬分類: DBMixture

    主站蜘蛛池模板: 亚洲w码欧洲s码免费| 亚欧免费一级毛片| 国产hs免费高清在线观看| 亚洲xxxxxx| 成人免费视频小说| 亚洲乱亚洲乱妇无码| 国产传媒在线观看视频免费观看| 蜜桃传媒一区二区亚洲AV| 国产一区二区三区免费在线观看| 国产精品亚洲一区二区三区在线观看 | 亚洲福利一区二区精品秒拍| 1000部夫妻午夜免费| 亚洲依依成人精品| 免费观看的毛片手机视频| 色偷偷亚洲第一综合网| 国产精品亚洲精品日韩已方 | 亚洲国产精品成人精品小说| 精品熟女少妇AV免费观看| 激情婷婷成人亚洲综合| 国产精品亚洲mnbav网站| 国产精品免费一区二区三区四区| 337p日本欧洲亚洲大胆色噜噜| 中文字幕av无码无卡免费| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 一二三四免费观看在线电影| 日韩色视频一区二区三区亚洲| 亚洲精品国产高清嫩草影院| 另类免费视频一区二区在线观看| 亚洲欧洲自拍拍偷综合| 国产免费人人看大香伊| 国产一区二区三区免费观在线| 亚洲视频免费一区| 国产大片51精品免费观看| 日本免费在线中文字幕| 国产午夜亚洲精品| 亚洲中文字幕在线乱码| 免费看黄视频网站| 97超高清在线观看免费视频| 天天爽亚洲中文字幕| 亚洲色爱图小说专区| 欧洲黑大粗无码免费|