拼搏的人生

          拼搏在繁華的都市

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            7 隨筆 :: 13 文章 :: 6 評論 :: 0 Trackbacks
          ???DataBase Accessing:JDBC
          ????? 把以前學習的東西寫出來,以便在以后的學習和工作中可以用到!這里我主要是把自己關于數據庫學習的一些東西給寫出來。
          ????? JDBC提供一套訪問關系數據庫的標準庫。通過JDBC API,我們可以使用完全相同的Java語法訪問各式各樣的SQL數據庫。正式來將JDBC不是一個首字母的縮寫詞,因此,它不代表任何事情。”Java Database Connectivity”通常是該名稱的完整形式。
          通常查詢數據庫可以用7個標準步驟來說明:
          (1).載入JDBC驅動程序
          如果要載入驅動程序,只需要在Class.forName方法中指定數據庫驅動類名。這樣做就自動創建驅動程序的實例,并注冊到JDBC驅動程序管理器。(注:ForName方法返回給定名稱的類的對象,調用該對象相當于調用Class.forName)
          (2)定義連接URL(connection URL)
          在JDBC中,連接URL指定服務器的主機名,端口以及希望與之建立連接的數據庫名
          (3)建立連接
          有了連接URL,用戶名和密碼,就可以建立到數據庫的網絡連接。連接建立之后,就可以執行數據庫的查詢,直到連接為止
          (4)創建Statement對象
          創建Statement才能向數據庫發送查詢和命令
          (5)執行查詢或更新
          有了Statement對象后,就可以用execute,executeQuery,executeUpdate或executeBatch方法發送SQL語句到數據庫
          (6)結果處理
          數據庫執行查詢完畢之后,返回一個ResultSet。ResultSet表示一系列的行和列,可以調用next和各種getXXX方法對這些行和列進行處理。
          (7)關閉連接
          這點比較重要,一定要記得關閉連接,釋放與數據庫的資源。這樣可以提高效率。

          裝載JDBC驅動程序
          因為在裝載JDBC驅動程序用的是顯示的Class.forName所以一定要寫在try{}catch{}塊中。由于可能會發生ClassNotFoundException所以應當捕獲這個異常. Example:
          Try
          {
          Class.forName(“connect.microsoft.MicrosoftDriver”);
          Class.forName(“oracle.jdbc.driver.OracleDriver”);
          Class.forName(“com.sybase.jdbc.SybDriver”);
          }
          Catch(ClassNotFoundException e)
          {
          ?out.println(e.getMessage());
          }
          我們在部署的時候應當注意是把JDBC的驅動程序JAR文件部署到install_dir/common/lib也可以部署到WEB-INF/lib目錄中。
          建立連接
          在建立實際連接的時候,需要將URL,數據庫名字和用戶名都傳給DriverManager類的getConnection方法,由于getConnection有可能會產生異常因此我們應該把這些代碼寫在try{}catch{}中. Eg:
          String URL=”jdbc:oracle:thin:@”+host+”:”+port+”:”+dbName;
          String UID=”Database user name”;
          String PWD=”Database password”;
          Try
          {
          Conection con=DriverManager.getConnection(URL,UID,PWD);
          }
          Catch(SQLException e)
          {
          ? e.getMessage();
          }
          Conection類還包括其他的一些用法!如下:
          prepareStatement
          創建預編譯查詢,提交給數據庫
          prepareCall
          訪問數據庫中的存儲過程。
          Rollbach/commit
          控制事務管理
          Close
          關閉連接
          isClosed
          確定連接是否超時或被顯示關閉
          建立連接過程,一個可選部分是使用getDataMeta方法查找數據庫的相關信息,這個方法返回DatabaseMetaData對象,該對象擁有相應的方法,可以得出數據庫自身的名稱和版本(getDatabaseProductName,getDatabaseProductVersion),或者 JDBC驅動程序的名稱和版本(getDriverName,getDrvierVersion).例如:
          DatabaseMetaData dbMetaData=connection.getDataMeta();
          String productName=
          dbMetaDate.getDatabaseProductName();
          System.out.println(“Database:”+productName);
          String produtcVersion=
          ?? dbMetaDate.getDatabseProductVersion();
          System.out.println(“Version:”+productVersion);
          創建Statement對象
          Statement對象用來向數據庫發送查詢和命令。它由Conection的createStatement()方法創建:
          Statement stmt=connection.createStatement();
          執行查詢或更新
          有了Statement對象后,就可以用它的executeQuery方法發送SQL查詢,executeQuery返回ResultSet類型對象。Eg:
          String sql=”select * from emp”;
          ResultSet rs=stmt.execute?Query(sql);
          Statement的其他的用法:
          executeQuery
          執行SQL查詢并在ResultSet中返回數據.ResultSet可能為空,但不會為NULL。
          executeUpdate
          用于UPDATE,INSERT或DELETE命令。返回受影響的行數,可以為0,它還提供對DDL(Data Definition Language)命令的支持,例如CREATE TABLE,DROP TABLE和ALTER TABLE。
          executeBatch
          將一組命令作為一個單元執行,返回一個數組,其中存儲每個計數的更新計數。addBatch可以向批量執行的命令中添加命令。
          setQueryTimeout
          指定驅動程序在拋出SQLException異常之前,等待處理結果的時間。
          getMaxRows/setMaxRows
          確定ResultSet可容納的最大行數。超過的行將會在不給出任何警告的情況下丟棄。默認值為0,表示沒有限制。
          結果處理
          結果處理最簡單的方式就是用ResultSet的Next方法在表中移動,每次一行。(注:ResultSet中行的第一列索引為1,而非0).建議在訪問 ResultSet的列時不要使用索引,而使用列名。使用這種方式在表的結構發生改變時,與ResultSet交互的代碼不容易出錯誤。
          ResultSet的一些方法集:
          Next/previous
          將ResultSet中的游標分別移動到下一行。
          Relative/absolute
          Relative方法將游標相應的地移動特定數目行,或正或負(向前或向后)。Absolute方法將游標移動到指定的行號。如果絕對值是負數,那么游標將相對于ResultSet的結尾進行定位(JDBC2.0)。
          getXxx
          返回Xxx Java類型(參見java.sql.Types)的值,這個值來自于列名或索引指定的列。如果列的值為SQL的NULL值,那么則返回0或NULL。
          wasNull
          檢查上面的getXxx讀到的是否為SQL的NULL值。如果列的類型為基本類型(int,float等),且數據庫中的值為0,那么這項檢查就很重要。由于數據庫的NULL返回0,所以0和數據庫的NULL不能區分開來。如果列的類型為對象(String,Date等),可以簡單的將返回值與NULL比較。
          findColumn
          返回ResultSet中與指定列名對應的索引。
          getRow
          返回當前的行號,第一行從1開始。
          getMetaData
          返回描述ResultSet的ResultSetMetaData對象。ResultSetMetaData給出列的數目和名稱。
          getMetaData方法尤為有用。僅僅有ResultSet的情況下我們必須知道列的名稱,數目和類型才能正確的對表進行處理。ResultSetMetaData的方法集:
          getColumnCount
          返回ResultSet中列的數目。
          getColumnName
          返回列在數據庫中的名稱.
          getColumnType
          返回列的SQL類型,對應于java.sql.Types中的項。
          isReadOnly
          表示數據是否為只讀。
          isSerachable
          表明給列是否可以用在WHERE字句中。
          isNullable
          表明該列是否可以存儲NULL。
          (注J: ResultSet和ResultSetMetaData沒有直接提供方法返回查詢所返回的行數,然而,在JDBC2.0中,可以用last將游標定位于ResultSet最后一行,然后調用getRow獲取當前的行號。)
          關閉連接
          顯示的關閉連接:
          connection.close();

          可以參考以下以下的例子:

          import java.sql.*;
          import java.io.*;
          /**
           * <p>Title: JDBC連接數據庫</p>
           * <p>Description: 本實例演示如何使用JDBC連接Oracle數據庫,并演示添加數據和查詢數據。</p>
           */publicclass JDBCConn{private  String url="";//數據庫連接字符串private  String username="";//數據庫用戶名private  String password="";//數據庫密碼
          ?
          /**
           *<br>方法說明:獲得數據連接
           *<br>輸入參數:
           *<br>返回類型:Connection 連接對象
           */public Connection conn(){try{
               ??//第一步:加載JDBC驅動
                  Class.forName("oracle.jdbc.driver.OracleDriver");
                  //第二步:創建數據庫連接
                  Connection con =DriverManager.getConnection(url, username, password);
                  return con;
              }catch(ClassNotFoundException cnf){
              ??System.out.println("driver not find:"+cnf);
              ??returnnull;
              }catch(SQLException sqle){
              ??System.out.println("can't connection db:"+sqle);
              ??returnnull;
              }
          ??catch (Exception e) {
                  System.out.println("Failed to load JDBC/ODBC driver.");
                  returnnull;
               }}/**
           *<br>方法說明:執行查詢SQL語句
           *<br>輸入參數:Connection con 數據庫連接
           *<br>輸入參數:String sql 要執行的SQL語句
           *<br>返回類型:void
           */publicvoid query(Connection con, String sql){try{if(con==null){thrownew Exception("database connection can't use!");
               }if(sql==null) thrownew Exception("check your parameter: 'sql'! don't input null!");
             //第三步:獲取Staetment對象
               Statement stmt = con.createStatement();
             //第四步:執行數據庫操作(查詢操作)
               ResultSet rs = stmt.executeQuery(sql);
             //第五步:處理結果集
          ?? ResultSetMetaData rmeta = rs.getMetaData();
             ?? //獲得數據字段個數int numColumns = rmeta.getColumnCount();
               while(rs.next())
          ?? {
          ??   for(int i = 0;i< numColumns;i++)
          ??   {
          ????String sTemp = rs.getString(i+1);
          ????System.out.print(sTemp+"  ");
          ??   }
          ??  System.out.println("");
          ?? }}catch(Exception e){
                System.out.println("query error:"+e);
              }}/**
           *<br>方法說明:執行插入、更新、刪除等沒有返回結果集的SQL語句
           *<br>輸入參數:Connection con 數據庫連接
           *<br>輸入參數:String sql 要執行的SQL語句
           *<br>返回類型:void
           */publicvoid execute(Connection con, String sql){try{if(con==null) return;
              //第三步:獲取Statement對象
          ??  Statement stmt = con.createStatement();
              //第四步:執行數據庫操作(更新操作)
          ??  stmt.executeUpdate(sql);
          ??  System.out.println("update executed successly");
              }catch(Exception e){
                System.out.println("execute error: sql = "+sql);
                System.out.println(e);
              }//end try catch}//end execute/**
           *<br>方法說明:實例演示
           *<br>輸入參數:無
           *<br>返回類型:void
           */publicvoid demo(){
              String sSQL="";
              BufferedReader stdin=new BufferedReader(new  InputStreamReader(System.in));
              try{
                System.out.println("please input update SQL string");
                sSQL=stdin.readLine();//獲取命令行輸入(更新字符串)
                Connection conn = conn();//執行自定義連接方法(獲取數據庫連接對象)
                execute(conn,sSQL);//執行自定義更新方法
                String sql = "select * from TBL_USER";
                query(conn,sql);//執行自定義查詢方法(查詢并處理結果集)//第六步:關閉數據庫連接
                conn.close();
              }catch(SQLException se){
                System.out.println(se);
              }catch(Exception e){
                System.out.println(e);
              }
          ?
            }/**
           *<br>方法說明:主方法
           *<br>輸入參數:String[] args 命令行參數(包括:數據庫連接URL,
           *<br>用戶名,密碼)
           *<br>返回類型:void
           */publicstaticvoid main(String[] arg){if(arg.length!=3){
                System.out.println("use: java JDBCConn url username password");
                return;
              }
              JDBCConn oc = new JDBCConn();
              oc.url = arg[0];
              oc.username=arg[1];
              oc.password=arg[2];
              oc.demo();
            }}
          posted on 2006-05-05 08:03 Dalston.Young 閱讀(260) 評論(0)  編輯  收藏 所屬分類: DataBase

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


          網站導航:
           
          主站蜘蛛池模板: 兴海县| 浮梁县| 平远县| 阜新市| 屯门区| 大洼县| 张家川| 滁州市| 增城市| 璧山县| 大竹县| 曲松县| 普宁市| 剑川县| 华蓥市| 黄冈市| 南靖县| 阿拉善左旗| 扶风县| 卫辉市| 义乌市| 晋城| 白水县| 寻乌县| 九台市| 敦煌市| 怀集县| 临西县| 马龙县| 塘沽区| 嘉祥县| 诸城市| 久治县| 搜索| 阳谷县| 安乡县| 科尔| 隆化县| 乳源| 英超| 清徐县|