轉貼(使用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) 連接池:在內存中保存了一個數據庫連接,不需要注冊驅動器,提高性能的重要方法。 | ||||
| ||||
| ||||
| ||
執行sql語句 | ||||
import java.sql.*; /** // 讀取輸入的參數 // 數據庫的url參數必須輸入. // 如果啟動程序的時候輸入了驅動,那么使用用戶輸入的參數動態注冊數據庫驅動 // 建立到數據庫的連接。jdbc會使用它所知道的所有的數據庫驅動來建立與數據庫的連接。 // 創建statement對象來與數據庫進行交互 //從命令提示符中讀取sql命令 //循環執行用戶輸入的sql語句 // 輸入“quit”,退出程序. // 忽略空行輸入 boolean status = s.execute(sql); // 判斷是否有更多的記錄集 // 每次退出程序或程序出現錯誤時關閉數據庫連接。關閉數據庫連接的同時也關閉了所有打開的statements和記錄集 int size = metadata.getColumnDisplaySize(i+1); StringBuffer divider = new StringBuffer(linewidth); for(int i=0; i<numcols; i++) divider.setCharAt(colpos[i]-1,'+'); StringBuffer line = new StringBuffer(blankline.toString()); out.println(line); out.println(divider); static void overwrite(StringBuffer b, int pos, String s) { javac ExecuteSQL.java java ExecuteSQL -d com.microsoft.jdbc.sqlserver.SQLServerDrive | ||||
| ||||
| ||||
| ||
使用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!
更詳細的內容可以查看微軟網頁:
|
|