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

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

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

    love fish大鵬一曰同風(fēng)起,扶搖直上九萬里

    常用鏈接

    統(tǒng)計

    積分與排名

    friends

    link

    最新評論

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

    ?
    在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-24 16:22 liaojiyong 閱讀(2014) 評論(0)  編輯  收藏 所屬分類: DBMixture

    主站蜘蛛池模板: 亚洲精品无码99在线观看| 国产乱子伦精品免费女| 亚洲AV无码国产在丝袜线观看| 一本久久免费视频| 国产免费久久精品| 免费人成动漫在线播放r18| 国产一区二区三区无码免费| 另类图片亚洲校园小说区| 免费人成年激情视频在线观看| 国产精品亚洲综合天堂夜夜| 亚洲 综合 国产 欧洲 丝袜| 国产精品内射视频免费| 国产AV无码专区亚洲AV毛网站| 午夜免费啪视频在线观看| 亚洲欧洲自拍拍偷综合| 女人18毛片a级毛片免费| 免费播放美女一级毛片| 中文字幕精品无码亚洲字| 久久精品私人影院免费看| 亚洲av乱码一区二区三区香蕉| 日本高清免费aaaaa大片视频| 午夜在线免费视频 | 亚洲VA中文字幕不卡无码| 无码人妻精品中文字幕免费 | 国产精品免费看香蕉| jizz在线免费播放| 亚洲国产人成在线观看69网站 | 亚洲国产综合第一精品小说| 四虎在线免费播放| 久久精品成人免费观看97| 亚洲美女精品视频| 日韩一区二区在线免费观看| 国产精品美女久久久免费| 亚洲网红精品大秀在线观看| 波多野结衣久久高清免费 | 国产黄片不卡免费| 亚洲码在线中文在线观看| 成人国产mv免费视频| 久久国产乱子伦精品免费一 | 美女视频黄免费亚洲| 亚洲无码高清在线观看|