JDBC 4.2 是Java SE 8的一部分,本系列文章基于JDK 1.8 对 JDBC 4.2 进行学习:
1、JDBC 简介
Java数据库连接(Java DataBase Connection)API提供Java编程语言的通用数据访问。 使用JDBC API,您几乎可以访问任何数据源,从关系数据库到电子表格和平面文件。 JDBC技术还提供了可以构建工具和备用接口的通用基础。
JDBC API由两个包组成:
要将JDBC API与特定数据库管理系统一起使用,您需要一个基于JDBC技术的驱动程序在JDBC和数据库之间进行调解。
根据各种因素,驱动程序可能纯粹是用Java编程语言编写的,也可能是Java编程语言和Java Native Interface(JNI)本机方法的混合编写。 要获取特定数据库管理系统的JDBC驱动程序,请参阅JDBC Data Access API。
在JDBC之前,ODBC API是用于连接和执行数据库查询的数据库API。 但是,ODBC API使用用C语言编写的ODBC驱动程序(即依赖于平台和不安全)。 这就是为什么Java定义了自己的API(JDBC API),它使用JDBC驱动程序(用Java语言编写)。
我们可以使用JDBC API通过Java程序操作数据库:
2、JDBC 架构
JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由两层组成:
- JDBC API: 提供了应用程序对JDBC的管理连接。
- JDBC Driver API: 支持JDBC管理到驱动器连接。
- JDBC API的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库。
- JDBC驱动程序管理器可确保正确的驱动程序来访问每个数据源。该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动程序。
以下是JDBC结构图,它显示了驱动程序管理器方面的JDBC驱动程序和Java应用程序的位置:
2.1、常用的JDBC组件
JDBC API提供了以下接口和类:
DriverManager: 这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。
Driver: 此接口处理与数据库服务器通信。很少直接直接使用驱动程序(Driver)对象,一般使用DriverManager中的对象,它用于管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息
Connection: 此接口与接触数据库的所有方法。连接对象表示通信上下文,即,与数据库中的所有的通信是通过此唯一的连接对象。
Statement: 可以使用这个接口创建的对象的SQL语句提交到数据库。一些派生的接口接受除执行存储过程的参数。
ResultSet: 这些对象保存从数据库后,执行使用Statement对象的SQL查询中检索数据。它作为一个迭代器,可以通过移动它来检索下一个数据。
SQLException: 这个类用于处理发生在数据库应用程序中的任何错误。
3、JDBC 4.2 新特性
JDBC 4.2是Java SE 8的一部分,它引入了以下功能:
- 增加了REF_CURSOR支持。
- 添加java.sql.DriverAction接口
- 添加java.sql.SQLType接口
- 添加java.sql.JDBCType枚举
- 添加对大量更新计数的支持
- 对现有接口的更改
- Rowset 1.2:JDBC RowSet 增强功能。
3.1、增加了REF_CURSOR支持
- 多个数据库支持REF_CURSOR数据类型。
- 要从存储过程返回 REF_CURSOR,请使用方法 CallableStatement.registerOutParameter 并指定 Types.REF_CURSOR 作为要返回的数据类型。
- 要检索表示 REF_CURSOR 的ResultSet实例,请调用方法 CallablStatement.getObject,并将ResultSet指定为要将返回对象转换为的数据类型。 返回的结果集是一个正向的只读结果集。
如果调用方法registerOutParameter并指定Types.REF_CURSOR作为要返回的数据类型,并且JDBC驱动程序不支持此数据类型,则抛出SQLFeatureNotSupportedException。
以下示例从具有CallableStatement类的REF_CURSOR获取ResultSet实例:
CallableStatement cstmt = conn.prepareCall("{callmySproc(?)}");
cstmt.registerOutParameter(1, Types.REF_CURSOR);
cstmt.executeQuery();
ResultSet rs = cstmt.getObject(1, ResultSet.class);
while(rs.next()){
System.out.println("Name="+ rs.getString(1));
}
要确定JDBC驱动程序是否支持REF_CURSOR,可以使用 DatabaseMetaData.supportsRefCursors 方法进行检查。
3.2、添加java.sql.DriverAction接口
- 如果想要被DriverManager类通知,任何实现java.sql.Driver的类必须实现该接口。
- JDBC驱动程序的静态初始化块必须调用方法 DriverManager.registerDriver(java.sql.Driver,java.sql.DriverAction),以通知DriverManager类在取消注册JDBC驱动程序时调用哪个DriverAction实现。
- 如果启用了SecurityManager,则DriverManager.deregisterDriver方法需要权限。
3.3、添加java.sql.SQLType接口
此接口用于创建标识通用SQL类型的对象,称为JDBC类型或特定于供应商的数据类型。
3.4、添加java.sql.JDBCType枚举
此枚举标识通用SQL类型,称为JDBC类型。 使用JDBCType代替Types.java中定义的常量。
3.5、添加对大量更新计数的支持
JDBC方法仅返回更新计数的int值。 随着数据集的不断增长,这也带来了问题。 因此,Statement类中添加了一些方法,它返回更新计数的long值。 当返回的行数超过常量Integer.MAX_VALUE时,应使用这些方法。
3.6、对现有接口的更改
以下是增强接口列表:
- java.sql.Driver
- java.sql.DriverManager
- java.sql.DatabaseMetaData
- java.sql.Date
- java.sql.Time
- java.sql.TimeStamp
- java.sql.Statement
- java.sql.CallableStatement
- java.sql.PreparedStatement
- java.sql.ResultSet
- java.sql.SQLInput
- java.sql.SQLOutput
- java.sql.Types
- javax.sql.DataSource and javax.sql.XADataSource
- java.sql.SQLXML
3.7、Rowset 1.2 功能增强
下面列出了为RowSet1.2增强的接口和类:
- javax.sql.rowset.BaseRowSet
- javax.sql.rowset.CachedRowSet
- javax.sql.rowset.Predicate
- javax.sql.rowset.JdbcRowSet
- javax.sql.rowset.RowSetMetaDataImpl
- javax.sql.rowset.spi.SyncFactory
- javax.sql.rowset.serial.SerialArray
- javax.sql.rowset.serial.SerialBlob
- javax.sql.rowset.serial.SerialClob
- javax.sql.rowset.serial.SerialDatalink
- javax.sql.rowset.serial.SerialJavaObject
- javax.sql.rowset.serial.SerialRef
- javax.sql.rowset.serial.SerialStruct
参考资料:
https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/
https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html