1.JDBC介紹
1.1.What is JDBC?
1. JDBC(Java Database Connectivity)是基於JAVA語言訪問數據庫的一種技術。
2. JDBC 的設計思想:由 SUN 公司(JCP)提供訪問數據庫的接口,由數據庫廠商提
供對這些接口的實現,程序員編程時都是針對接口進行編程的。
3. JDBC 包括一套 JDBC 的 API 和一套程序員和數據庫廠商都必須去遵照的規範。
1) java.sql包:提供訪問數據庫基本的功能
2) javax.sql包:提供擴展的功能
4. 數據庫中間件
5. JDBC能夠作些什麼?
1) 鏈接到數據庫
2) 在Java app中執行SQL命令
java
3) 處理結果 。mysql
1.2.Five important interfaces of JDBC
程序員
1. Connection:特定數據庫的鏈接(會話)。在鏈接上下文中執行 SQL 語句
並返回結果
2. Statement:用於執行靜態 SQL 語句並返回它所生成結果的對象
3. PreparedStatement:表示預編譯的 SQL 語句的對象
4. CallableStatement:用於執行 SQL 存儲過程的接口
5. ResultSet:表示數據庫結果集的數據表,一般經過執行查詢數據庫的語
sql
句生成數據庫
2.The step of developping a JDBC App
2.1. 註冊 JDBC 驅動程序
1. Class.forName("oracle.jdbc.driver.OracleDriver");
2. Class.forName("oracle.jdbc.driver.OracleDriver");
3. java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver com.FirstJDBC編程
2.2. 建立數據庫鏈接( 獲取 Connection 的方法)
經過DriverManager 獲取
Connection conn = DriverManager.getConnection(url, 「username", 「password");
1) JDBC的URL=協議名+子協議名+數據源名。
a 協議名老是「jdbc」。
b 子協議名由JDBC驅動程序的編寫者決定。
c 數據源名也可能包含用戶與口令等信息;這些信息也可單獨提供。
2) 幾種常見的數據庫鏈接
-------------------------------jdbc-odbc---------------
驅動:sun.jdbc.odbc.JdbcOdbcDriver
URL:jdbc:odbc:datasource_name
-------------------------------oracle------------------
驅動:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@<machine_name><:port>:dbname
注:machine_name:數據庫所在的機器的名稱;
port:端口號,默認是1521
-------------------------------mysql-------------------
驅動:org.gjt.mm.mysql.Driver
or: com.mysql.jdbc.Driver
URL:jdbc:mysql://<machine_name><:port>/dbname
注:machine_name:數據庫所在的機器的名稱;
port:端口號,默認3306
---------------------------SQL Server------------------
驅動:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>
注:machine_name:數據庫所在的機器的名稱;
port:端口號,默認是1433
--------------------------DB2--------------------------
驅動:com.ibm.db2.jdbc.app.DB2Driver
URL:jdbc:db2://<machine_name><:port>/dbname
注:machine_name:數據庫所在的機器的名稱;
port:端口號,默認是5000
-------------------------------------------------------
2.3. 建立 SQL( 存儲過程)
2.3.1. 建立 Statement 對象
1. Statement stm = con.createStatement();
2. 主要方法
1) 執行查詢 SQL 語句(返回結果集)
ResultSet executeQuery(String sql)throws SQLException;
2) 執行更新 SQL 語句(返回受影響的行數)
int rows = executeUpdate(String sql)throws SQLException
3) 萬能執行 SQL 語句(若是第一個結果爲 ResultSet 對象,則返回 true;若是其爲更
新計數或者不存在任何結果,則返回 false)
boolean flag=stmt.execute(sql);
ResultSet rs=null;
int rows=0;
if(flag){
rs=stmt.getResultSet();
}
else{
rows=stmt.getUpdateCount();
}
2.3.2. PreparedStatement
1. 用來處理 SQL 結構、關鍵部分相同的 SQL 語句
2. pstmt=conn.prepareStatement(sql);
3. 例子
String sql = "SELECT * FROM student WHERE stu_sex=?";
//?表明一個佔位符合,它的值是待定的。
pstmt=conn.prepareStatement(sql);
//下面的語句設置?的值
//第一參數是?的索引位置
//第二參數:把?的值設置成這個參數
pstmt.setString(1, 「f");
rs=pstmt.executeQuery();
String sql = "INSERT INTO student(stu_name,stu_sex,stu_age,stu_desc,stu_grade)
VALUES(?,?,?,?,?)";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, "LILY");
pstmt.setString(2, "F");
pstmt.setInt(3, 23);
pstmt.setString(4, "***");
pstmt.setString(5, "sd0702");
pstmt.executeUpdate();
2.3.3. CallableStatement
1. 用來執行存儲過程
2. CallableStatement cstmt=con.prepareCall(sql);
3. 例子
String sql = "CALL getTotalStudent(?,?)";
CallableStatement cstmt=con.prepareCall(sql);
// 設置OUT和IN參數
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setString(2, "xxx");
建立一個存儲過程
in:參數從Java程序傳到數據庫的存儲過程
out:反過來
SQl語句中建立存儲過程:
1) delimiter //
2)
CREATE PROCEDURE getTotalStudent(OUT totalStudent integer(11),IN sex char(2))
BEGIN
SELECT count(*) INTO totalStudent FROM
student
WHERE stu_sex LIKE sex;
END//
3) delimiter ;
2.3.4. Statement 接口的比較
Statement接口的比較
|
Statement |
PreparedStatement |
CallableStatement |
代碼建立 |
數據庫服務器的客戶端 |
數據庫服務器的客戶端 |
數據庫服務器端 |
代碼存儲 |
客戶端 |
服務器端 |
服務器端 |
編程語言 |
Java、SQL |
Java、SQL |
服務器端特定數據庫 語言 |
可配置性 |
靈活 |
差 |
差 |
可移植性 |
高 |
高 |
(支持)差 |
效率 |
低 |
第一次低,之後高 |
高 |
選擇:沒有最好,只有最合適!
建議:能夠移植性好首先考慮的條件!而後再考慮性能問題!
2.4.How to handle resultset
1. 經過 index 獲取字段的值 。
String getString(int columnIndex) //int類型的參數
SELECT * FROM student;//默認順序按表裏的定義順序
rs.getString(3);//stu_sex
SELECT stu_name,stu_sex,stu_desc FROM student;
rs.getString(3);//stud_desc
columnIndex:select子句中該字段的索引位置
2. 經過字段名獲取字段的值。
String getString(String columnName) //String類型的參數
以 Java 編程語言中 String 的形式檢索此 ResultSet 對象的當前行中指定列的值。
rs.getString("stu_name");//stu_name
rs.getInt("stu_id");//stu_id
3. Java 類型到 SQL 類型的映射。
2.5. 關閉 JDBC
1. 首先關閉記錄集; 2. 其次關閉Statement; 3. 最後關閉鏈接對象。 if(rs !=null){ try{rs.close();}catch(SQLException e){e.printStackTrace();}} if(stm!=null){try{stm.close();}catch(SQLException e){e.printStackTrace();}} if(con!=null){try{con.close();}catch(SQLException e){e.printStackTrace();}}