<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 閱讀(2022) 評論(0)  編輯  收藏 所屬分類: DBMixture

    主站蜘蛛池模板: 国产一卡二卡3卡四卡免费 | 国产在线19禁免费观看| 久久99亚洲网美利坚合众国| 免费国产在线视频| 国产精一品亚洲二区在线播放| 国产精品免费视频观看拍拍| 亚洲精品无码Av人在线观看国产| 最近中文字幕大全免费版在线| 亚洲AV中文无码乱人伦下载| 国产成人久久AV免费| 亚洲黄色在线观看| 免费a级毛片高清视频不卡 | 性做久久久久久久免费看| 亚洲免费一级视频| 成年性生交大片免费看| 色欲色欲天天天www亚洲伊| 亚洲AV无码一区二三区| 国产真人无码作爱免费视频| 中文字幕av无码无卡免费| 亚洲国产精品综合福利专区| 亚洲成在人线aⅴ免费毛片| 亚洲国产精品嫩草影院| 亚洲国产高清精品线久久| 久久久久久av无码免费看大片 | 亚洲国产小视频精品久久久三级| a高清免费毛片久久| 香蕉视频在线观看亚洲| 黄+色+性+人免费| 午夜亚洲国产理论片二级港台二级| 亚洲精品tv久久久久| 久久一区二区三区免费播放 | 亚洲一区精品视频在线| 又粗又硬免费毛片| 久久精品无码精品免费专区| 国产精品高清视亚洲一区二区| 亚洲国产成人久久综合一区77| 国产激情免费视频在线观看 | 亚洲午夜福利在线视频| 中文字幕亚洲一区二区va在线| 1000部国产成人免费视频| 无码亚洲成a人在线观看|