0734w-月下竹音

          0734是來自家鄉的聲音

          常用鏈接

          統計

          最新評論

          轉貼(使用jdbc訪問數據庫)

          . 連接到數據庫的方法
          答:1) ODBC(Open Database Connectivity)
                一個以C語言為基礎訪問SQL為基礎數據庫引擎的接口,它提供了一致的接口用于和數據庫溝通以及訪問數據。
             2) JDBC
                Java版本的ODBC

          2. JDBC應用編程接口
          答:JDBC應用編程接口是:
             1) 標準的數據訪問接口,可以連到不同的數據庫;
             2) JAVA編程語言的一組類和接口。
             JDBC應用編程接口能夠:
             1) 連接到數據庫;
             2) 發SQL查詢字符串到數據庫;
             3) 處理結果。
             JDBC應用編程接口有二個主要的部分:
             1) JAVA應用程序開發接口面向JAVA應用程序開發者;
             2) JDBC驅動程序開發接口
             
          3. JDBC Driver
          答:1) 一大堆實現了JDBC類和接口的類;
             2) 提供了一個實現java.sql.Driver接口的類。

          4. JDBC Driver的四種類型
          答:1) JDBC-ODBC橋
             由ODBC驅動提供JDBC訪問
             2) 本地API
             部分Java driver把JDBC調用轉化成本地的客戶端API
             3) JDBC-net
             純的Java driver,將JDBC調用轉入DBMS,與網絡協議無關。然后通過服務器將調用轉為DBMS協議。
             4) 本地協議
             純的java driver,將JDBC調用直接轉為DBMS使用的網絡協議

          5. JDBC開發者接口
          答:1) java.sql--java 2平臺下JDBC的主要功能,標準版(J2SE)
             2) javax.sql--java 2平臺下JDBC增強功能,企業版(J2EE)

          6. 使用URL確認數據庫
          答:我們使用URL來確定一個數據庫(正確的Driver,正確的主機,正確的協議,正確的協議,正確的用戶名和密碼);
             語法:protocol:subprotocol:subname
             范例:jdbc:db2:MyTest
                   jdbc:db2://localhost:6789/MyTest

          7. javax.sql包JDBC2.0的增強功能
          答:1) 數據源接口;
             2) 連接池;
             3) 分布式交易;
             4) 行集;

          8. 創建一個基本的JDBC應用
          答:1) 步驟一:注冊一個driver;
             2) 步驟二:建立一個到數據庫的連接;
             3) 步驟三:創建一個statement;
             4) 步驟四:執行SQL語句;
             5) 步驟五:處理結果;
             6) 步驟六:關閉JDBC對象

          9. 注冊一個Driver(步驟一)
          答:1) driver被用于連接到數據庫;
             2) JDBC應用編程接口使用第一個能成功連接到給定URL的driver;
             3) 在同一時間可以裝載多個driver

          10.注冊一個driver的方法:
          答:1) 使用類loader(裝載;實例化;注冊入DriverManager)
                a. Class.forName("Com.ibm.db2.jdbc.app.DB2Driver");
                b. Class.forName("Com.ibm.db2.jdbc.net.DB2Driver");
                c. Class.forName("Com.microsoft.jdbc.sqlServer.SQLServerDriver);
                d. Class.forName("oracl.jdbc.driver.OracleDriver");
                e. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
             2) 實例化一個Driver
                a. Driver drv = new COM.cloudscape.core.RmiJdbcDriver();

          1. 建立一個到數據庫的連接(步驟二)
          答:DriverManager調用getConnection(urlString)方法,實際上調用的是driver的connect(urlString)方法;
             1) 當一個driver肯定地對應到一個數據庫URL,DriverManager建立一個連接;
             2) 當沒有driver匹配,返回null然后下一個driver被檢驗;
             3) 假如沒有建立連接,拋出一個SQLExcepiton異常

          2. 經常使用的一些JDBC URL
          答:1) JDBC-ODBC: jdbc:odbc:<DB>
             2) Oracle: jdbc:oracle:oci:@<sid> or jdbc:oracle:thin:@<SID>
             3) Weblogic MS-SQL: jdbc:weblogic:mssqlserver4:<DB>@<HOST>:<PORT>
             4) DB2: jdbc:db2:MyTest or jdbc.db2://localhost:6789/MyTest(需要用戶名和密碼)

          3. Driver連接方法
          答:1) 創建一個到指定Driver實例的直接調用;
             2) 避免一般訪問的問題
                Driver drv = new COM.ibm.db2.jdbc.app.DB2Driver();
                Connection con = null;
                try {con = drv.connect("jdbc:db2:MyTest",new Properties())}
                catch(SQLException e){}

          4. 創建一個Statement(步驟三)
          答:1) Statement的三個接口:
                a. Statement;
                b. PreparedStatement(繼承自Statement);
                c. CallableStatement(繼承自PreparedStatement);
             2) 使用方法Connection.createStatement()得到一個Statement對象

          5. PreparedStatement對象
          答:1) 調用ProparedStatement比statement更為高效;
             2) 繼承自Statement;
             3) 語法:PreparedStatement pstm = connection.prepareStatement(sqlString);

          6. CallableStatement對象
          答:1) 通過CallableStatement調用數據庫中的存儲過程;
             2) 繼承自PreparedStatement;
             3) CallableStatement cstm = connection.prepareCall("{call return_student[?,?]}");
                cstm.setString(1,"8623034");
                cstm.registerOutparameter(2, Types.REAL);
                cstm.execute();
                float gpa = cstm.getFloat(2);

          7. Statement接口的比較
          答:             | Statement           | PreparedStatement         |  CallableStatement
             ------------------------------------------------------------------------------
             寫代碼位置   |   客戶端            | 客戶端                    |  服務器端
             ------------------------------------------------------------------------------
             寫代碼位置   |   客戶端            | 服務器端                  |  服務器端
             ------------------------------------------------------------------------------
             編寫代碼技術|Java,SQL操作  |Java,SQL操作            |  數據庫的程序語言,如PL/SQL
             ------------------------------------------------------------------------------
             可配置性     |   高                |第一次高,以后低           |  低
             ------------------------------------------------------------------------------
             可移植性     |   高                |假設支持PreparedStatement的話高
             ------------------------------------------------------------------------------
             傳輸效率     |   低                |第一次低,以后高           |  高

          8. 執行SQL Statement(步驟四)
          答:通過接口方法將SQL語句傳輸至黙認的數據庫連接,返回結果可能是一個數據表,可以通過java.sql.ResultSet訪問。
             1) Statement的接口方法:
             a. executeQuery(sqlString): 執行給定的SQL聲明,返回一個結果集(ResultSet)對象;
             b. executeUpdate(sqlString): 執行給定的SQL聲明,可以是INSERT、UPDATE或DELETE聲明,也可以是SQL DDL聲明;
             c. execute(sqlString): 執行給定的SQL聲明。

          9. 處理結果(步驟五)
          答:1) 使用結果集(ResultSet)對象的訪問方法獲取數據;
                a. next():下一個記錄
                b. first():第一個記錄
                c. last():最后一個記錄
                d. previous():上一個記錄
             2) 通過字段名或索引取得數據
             3) 結果集保持了一個指向了當前行的指針,初始化位置為第一個記錄前。

          10. 關閉JDBC對象(步驟六)
          答:1) 首先關閉記錄集;
             2) 其次關閉聲明;
             3) 最后關閉連接對象。

          11. 數據表和類對應的三種關系:
          答:1) 一個表對應一個類;
             2) 一個表對應相關類;
             3) 一個表對應整個類關系層

          12. 類間關系的幾種表設計:
          答:1) 多對一,
             2) 一對一:
             3) 一對多:
             4) 多對多:

          13. SQL數據類型及其相應的Java數據類型
          答:SQL數據類型                     Java數據類型              說明
             ------------------------------------------------------------------
             INTEGER或者INT                  int                     通常是個32位整數
             SMALLINT                        short                   通常是個16位整數
             NUMBER(m,n) DECIMAL(m,n)        Java.sql.Numeric        合計位數是m的定點十進制數,小數后面有n位數
             DEC(m,n)                        Java.sql.Numeric        合計位數是m的定點十進制數,小數后面有n位數
             FLOAT(n)                        double                  運算精度為n位二進制數的浮點數
             REAL                            float                   通常是32位浮點數
             DOUBLE                          double                  通常是64位浮點數
             CHARACTER(n)或CHAR(n)           String                  長度為n的固定長度字符串
             VARCHAR(n)                      String                  最大長度為n的可變長度字符串
             BOOLEAN                         boolean                 布爾值
             DATE                            Java.sql.Date           根據具體設備而實現的日歷日期
             TIME                            Java.sql.Time           根據具體設備而實現的時戳
             TIMESTAMP                       Java.sql.Timestamp      根據具體設備而實現的當日日期和時間
             BLOB                            Java.sql.Blob           二進制大型對象
             CLOB                            Java.sql.Clob           字符大型對象
             ARRAY                           Java.sql.Array

          1. 元數據
          答:關于數據的信息,例如類型或者容量。通過JDBC API可以訪問:
             1) 數據庫元數據;
                a. 使用connection.getMetadata方法返回DataMetaData引用
                b. 能夠使用isReadOnly此類方法獲取信息
             2) 結果集元數據;
                a. 使用ResultSet.getMetadata方法返回ResultSetMetaData引用
                b. 能夠使用getColumnCount此類方法獲取信息

          2. 事務處理
          答:1) 一系列的動作作為一個不可分的操作;
             2) JDBC API中使用事務處理步驟:
                a. 用false作為參數調用setAutoCommit方法;
                b. 執行一或多個關于數據庫的操作;
                c. 調用commit方法完成改變;
                d. 恢復上次提交后的改變,調用rollback方法.

                try
                {
                   con.setAutoCommit(false);
                   Statement stm = con.createStatement();
                   stm.executeUpdate("insert into student(name, age, gpa) values('gzhu', 30, 4.8)");
                   stm.commit();
                }
                catch(SQLException e)
                {
                   try
                   {
                      con.rollback();
                   }
                   catch(Exception e)
                   {
                   }
                }

          3. 并發控制
          答:1) 設置隔離級別方法:setTransactionIsolation
             2) 隔離級別靜態變量
                a. TRANSACTION_NONE:只讀的數據字典;
                b. TRANSACTION_READ_UNCOMMITTED:只讀未提交數據;
                c. TRANSACTION_READ_COMMITTED:只讀未提交數據;
                d. TRANSACTION_REPEATABLE_READ:重復讀取數據;
                e. TRANSACTION_SERIALIZABLE:無論做什么操作都不許別人動。
             3) 示例:con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

          4. JDBC 2.0 應用程序編程接口增強功能
          答:1) ResultSet增強:
                a. 可以回卷;
                b. 可以修改;
                設置示例:Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
             2) Statement增強了批量修改能力(batch updates);
             3) 更高級的數據類型(例:Struct)。

          5. JDBC 2.0標準擴展
          答:1) JNDI(Java Naming and Directory Interface): 解決離散狀態下Object的查找;
             2) 連接池:在內存中保存了一個數據庫連接,不需要注冊驅動器,提高性能的重要方法。

          16:29:12  |  固定鏈接 | 引用通告 (0) | 記錄它
          執行sql語句

          import java.sql.*;
          import java.io.*;

          /**
           * 執行SQL語句的demo.
           **/
          public class ExecuteSQL {
              public static void main(String[] args) {
                  Connection conn = null;  // 定義連接數據庫的JDBC Connection對象
                  try {
                      String driver = null, url = null, user = "", password = "";

                      // 讀取輸入的參數
                      for(int n = 0; n < args.length; n++) {
                          if (args[n].equals("-d")) driver = args[++n];
                          else if (args[n].equals("-u")) user = args[++n];
                          else if (args[n].equals("-p")) password = args[++n];
                          else if (url == null) url = args[n];
                          else throw new IllegalArgumentException("Unknown argument.");
                      }

                      // 數據庫的url參數必須輸入.
                      if (url == null)
                          throw new IllegalArgumentException("No database specified");

                      // 如果啟動程序的時候輸入了驅動,那么使用用戶輸入的參數動態注冊數據庫驅動
                      if (driver != null) Class.forName(driver);

                      // 建立到數據庫的連接。jdbc會使用它所知道的所有的數據庫驅動來建立與數據庫的連接。
                      conn = DriverManager.getConnection(url, user, password);

                      // 創建statement對象來與數據庫進行交互
                      Statement s = conn.createStatement();

                      //從命令提示符中讀取sql命令
                      BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

                      //循環執行用戶輸入的sql語句
                      while(true) {
                          System.out.print("sql> ");   // 提示用戶可以繼續輸入
                          System.out.flush();          // 顯示提示符.
                          String sql = in.readLine();  // 讀取用戶輸入

                          // 輸入“quit”,退出程序.
                          if ((sql == null) || sql.equals("quit")) break;

                          // 忽略空行輸入
                          if (sql.length() == 0) continue;
                         
                          // 執行輸入的sql命令,并顯示執行結果.
                          try {
                              // 使用execute進行判斷用戶輸入的是查詢還是更新,如果是更新則返回”假“

                              boolean status = s.execute(sql);
                         
                // 一些復雜的查詢返回不只一個記錄集,所以循環讀取所有的記錄集
                              do {
                                  if (status) { //status為”真“,查詢并返回記錄集
                                      ResultSet rs = s.getResultSet();   // 讀取記錄集
                                      printResultsTable(rs, System.out); // 顯示記錄集
                                  }
                                  else {
                                      // status為”假“,進行更新操作,并返回操作所影響的行數
                                      int numUpdates = s.getUpdateCount();
                                      System.out.println("Ok. " + numUpdates +
                      " rows affected.");
                                  }

                                  // 判斷是否有更多的記錄集
                                  status = s.getMoreResults();
                              } while(status || s.getUpdateCount() != -1);
                          }
                          // 如果sql語句執行出錯,打印出錯信息
                          catch (SQLException e) {
                              System.err.println("SQLException: " + e.getMessage()+ ":" +
                     e.getSQLState());
                          }
                          finally { // 打印所有的警告信息
                SQLWarning w;
                              for(w=conn.getWarnings(); w != null; w=w.getNextWarning())
                                  System.err.println("WARNING: " + w.getMessage() +
                  ":" + w.getSQLState());
                          }
                      }
                  }
                  //打印連接數據庫失敗等錯誤信息,并顯示出來
                  catch (Exception e) {
                      System.err.println(e);
                      if (e instanceof SQLException)
                          System.err.println("SQL State: " +
                 ((SQLException)e).getSQLState());
                      System.err.println("Usage: java ExecuteSQL [-d <driver>] " +
                    "[-u <user>] [-p <password>] <database URL>");
                  }

                  // 每次退出程序或程序出現錯誤時關閉數據庫連接。關閉數據庫連接的同時也關閉了所有打開的statements和記錄集
                  finally {
                      try { conn.close(); } catch (Exception e) {}
                  }
              }
             
              /**
               * printResultsTable方法輸出記錄集的內容,此方法依賴于ResultSetMetaData類
               **/
              static void printResultsTable(ResultSet rs, OutputStream output)
           throws SQLException
              {
                  // 建立輸出流
                  PrintWriter out = new PrintWriter(output);
           
                  // 讀取記錄集
                  ResultSetMetaData metadata = rs.getMetaData();
                 
                  int numcols = metadata.getColumnCount(); // 列的數目
                  String[] labels = new String[numcols];   // 列標題
                  int[] colwidths = new int[numcols];     
                  int[] colpos = new int[numcols];        
                  int linewidth;                         
                 
                  linewidth = 1;
                  for(int i = 0; i < numcols; i++) {             // 保存每一列的位置和標簽
                      colpos[i] = linewidth;                    
                      labels[i] = metadata.getColumnLabel(i+1);

                      int size = metadata.getColumnDisplaySize(i+1);
                      if (size == -1) size = 30; 
               if (size > 500) size = 30; 
                      int labelsize = labels[i].length();
                      if (labelsize > size) size = labelsize;  
                      colwidths[i] = size + 1;            
                      linewidth += colwidths[i] + 2;    
                  }

                  StringBuffer divider = new StringBuffer(linewidth);
                  StringBuffer blankline = new StringBuffer(linewidth);
                  for(int i = 0; i < linewidth; i++) {
                      divider.insert(i, '-');
                      blankline.insert(i, " ");
                  }

                  for(int i=0; i<numcols; i++) divider.setCharAt(colpos[i]-1,'+');
                  divider.setCharAt(linewidth-1, '+');
                 
                  out.println(divider);

                  StringBuffer line = new StringBuffer(blankline.toString());
                  line.setCharAt(0, '|');
                  for(int i = 0; i < numcols; i++) {
                      int pos = colpos[i] + 1 + (colwidths[i]-labels[i].length())/2;
                      overwrite(line, pos, labels[i]);
                      overwrite(line, colpos[i] + colwidths[i], " |");
                  }
                 

                  out.println(line);
                  out.println(divider);
                 
                  // 使用next()方法遍歷記錄集,使用getObject方法獲得列的數值并輸出
                  while(rs.next()) {
                      line = new StringBuffer(blankline.toString());
                      line.setCharAt(0, '|');
                      for(int i = 0; i < numcols; i++) {
                          Object value = rs.getObject(i+1);
            if (value != null)
                overwrite(line, colpos[i] + 1, value.toString().trim());
                          overwrite(line, colpos[i] + colwidths[i], " |");
                      }
                      out.println(line);
                  }

                  out.println(divider);
                  out.flush();
              }

              static void overwrite(StringBuffer b, int pos, String s) {
                  int slen = s.length();                
                  int blen = b.length();                
                  if (pos+slen > blen) slen = blen-pos; 
                  for(int i = 0; i < slen; i++)        
                      b.setCharAt(pos+i, s.charAt(i));
              }
          }
          執行時如下所示:

          javac ExecuteSQL.java

          java ExecuteSQL -d com.microsoft.jdbc.sqlserver.SQLServerDrive
          r -u username -p password jdbc:microsoft:sqlserver://localhost:1433;databaseName=pubs

          16:26:54  |  固定鏈接 | 引用通告 (0) | 記錄它
          使用jdbc連接SQL Server數據庫
          使用java連接sql server數據庫首先需要安裝Microsoft SQL Server 2000 Driver for JDBC,可以從微軟的網站上下載,然后設置環境變量,CLASSPATH=.;c:\program files\Microsoft SQL Server 2000 Driver for JDBC\lib\msbase.jar;c:\program files\Microsoft SQL Server 2000 Driver for JDBC\lib\msutil.jar;c:\program files\Microsoft SQL Server 2000 Driver for JDBC\lib\mssqlserver.jar。設置了環境變量需要重新啟動計算機。
          然后使用微軟的示例代碼來測試一下連接是否可以建立成功:
          示例代碼如下:
          import java.sql.*;
          public class Connect{
               private java.sql.Connection  con = null;
               private final String url = "jdbc:microsoft:sqlserver://";
               private final String serverName= "localhost";
               private final String portNumber = "1433";
               private final String databaseName= "pubs";
               private final String userName = "username";
               private final String password = "password";
               // Informs the driver to use server a side-cursor,
               // which permits more than one active statement
               // on a connection.
               private final String selectMethod = "cursor";
               // Constructor
               public Connect(){}
               private String getConnectionUrl(){
                    return url+serverName+":"+portNumber+";databaseName="+databaseName+";selectMethod="+selectMethod+";";
               }
               private java.sql.Connection getConnection(){
                    try{
                         Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
                         con = java.sql.DriverManager.getConnection(getConnectionUrl(),userName,password);
                         if(con!=null) System.out.println("Connection Successful!");
                    }catch(Exception e){
                         e.printStackTrace();
                         System.out.println("Error Trace in getConnection() : " + e.getMessage());
                   }
                    return con;
                }
               /*
                    Display the driver properties, database details
               */
               public void displayDbProperties(){
                    java.sql.DatabaseMetaData dm = null;
                    java.sql.ResultSet rs = null;
                    try{
                         con= this.getConnection();
                         if(con!=null){
                              dm = con.getMetaData();
                              System.out.println("Driver Information");
                              System.out.println("\tDriver Name: "+ dm.getDriverName());
                              System.out.println("\tDriver Version: "+ dm.getDriverVersion ());
                              System.out.println("\nDatabase Information ");
                              System.out.println("\tDatabase Name: "+ dm.getDatabaseProductName());
                              System.out.println("\tDatabase Version: "+ dm.getDatabaseProductVersion());
                              System.out.println("Avalilable Catalogs ");
                              rs = dm.getCatalogs();
                              while(rs.next()){
                                   System.out.println("\tcatalog: "+ rs.getString(1));
                              }
                              rs.close();
                              rs = null;
                              closeConnection();
                         }else System.out.println("Error: No active Connection");
                    }catch(Exception e){
                         e.printStackTrace();
                    }
                    dm=null;
               }
               private void closeConnection(){
                    try{
                         if(con!=null)
                              con.close();
                         con=null;
                    }catch(Exception e){
                         e.printStackTrace();
                    }
               }
               public static void main(String[] args) throws Exception
                 {
                    Connect myDbTest = new Connect();
                    myDbTest.displayDbProperties();
                 }
          }
          保存為Connect.java,編譯執行:
          javac Connect.java
          java Connect
          結果應該顯示出來:Connection Successful!
          更詳細的內容可以查看微軟網頁:

          posted on 2006-03-11 16:38 sparkwu 閱讀(284) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 玉溪市| 龙川县| 弥勒县| 台州市| 平陆县| 工布江达县| 宜州市| 呼和浩特市| 中方县| 渭南市| 大同市| 南安市| 吴堡县| 南江县| 高陵县| 奇台县| 车致| 民勤县| 宾川县| 晴隆县| 花垣县| 舞钢市| 长泰县| 新民市| 临城县| 黔西县| 喀喇沁旗| 镇康县| 灯塔市| 浏阳市| 永安市| 安宁市| 尚志市| 仙桃市| 天镇县| 仪征市| 湘阴县| 甘洛县| 兴海县| 滦南县| 霍林郭勒市|