數據庫連接
獲取數據庫連接有兩種方法,壹種是通過驅動程序管理器DriverManager類,另壹種則是使用DataSource接口。這兩種方法都提供了了壹個getConnection方法,用戶可以在程序中對它們進行相應處理後調用這個方法來返回數據庫連接。
DriverManager類 DataSource接口 Connection接口 JDBC URLjdbc:<subprotocol>:<subname>
驅動程序註冊方法(1)調用Class.forName方法
(2)設置jdbc.drivers系統屬性
DriverManager方法DriverManager類中的所有方法都是靜態方法,所以使用DriverManager類的方法時,不必生成實例。
DriverManager
getConnection方法作用是用於獲取數據庫連接,原型如下:
public static Connection getConnection(String url)
throws SQLException;
public static Connection getConnection(String url, String user, String password)
throws SQLException;
public static Connection getConnection(String url, Properties info)
throws SQLException;
使用DriverManager的getConnetion方法Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection
("jdbc:odbc:sqlserver", "sa", "sa");
使用設置jdbc.drivers系統屬性的方法java -Djdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver test.java
DataSource 接口
……
//從上下文中查找數據源,並獲取數據庫連接
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("sqlserver");
Connection conn = ds.getConnection();
//查詢數據庫中所有記錄
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM student");
……
Connection 接口
Connection接口代表了已經建立的數據庫連接,它是整個JDBC的核心內容。Connnection接口中的方法按照它們所實現的功能,可以分為三類:
生成數據庫語句 管理數據庫事務 獲取數據庫信息生成數據庫語句
JDBC將數據庫語句分成三種類型 :
生成Statement 語句 :Connection.createStatement()
生成PreparedStatement 語句 :Connection. prepareStatement()
生成CallableStatement 語句 :Connection. prepareCall ()
管理數據庫事務
默認情況下,JDBC將壹條數據庫語句視為壹個完整的事務。可以關掉默認事務管理:public void setAutoCommit(Boolean autoCommit) throws SQLException;
將autoCommit的值設置為false,就關掉了自動事務管理模式
在執行完事務後,應提交事務:public void commit() throws SQLException;
可以取消事務:public void rollback() throws SQLException;
第二講 第四部分
數據庫語句
數據庫語句
JDBC數據庫語句***有三種類型:
Statement:Statement語句主要用於嵌入壹般的SQL語句,包括查詢、更新、插入和刪除等等。
PreparedStatement:PreparedStatement語句稱為準備語句,它是將SQL語句中的某些參數暫不指定,而等到執行時在統壹指定。
CallableStatement:CallableStatement用於執行數據庫的存儲過程。
Statement 語句
executeQuery方法 executeUpdate方法 execute方法 close方法executeQuery方法
executeQuery方法主要用於執行產生單個結果集的SQL查詢語句(QL),即SELECT語句。executeQuery方法的原型如下所示: public ResultSet executeQuery(String sql) throws SQLException;executeUpdate方法
executeUpdate方法主要用於執行 INSERT、UPDATE、DELETE語句,即SQL的數據操作語句(DML) executeUpdate方法也可以執行類似於CREATE TABLE和DROP TABLE語句的SQL數據定義語言(DDL)語句 executeUpdate方法的返回值是壹個整數,指示受影響的行數(即更新計數)。而對於CREATE TABLE 或 DROP TABLE等並不操作特定行的語句,executeUpdate的返回值總為零。execute方法
execute方法用於執行:
返回多個結果集 多個更新計數 或二者組合的語句execute方法
返回多個結果集:首先要調用getResultSet方法獲得第壹個結果集,然後調用適當的getter方法獲取其中的值。要獲得第二個結果集,需要先調用getMoreResults方法,然後再調用getResultSet方法。 返回多個更新計數:首先要調用getUpdateCount方法獲得第壹更新計數。然後調用getMoreResults,並再次調用getUpdateCount獲得後面的更新計數。 不知道返回內容:如果結果是ResultSet對象,則execute方法返回true;如果結果是int類型,則意味著結果是更新計數或執行的語句是DDL命令。execute方法
為了說明如果處理execute方法返回的結果,下面舉壹個代碼例子:
stmt.execute(query);
while (true) {
int row = stmt.getUpdateCount();
//如果是更新計數
if (row > 0) {
System.out.println("更新的行數是:" + row);
stmt.getMoreResults();
continue;
}
execute方法
//如果是DDL命令或0個更新
if (row == 0) {
System.out.println("沒有更新,或SQL語句是壹條DDL語句!");
stmt.getMoreResults();
continue;
}
//如果是壹個結果集
ResultSet rs = stmt.getResultSet;
if (rs != null) {
while (rs.next()) {
// 處理結果集
. . .
}
stmt.getMoreResults();
continue;
}
break;
}
PreparedStatement 語句
登錄壹個網站或BBS時 :
使用Statement語句Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery
(“SELECT password FROM userinfo
WHERE id=userId");
使用PreparedStatement語句PreparedStatement pstmt=conn.prepareStatement
(“SELECT password FROM userinfo
WHERE id=?");
pstmt.setString(1, userId);
PreparedStatement語句
常用的setter方法public void setBoolean(int parameterIndex, boolean x) throws SQLException;
public void setByte(int parameterIndex, byte x) throws SQLException;
public void setShort(int parameterIndex, short x) throws SQLException;
public void setInt(int parameterIndex,int x) throws SQLException;
public void setLong(int parameterIndex, long x) throws SQLException;
public void setFloat(int parameterIndex, float x) throws SQLException;
public void setDouble(int parameterIndex, double x) throws SQLException;
public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException;
public void setString(int parameterIndex, String x) throws SQLException;
public void setBytes(int parameterIndex, byte[] x) throws SQLException;
public void setDate(int parameterIndex, Date x) throws SQLException;
public void setTime(int parameterIndex, Time x) hrows SQLException;
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException;
PreparedStatement語句
PreparedStatement接口是由Statement接口擴展而來的,重寫了executeQuery方法、executeUpdate方法和execute 方法 public ResultSet executeQuery() throws SQLException public int executeUpdate() throws SQLException public boolean execute() throws SQLExceptionCallableStatement語句
CallableStatement語句是由Connection接口的prepareCall方法創建的,創建時需要傳入字符串參數,參數的形式為: {call procedure_name[(?, ?, ...)]} {? = call procedure_name[(?, ?, ...)]} {call procedure_name}CallableStatement語句
其中的問號是參數占位符,參數***有兩種: IN參數 OUT參數 IN參數使用setter方法來設置 OUT參數則使用registerOutParameter方法來設置CallableStatement 語句
CallableStatement cstmt = con.prepareCall
("{call getTestData(?, ?)}");
cstmt.registerOutParameter
(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter
(2, java.sql.Types.DECIMAL, 3);
cstmt.executeQuery();
byte x = cstmt.getByte(1);
java.math.BigDecimal n =
cstmt.getBigDecimal(2, 3);
第二講 第五部分
結 果 集
結果集
JDBC為了方便處理查詢結果,又專門定義了壹個接口,這個接口就是ResultSet接口。ResultSet接口提供了可以訪問數據庫查詢結果的方法,通常稱這個接口所指向的對象為結果集。 有兩種方法得到結果集,壹種是直接執行查詢語句,將結果存儲在結果集對象上;另壹種是不存儲返回結果,而在需要時調用數據庫語句的getResultSet方法來返回結果集結果集
結果集指針由於返回的結果集可能包含多條數據記錄,因此ResultSet 接口提供了對結果集的所有數據記錄輪詢的方法。結果集自動維護了壹個指向當前數據記錄的指針,初始時這個指針是指向第壹行的前壹個位置。 next 方法就是用於向前移動指針的
結果集
結果集屬性默認情況下,結果集是壹個不可更新集,並且結果集的指針也只能向前移動。也就是說,在得到了壹個結果集之後,用戶只能按照從第壹條記錄到最後壹條記錄的順序依次向後讀取,而不能跳到任意條記錄上,也不能返回到前面的記錄。不僅如此,結果集的這種輪詢只能進行壹次,而不能再將指針重置到初始位置進行多次輪詢
結果集
結果集屬性類型
並發性
有效性
屬性的設置是在生成數據庫語句時通過向生成方法傳入相應的參數設定的,而當結果集已經返回時就不能夠再改變它的屬性了。結果集生成Statement語句***有三種方法
public Statement createStatement() throws SQLException;
public Statement createStatement
(int resultSetType, int resultSetConcurrency)
throws SQLException;
public Statement createStatement
(int resultSetType, int resultSetConcurrency,
int resultSetHoldability)
throws SQLException;
結果集
生成PreparedStatement語句***有六種方法public PreparedStatement prepareStatement(String sql) throws SQLException;
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
throws SQLException;
public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
throws SQLException;
public PreparedStatement prepareStatement(String sql, int resultSetType,
int resultSetConcurrency)
throws SQLException;
public PreparedStatement prepareStatement(String sql, int resultSetType,
int resultSetConcurrency,
int resultSetHoldability)
throws SQLException;
public PreparedStatement prepareStatement(String sql. String[] columnNames)
throws SQLException;
結果集
生成CallableStatement語句***有三種方法public CallableStatement prepareCall(String sql)
throws SQLException;
public CallableStatement prepareCall
(String sql, int resultSetType,
int resultSetConcurrency)
throws SQLException;
public CallableStatement prepareCall
(String sql, int resultSetType,
int resultSetConcurrency,
int resultSetHoldability)
throws SQLException;
結果集
結果集類型
結果集的類型***有三種,TYPE_FORWARD_ONLY類型的結果集只能向前移動指針,而TYPE_SCROLL_INSENSITIVE類型和TYPE_SCROLL_SENSITIVE類型的結果集則可以任意移動指針。後兩種類型的區別在於,前者對來自其它處的修改不敏感(靜態),而後者則對於別人的修改敏感(動態視圖)。結果集
結果集類型
對於可以任意移動指針的結果集,可以用來移動指針的方法包括: next 和previous : absolute 和relative :參數可正可負 afterLast 、beforeFirst 、last 和first :結果集
結果集並發性
結果集的並發性***有兩種,CONCUR_READ_ONLY的結果集是只讀而不可更新的;而CONCUR_UPDATABLE的結果集則是可以通過update方法進行更新的。 ResultSet接口提供了壹組update方法,用於更新結果集中的數據。這些方法與PreparedStatement接口中定義的setter方法壹樣,也是與類型相對應的。所有的update方法都以update開頭 。 所有的update方法都有兩個參數,第壹個參數用於指定更新的列,它可以是列名稱也可以是列的序號;第二個參數則表示將要更新列的值。結果集
結果集並發性
Statement stmt = conn.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("SELECT * FROM student " + "WHERE grade=2 AND math>60 AND physics>60 AND " + "chemistry>60 AND english>60 AND chinese>60"); while(rs.next()){ rs.updateString("grade", "3"); rs.updateRow(); }結果集
結果集有效性
結果集的有效性是指在調用了Connection 接口的commit 方法後,結果集是否自動關閉。所以它只有兩個可選值,即HOLD_CURSORS_OVER_COMMIT 和CLOSE_CURSORS_AT_COMMIT 。前者表示調用commit 方法之後,結果集不關閉;而後者則表示關閉結果集。結果結果集
結果集的getter方法ResultSet接口還提供了壹組getter方法,用於返回當前記錄的屬性值。它們都是以get開頭的,後接數據類型。比如,如果要返回壹個float類型的列值,則應調用getFloat方法。每壹種類型的getter方法都有兩種形式,它們的名稱相同而參數不同。這兩種形式的getter方法都只有壹個參數,第壹種形式的getter方法參數是String類型的,用於指定列的名稱;另外壹種形式的getter方法參數則是int類型的,用於指定列的序號。