jimphei學習工作室

          jimphei學習工作室

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            23 隨筆 :: 0 文章 :: 1 評論 :: 0 Trackbacks
          1、建立數據庫連接

                首先要建立一個到想要使用的DBMS的連接。這包括兩個步驟:(1) 加載驅動程序;(2) 創建連接。


             (1) 加載驅動程序 
                   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //字符串為他驅動程序的類名

            (2) 創建連接

                創建連接的第二步是使用合適的驅動程序連接到DBMS。如下代碼行示范了一般的用法:

                      //url字符串為使用的子協議,也就是在JDBC URL中放在jdbc:之后的東西 
                    Connection con = DriverManager.getConnection(url,"myLogin", "myPassword"); 

           2、創建和執行JDBC語句

             Statement對象可將SQL語句發送到DBMS。這只要創建一個Statement對象,將想要執行的SQL語句傳遞給適當的執行方法,

          然后執行該Statement對象。

                Statement stmt = con.createStatement();

           

             對于SELECT語句,使用的方法是executeQuery。對于創建或修改表的語句,使用的方法是executeUpdate。

             //strSQL字符串是一條DDL(數據描述語言)語句

             stmt.executeUpdate(strSQL);

          3、處理結果

             JDBC將結果集返回給ResultSet對象

             //strSQL字符串是一條查詢語句   

             ResultSet rs = stmt.executeQuery(strSQL);
             1)next方法
             變量rs(ResultSet的一個實例)包含了結果集中顯示的表。為訪問名稱和單價要移動到每一行,根據它們的類型檢索數值。
          next方法將光標移到下一行,使那行(稱為當前行)成為可在其上操作的行。由于光標初始定位于ResultSet對象第一行的上面,
          所以第一次調用next方法將光標移到第一行,使它成為當前行。接下來調用next方法將使光標從上至下每次移動一行。
             2)getXXX方法
             適當類型的getXXX方法可用于檢索列中的數值。檢索VARCHAR SQL類型數值的方法是getString。檢索該類型數值的方法是getFloat。
          每次調用next方法,下一行就成為當前行,循環一直持續到rs中再也沒有可向前移動的行為止。
          while (rs.next()) 
          {
              String s = rs.getString(strColumnName1 );//strColumnName1為strSQL字符串中的列名
              float n = rs.getFloat(strColumnName2)//strColumnName2為strSQL字符串中的列名
              System.out.println(s + " " + n);
          }
          JDBC使用兩種方法標識getXXX方法檢索數值的列。一種是指定列名,這也是前面例子所做的。
          另一種是指定列索引(列的序號),1表示第一列,2表示第二列,以此類推。
             String s = rs.getString(1); float n = rs.getFloat(2);
             3)getString方法
             盡管推薦使用getString方法檢索CHAR和VARCHAR SQL類型的數據,但也可能用它檢索其他基本SQL類型的數據
          (但不可用它檢索新的SQL3數據類型。本教程后面將討論SQL3類型)。用getString檢索所有數值有很多優點但也有局限。
          如果用它檢索numeric類型的數據,getString將把numeric值轉換成Java的String對象,這樣一來,在數據要作為數字前就必須轉換回numeric類型。
          在數值一直當成字符串的場合,這是無可非議的。如果想讓程序檢索除了SQL3類型之外的任何標準SQL類型,就可用getString方法。
           
          4、關閉連接
             connection.close();
           
          ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
          下面是個完整的例子:
          1)下載并安裝Microsoft JDBC (http://download.microsoft.com/download/SQLSVR2000/Install/2.2.0022/NT5XP/EN-US/setup.exe)
          2) 安裝完成Microsoft JDBC后,將安裝目錄中的lib目錄下三個jar文件msbase.jar, mssqlserver.jar, msutil.jar引入項目中 
          3)建立數據庫tempdb,建立表COFFEES,SQL語句為:
             CREATE TABLE COFFEES (COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, SALES INTEGER, TOTAL INTEGER) 
          4)給表COFFEES添加一些數據,如:
             INSERT INTO COFFEES VALUES ('Colombian', 101, 7.99, 0, 0); 
          5)輸入以下源文件,并執行
          import java.sql.*;
          /**
           * @author liujun TODO To change the template for this generated type comment go
           *         to Window - Preferences - Java - Code Style - Code Templates
           */
          public class JDBC_01
          {
              public static void main(String[] args)
              {
                  showTable();
              }
              public static void showTable()
              {
                  //String strDriver="sun.jdbc.odbc.JdbcOdbcDriver";
                  String strDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
                  //String strConnUrl="jdbc:odbc:TempDataSources";
                  String strConnUrl = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=tempdb";
                  String strSQL = "select * from COFFEES";
                  try
                  {
                      //加載驅動程序
                      Class.forName(strDriver);
                      //創建連接
                      Connection objConn = DriverManager.getConnection(strConnUrl, "sa",
                              "");
                      //創建Statement對象
                      Statement objStatement = objConn.createStatement();
                      //JDBC將結果集返回給ResultSet對象
                      ResultSet objSet = objStatement.executeQuery(strSQL);
                      //獲得查詢結果的列數
                      int lCloumnCount = objSet.getMetaData().getColumnCount();
                      System.out.println("查詢結果如下所示");
                      //顯示列名
                      for (int i = 1; i <= lCloumnCount; i++)
                      {
                          System.out.print(objSet.getMetaData().getColumnName(i)
                                  + "       ");
                      }
                      System.out.println();
                      //顯示結果
                      while (objSet.next())
                      {
                          //顯示COF_NAME
                          System.out.print("" + objSet.getString(1));
                          //顯示SUP_ID PRICE SALES TOTAL
                          System.out.print("        " + objSet.getInt(2));
                          //顯示 PRICE
                          System.out.print("         " + objSet.getFloat(3));
                          //顯示SALES
                          System.out.print("         " + objSet.getInt(4));
                          //顯示 TOTAL
                          System.out.print("        " + objSet.getInt(5));
                      }
                 objConn.close();
                  }
                  catch (Exception e)
                  {
                      System.out.print(e.getMessage());
                  }
              }
          }

          5、使用預備語句

             PreparedStatement對象是包含一條預編譯過的SQL語句。DBMS不必編譯就可直接運行PreparedStatement的SQL語句。所以代替Statement對象一般會縮短執行時間。盡管paredStatement對象可用于不帶參數的SQL語句,但在多數場合是用于帶參數的SQL語句。其用法如下:

             String strUpdateSales="UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?";

             PreparedStatement updateSales = con.prepareStatement(strUpdateSales);
             updateSales.setInt(1, 75);//給上面的SQL語句的第一個問號付值
             updateSales.setString(2, "Colombian");//給上面的SQL語句的第二個問號付值
             updateSales.executeUpdate();//執行UPDATE COFFEES SET SALES = 75 WHERE COF_NAME LIKE ‘Colombian’
          因此,可用該對象制作成模板實現一次構造多條帶參數的SQL語句,簡化編碼。
           
          6、executeUpdate方法的返回值
             executeQuery返回一個ResultSet對象,但executeUpdate返回的是一個整數值,指出了表中已更新的行數
          如果executeUpdate的返回值為0表明如下兩種情況:(1) 執行的語句是一不影響任何行的更新語句;(2) 執行的是一DLL語句。
           
           7、使用事務
             一個事務是作為一個單元執行的一組語句(一條或多條語句),因此它們要么全部執行,要么全部不執行。要讓兩條或更多條語句組成
          一個事務就要禁用自動提交模式,具體用方法con.setAutoCommit(false);一旦禁用了自動提交模式,就沒有SQL語句會提交了,
          除非您顯式調用con.commit()方法,實現提交事務。
             使用事務可以保持數據完整性。調用rollback方法可取消一個事務,將修改的任何數據返還到以前的值。如果在執行一個事務
          中的一條或多條語句時得到了SQLException。就應該調用rollback方法取消事務,從頭開始整個事務。一般要在catch塊中調用
          rollback,以避免可能使用不正確的數據。
           
          8、檢索警告
             SQLWarning對象是SQLException的子類,用于處理數據庫訪問警告。就像異常一樣,警告并不終止程序的執行;它們只是提醒
          用戶——發生了一些未預料的事情。Connection對象、Statement對象(包括PreparedStatement和CallableStatement對象)
          或ResultSet對象都會報告警告。這些類都有getWarnings方法,為查看調用對象報告的第一個警告,就必須調用該方法。如果
          getWarnings返回一個警告,就可在其上調用SQLWarning方法getNextWarning取得其他警告。自動執行一條語句會清除前一條語句
          的警告,因此警告不會迭加。但這也表明提取一條語句報告的警告必須在執行下一語句之前進行。
           
          9、存儲過程
             存儲過程是一組SQL語句組成的邏輯單元,用于執行特定的任務。存儲過程用于封裝數據庫服務器上執行的一組操作或查詢。
          存儲過程可以編譯,然后使用不同的參數和結果執行,這些參數和結果可以是輸入、輸出和輸入/輸出參數的任意組合。
             1)用SQL語句創建存儲過程
             如下所示,其方法同其他的DDL語句相同:
             String createProcedure = "create procedure SHOW_SUPPLIERS " +
                 "as " +"select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " + 
                 "from SUPPLIERS, COFFEES " +"where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +
                 "order by SUP_NAME"; 
             Statement stmt = con.createStatement();
             stmt.executeUpdate(createProcedure);
             2)從JDBC調用存儲過程
             第一步是創建一個CallableStatement對象。CallableStatement對象包含了存儲過程的一個調用;但它不包含存儲過程
          本身。接著使用連接con創建了存儲過程的一個調用。花括號內的那部分就是存儲過程的轉義語法。當驅動程序碰到
          “{call SHOW_SUPPLIERS}”時,它將把這個轉義語法轉換成數據庫使用的本地SQL,以調用call 后面的的存儲過程。
          如下所示:
             CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}"); 
             ResultSet rs = cs.executeQuery();
             注意,用于執行cs的方法是executeQuery,因為cs調用的存儲過程包含一個查詢,執行后產生一個結果集。如果存儲過程
          包含一條更新或一條DLL語句,那就要使用executeUpdate方法。但有時一個存儲過程包含多條SQL語句,因而它產生的不只是
          一個結果集、不只是一個更新計數或產生一些結果集和更新計數的組合。這樣就有多個結果集,這時就應該使用execute方法
          來執行CallableStatement。 CallableStatement類是PreparedStatement的子類,因此CallableStatement對象可與
          PreparedStatement對象一樣帶有輸入參數。此外,CallableStatement對象還可帶輸出參數或輸入/輸出參數
          posted on 2009-08-14 10:34 jimphei 閱讀(120) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 且末县| 玉山县| 星子县| 呼伦贝尔市| 申扎县| 沧源| 滁州市| 铜陵市| 介休市| 特克斯县| 贵州省| 乌拉特中旗| 丹寨县| 安图县| 盖州市| 杭锦后旗| 健康| 玉龙| 商南县| 岐山县| 湘乡市| 潢川县| 合肥市| 北京市| 神木县| 巨野县| 青冈县| 宣武区| 海伦市| 普安县| 延寿县| 佛山市| 印江| 五常市| 饶河县| 河源市| 平武县| 饶平县| 安义县| 金湖县| 乌兰察布市|