JDBC是什麼
JDBC(Java Data Base Connectivity,java資料庫連接配接)是一種用于執行SQL語句的Java API,可以為多種關系資料庫提供統一通路,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以建構更進階的工具和接口,使資料庫開發人員能夠編寫資料庫應用程式,同時,JDBC也是個商标名。
有了JDBC,向各種關系資料發送SQL語句就是一件很容易的事。換言之,有了JDBC API,就不必為通路Sybase資料庫專門寫一個程式,為通路Oracle資料庫又專門寫一個程式,或為通路Informix資料庫又編寫另一個程式等等,程式員隻需用JDBC API寫一個程式就夠了,它可向相應資料庫發送SQL調用。同時,将Java語言和JDBC結合起來使程式員不必為不同的平台編寫不同的應用程式,隻須寫一遍程式就可以讓它在任何平台上運作,這也是Java語言“編寫一次,處處運作”的優勢
Java資料庫連接配接體系結構是用于Java應用程式連接配接資料庫的标準方法。JDBC對Java程式員而言是API,對實作與資料庫連接配接的服務提供商而言是接口模型。作為API,JDBC為程式開發提供标準的接口,并為資料庫廠商及第三方中間件廠商實作與資料庫的連接配接提供了标準方法。JDBC使用已有的SQL标準并支援與其它資料庫連接配接标準,如ODBC之間的橋接。JDBC實作了所有這些面向标準的目标并且具有簡單、嚴格類型定義且高性能實作的接口。
JDBC接口及資料庫廠商的實作
● DriverManager 驅動管理
● Connection
● DatebaseMetaData 連接配接接口
● Statement
● PreparedStatement
● CallableStatement 語句對象接口
● ResultSet
● ResultSetMetaData 結果集接口
JDBC的工作原理
● JDBC定義接口
● 資料庫廠商實作接口
● 程式員調用接口,實際調用的是底層資料庫廠商實作的部分
JDBC的工作流程
- 加載驅動,建立連接配接
- 建立語句對象
- 執行SQL語句
- 處理結果集
- 關閉連接配接
Driver接口及驅動類的加載
—前提需要有驅動jar包
Class.forName(“oracle.jdbc.driver.OracleDriver“);–oracle資料庫
資料庫類型對應的Jar檔案
Connection接口
Connection conn = DriverManager.getConnection(“URL”,”username”,”password”);
各種資料庫對應的驅動類名和URL格式
其中hostip代表ip位址,dbname代表資料庫名。
資料庫 | 驅動類名 | URL格式 |
Oracle | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@hostip:1521:dbname |
Sybase | com.sybase.jdbc2.jdbc.SybDriver | jdbc:sybase:Tds:hostip:4100/dbname |
Mysql | com.mysql.jdbc.Driver | jdbc:mysql://hostip:3306/dbname?useUnicode=true&characterEncoding=GBK |
SQLServer 2000 | com.microsoft.jdbc.sqlserver.SQLServerDriver | jdbc:microsoft:sqlserver://hostip:1433;DatabaseName=dbname |
SQLServer 2005 | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:sqlserver://hostip:1433;DatabaseName=dbname |
SQLServer 7.0 | net.sourceforge.jtds.jdbc.Driver | jdbc:jtds:sqlserver://hostip:1433/dbname |
DB2 | com.ibm.db2.jcc.DB2Driver | jdbc:db2://hostip:50000/dbname |
Informix | com.informix.jdbc.IfxDriver | jdbc:informix-sqli://hostip:port/bname:informixserver=dbservername |
Statement接口
Statement stmt = conn.creatStatement();
stmt用于來執行SQL語句
ResultSet接口
執行查詢SQL語句後傳回的的結果集,由ResultSet接口接收
常用的處理方式:周遊/判斷是否有結果
[圖檔]
- 查詢的結果存放在ResultSet對象的一系列行中(可以了解為Map)
- ResultSet對象的最初位置在行首(資料庫段名那一行)
- ResultSet對象的最初位置在行首(資料庫段名那一行)
- ResultSet.next()方法用來在行間移動
- ResultSet.getXXX()方法用來擷取字段的内容
下面的示例來示範基本用法
Oracle資料庫中職員emp表的表結構如表-1所示:
職員表emp 資訊
職員表 emp中的示例資料所示
本案例要求使用JDBC連接配接Oracle資料庫,查詢emp表的所有員工的ID、姓名、薪資以及入職時間。
代碼:
1. import java.sql.Connection;
2. import java.sql.DriverManager;
3. import java.sql.ResultSet;
4. import java.sql.SQLException;
5. import java.sql.Statement;
6. public class EmpDAO {
7. public static void main(String[] args) {
8. EmpDAO dao = new EmpDAO();
9. dao.findAll();
10. }
11. public void findAll() {
12. Connection con = null;
13. Statement stmt = null;
14. ResultSet rs = null;
15. try {
16. Class.forName("oracle.jdbc.OracleDriver");
17. con = DriverManager.getConnection(
18. "jdbc:oracle:thin:@localhost:1521:ORCL","scott","tiger");
19. stmt = con.createStatement();
20. rs = stmt .executeQuery("select empno, ename, sal, hiredate from emp");
21. while (rs.next()) {
22. System.out.println(rs.getInt("empno") + ","
23. + rs.getString("ename") + ","
24. + rs.getDouble("sal") + "," + rs.getDate("hiredate"));
25. }
26. } catch (ClassNotFoundException e) {
27. System.out.println("驅動類無法找到!");
28. throw new RuntimeException(e);
29. } catch (SQLException e) {
30. System.out.println("資料庫通路異常!");
31. throw new RuntimeException(e);
32. } finally {
33. try {
34. if (rs != null) {
35. rs.close();
36. }
37. if (stmt != null) {
38. stmt.close();
39. }
40. if (con != null) {
41. con.close();
42. }
43. } catch (SQLException e) {
44. System.out.println("關閉連接配接時發生異常");
45. }
46. }
47. }
48. }
運作結果為:
7369,SMITH,,800.0,1980-12-17
7499,ALLEN,,1600.0,1981-02-20
7521,WARD,,1250.0,1981-02-22
7566,JONES,,2975.0,1981-04-02
7654,MARTIN,,1250.0,1981-09-28
7698,BLAKE,,2850.0,1981-05-01
7782,CLARK,,2450.0,1981-06-09
7788,SCOTT,,3000.0,1987-04-19
7839,KING,,5000.0,1981-11-17
7844,TURNER,,1500.0,1981-09-08
7876,ADAMS,,1100.0,1987-05-23
7900,JAMES,,950.0,1981-12-03
7902,FORD,,3000.0,1981-12-03
7934,MILLER,,1300.0,1982-01-23