cuiyi's blog(崔毅 crazycy)

          記錄點(diǎn)滴 鑒往事之得失 以資于發(fā)展

          導(dǎo)航

          我參與的團(tuán)隊(duì)

          隨筆分類

          相冊(cè)

          積分與排名

          • 積分 - 672407
          • 排名 - 70

          最新評(píng)論

          閱讀排行榜

          得到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)截取并獲得自己想要的東西,類似于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)閉打開的操作
          ????????????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)閉打開的操作
          ????????????MyDBUtil.close(conn,?pstmt);
          ????????}
          ????????
          return?isSuccess;
          ????}

          執(zhí)行查詢
          ?1?/**
          ?2??????*?執(zhí)行查詢數(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)閉打開的操作
          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 閱讀(46677) 評(píng)論(18)  編輯  收藏 所屬分類: JavaEE技術(shù)DBMS

          評(píng)論

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

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

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

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

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

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

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

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

          還以為不需要自己寫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類的實(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
          主站蜘蛛池模板: 古田县| 九龙坡区| 南木林县| 佛学| 常熟市| 宣恩县| 新巴尔虎左旗| 苗栗县| 永宁县| 青浦区| 那坡县| 五大连池市| 清徐县| 宜都市| 巴马| 景宁| 丰镇市| 大田县| 萨嘎县| 始兴县| 谢通门县| 中方县| 丹凤县| 丘北县| 叶城县| 朝阳区| 含山县| 台湾省| 类乌齐县| 靖远县| 萨嘎县| 杭锦旗| 怀来县| 洛浦县| 湖北省| 广河县| 武强县| 泰来县| 松溪县| 山东省| 保靖县|