Oo ' Smiling on Java ' oO

          從夢里回來,依然記得夢里有你...

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            8 隨筆 :: 0 文章 :: 10 評論 :: 0 Trackbacks

          ??????這兩天在回來寫一些業(yè)務(wù)代碼的時(shí)候,發(fā)現(xiàn)需要一個(gè)需要獲得表的記錄數(shù),其實(shí)可以通過循環(huán)獲得,不過,那也是實(shí)在效率低的可憐。因?yàn)橹皼]有用過,現(xiàn)在用起來,還真是有點(diǎn)小問題,起初使用JDBC,都是使用 預(yù)編譯方式PreparedStatement執(zhí)行SQL語句的,發(fā)現(xiàn)rs.last()不能用,那當(dāng)然rs.getRow()也得不到數(shù)據(jù)記錄數(shù)啦。然后問了朋友半天,發(fā)現(xiàn)還有個(gè) Statement ,蠻好用的,實(shí)現(xiàn)對數(shù)據(jù)庫的一般查詢。
          ????? 一、不帶參的:
          ??????Statement stmt=con.createStatement();
          ??????ResultSet rs=stmt.executeQuery("select * from DBTableName");?
          ????? 以上這種方式是可行的,但是就需要獲得記錄數(shù)來說,這個(gè)實(shí)現(xiàn)起來恐怕還是有點(diǎn)麻煩,那么就需要來個(gè)帶參的:Statement stmt =?
          ????? con.createStatement(?ResultSet.TYPE_SCROLL_INSENSITIVE,?ResultSet.CONCUR_READ_ONLY);
          ????? ResultSet rs=stmt.executeQuery("select * from DBTableName");?
          ????? 這樣就能夠很輕松的得到一個(gè)記錄集行數(shù)了。
          ????? 至于以上取值方式和PreparedStatement是一樣的,就不說了。。。
          ????? 具體的實(shí)現(xiàn)方式:只要把連接驅(qū)動修改一下,就可以直接運(yùn)行。我睡覺去了。。
          ????? 如果要看具體點(diǎn)的可以點(diǎn)擊這里啦...

          ?1 package ?sqlpersistent;
          ?2
          ?3 import ?java.sql.Connection;
          ?4 import ?java.sql.DriverManager;
          ?5 import ?java.sql.ResultSet;
          ?6 import ?java.sql.Statement;
          ?7
          ?8 public ? class ?GetCountTest
          ?9 {
          10 ????Connection?con = null ;
          11 ???? public ?GetCountTest()? throws ?Exception?
          12 ???? {
          13 ????????Class.forName( " com.microsoft.jdbc.sqlserver.SQLServerDriver " ); // 連接驅(qū)動
          14 ????????con? = ?DriverManager.getConnection( " jdbc:microsoft:sqlserver://localhost:1433;databaseName=[YourDataBaseName] " , " [User] " ,? " [Password] " ); // 連接數(shù)據(jù)庫,此處使用microsoft的????
          15 ????}

          16 ????
          17 ???? public ? static ? int ?getUserCount()?
          18 ???? {
          19 ????????String?sql? = ? " select?*?from?[YourTableName] " ;?
          20 ???????? try
          21 ???????? {
          22 ????????????Statement?stmt? = ? new ?GetCountTest().con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); // 第一個(gè)參數(shù)是:游標(biāo)類型,可以自由的前后滾動;第二個(gè)是設(shè)置只讀????????????
          23 ????????????ResultSet?rs? = ?stmt.executeQuery(sql); // 執(zhí)行SQL,返回結(jié)果集????????????
          24 ???????????? while ?(rs.next())
          25 ???????????? {
          26 ????????????????rs.last(); // 移動到最后一行
          27 ???????????????? return ?rs.getRow(); // 獲得當(dāng)前行號:此處即為最大記錄數(shù)
          28 ????????????}
          ????????????
          29 ????????}

          30 ???????? catch ?(Exception?e)
          31 ???????? {
          32 ????????????e.printStackTrace();????????????
          33 ????????}

          34 ???????? return ? - 1 ;
          35 ????}

          36 ???? public ? static ? void ?main(String[]?args)
          37 ???? {
          38 ????????System.out.println( " 返回的記錄數(shù): " + getUserCount());
          39 ????}
          ????
          40 }

          41


          ?

          posted on 2006-11-07 01:46 Jwin 閱讀(7927) 評論(9)  編輯  收藏 所屬分類: JDBC

          評論

          # re: 獲得ResultSet返回記錄數(shù) 2006-11-07 09:56 馬嘉楠
          好像不用這么麻煩把,如果只是要記錄數(shù)的話,改一下SQL語句就可以了

          select count(*) total from DBTableName;

          rs = stmt.executeQuery(sql);

          int totalRows = rs.getLong("total");

          之后totalRows就是你想要得記錄數(shù),只需要一步就能獲得你要的結(jié)果

          如果把所有的紀(jì)錄都查出來,一行一行移動到最后一行,再取行號,效率也太慢了

          遇到有幾萬幾十萬紀(jì)錄的大表,你就該哭了(即使幾千條也很慢啊)

          而且如果是大表查數(shù)據(jù)的話,也只是返回一部分,例如返回前100個(gè)記錄

          select first 100 * from DBTableName

            回復(fù)  更多評論
            

          # re: 獲得ResultSet返回記錄數(shù) 2006-11-07 10:04 馬嘉楠

          con.prepareStatement( SQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

          SQL是你的SQL語句,我記得似乎這樣也可以  回復(fù)  更多評論
            

          # re: 獲得ResultSet返回記錄數(shù) 2006-11-07 11:42 Jwin
          @馬嘉楠

          這樣也是可以的...
          發(fā)現(xiàn)其實(shí)我還是SQL不過關(guān),謝謝嘉楠兄的指導(dǎo)啦..  回復(fù)  更多評論
            

          # re: 獲得ResultSet返回記錄數(shù) 2006-11-07 16:18 馬嘉楠
          @Jwin

          我也是最近寫了一些這方面代碼,多練習(xí)就熟悉了
          其實(shí)SQL也有很多東西學(xué)的,只不過基本的掌握了,就可以應(yīng)付大多數(shù)問題了
            回復(fù)  更多評論
            

          # re: 獲得ResultSet返回記錄數(shù) 2006-11-07 21:54 Jwin
          @馬嘉楠

          所以這兩天我又在翻Sql的資料...
          以防下次出這樣的錯誤...  回復(fù)  更多評論
            

          # re: 獲得ResultSet返回記錄數(shù) 2007-02-08 14:08 jasonu
          rs.getLong("total"); 可以嗎?  回復(fù)  更多評論
            

          # re: 獲得ResultSet返回記錄數(shù) 2007-03-13 20:58 wyp
          好象不能顯示,,你自己試試看,,  回復(fù)  更多評論
            

          # re: 獲得ResultSet返回記錄數(shù) 2007-04-10 12:08 furong
          為什么按照馬嘉楠提到的方法來做
          他最后老提示我說
          at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
          at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
          好象是total那里出錯了
          請問這是為什么呢  回復(fù)  更多評論
            

          # re: 獲得ResultSet返回記錄數(shù) 2009-09-02 16:09 douboer
          int totalRows = rs.getLong("total");
          類型就不對,你試過嗎?不懂不要瞎說  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 大竹县| 留坝县| 广昌县| 吴堡县| 礼泉县| 桃源县| 云霄县| 怀集县| 建水县| 泗水县| 合肥市| 宝坻区| 太白县| 三门峡市| 辽宁省| 高邑县| 巴林左旗| 鄂伦春自治旗| 安庆市| 察雅县| 武威市| 无棣县| 武宣县| 阿克陶县| 大宁县| 华安县| 东方市| 东安县| 云南省| 垫江县| 淳化县| 定结县| 宜君县| 札达县| 温泉县| 南和县| 当雄县| 成都市| 吕梁市| 安宁市| 伊春市|