天天看點

java基礎-使用jdbc通路資料庫

java基礎-使用jdbc通路資料庫 [2006-5-29]

jybbh 發表在 SQL

java基礎

使用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) | 記錄它

固定連結 關閉

spaces.msn.com/myblog2005/blog/cns!AE12B0991C5BB49B!108.entry

執行sql語句

import java.sql.*;

import java.io.*;

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) {}

}

}

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

使用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;

}

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!