<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

    主站蜘蛛池模板: 久久香蕉国产线看免费| 中文字幕亚洲精品| 9久9久女女免费精品视频在线观看| 亚欧洲精品在线视频免费观看 | 国产成人无码免费看片软件| 亚洲日本久久久午夜精品| 亚洲韩国—中文字幕| 亚洲精品亚洲人成在线观看| 免费一级毛片在线观看 | 亚洲av无码一区二区三区在线播放 | 亚洲成AV人片一区二区| 亚洲国产精品成人一区| 亚洲国产成人综合| 亚洲欧洲国产精品香蕉网| 夜色阁亚洲一区二区三区| 国产美女无遮挡免费视频| 最新中文字幕免费视频| 无码精品A∨在线观看免费| 91成人在线免费视频| 十九岁在线观看免费完整版电影| 国产在线观看xxxx免费| 国产99视频精品免费视频76| 日韩a毛片免费观看| 免费看黄福利app导航看一下黄色录像| 亚洲精品日韩一区二区小说| 中文字幕亚洲情99在线| 国产精品亚洲自在线播放页码 | 最近免费中文字幕大全免费| 暖暖日本免费中文字幕| 无码人妻丰满熟妇区免费| 无码人妻久久一区二区三区免费| 四虎影视成人永久免费观看视频 | 日产国产精品亚洲系列| 免费a级毛片永久免费| 亚洲成aⅴ人片久青草影院| 亚洲国产成人久久一区WWW| 亚洲午夜国产片在线观看| 亚洲欧洲日产国码av系列天堂 | 免费视频精品一区二区三区 | 亚洲制服丝袜精品久久| 国产亚洲精aa在线看|