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