JDBC规范二-JDBC API中的类与接口
yuyutoo 2024-10-12 00:48 5 浏览 0 评论
通过前面学习,我们了解了使用JDBC API操作数据源的步骤,并以一个案例介绍了如何使用JDBC API操作关系型数据库。JDBC API中的内容远不止这些,本节我们就来全面地学习JDBC API中的一些类和接口。JDBC API由java.sql和javax.sql两个包构成,接下来会分两个小节对这两个包的内容进行详细介绍。
1.java.sql包详解
java.sql包中涵盖JDBC最核心的API,下面是java.sql包中的所有接口、枚举和类:
#数据类型
java.sql.Array
java.sql.Blob
java.sql.Clob
java.sql.Date
java.sql.NClob
java.sql.Struct
java.sql.Time
java.sql.Timestamp
java.sql.SQLXMI
java.sql.Ref
java.sql.RowId
java.sql.SQLOutput
java.sql.SQLData
java.sql.SQLInput
#枚举
java.sql.SQLType
java.sql.JDBCType
java.sql.Types
java.sgl.RowIdLifeTime
java.sal.PseudoColumnUsage
java.sql.ClientinfoStatus
#API相关
java.sql.Wrapper
java.sgl.Connection
java.sgl.Statement
java.sql.CallableStatement
java.sql.PreparedStatement
java.sql.DatabaseMetaData
java.sql.ParameterMetaData
ava.sql.ResultSet
ava.sql.ResultSetMetaData
#驱动相关
java.sql.Driver
java.sql.DriverAction
java.sql.DriverManager
java.sql.DriverPropertyInfo
java.sql.SOLPermission
java.sql.Savepoint
#异常
java.sgl.BatchUpdateException
java.sql.DataTruncation
java.sql.SQLClientInfoException
java.sql.SQLDataException
java.sql.SQLException
java.sql.SQLFeatureNotSupportedException
java.sql.SQLIntegrityConstraintViolationExceptionava.sql.SOLInvalidAuthorizationSpecException
java.sql.SOLNonTransientConnectionException
java.sql.SOLNonTransientException
java.sql.SOLSyntaxErrorException
java.sgl.SQLTimeoutException
java.sql.SOLTransactionRollbackException
java.sql.SQLTransientConnectionException
java.sql.SOLTransientException
java.sgl.SQLWarning
如上面的列表所示,java.sql包中的内容不多,大致可以分为数据类型接口、枚举类、驱动相关类和接口、异常类。
除这几部分外,剩下的就是作为Java开发人员需要掌握的API,主要包括下面几个接口:
java.sql.Wrapper
java.sql.Connection
java.sql.Statement
java.sql.CallableStatement
java.sql.PreparedStatement
java.sql.DatabaseMetaData
java.sql.ParameterMetaData
java.sql.ResultSet
java.sql.ResultSetMetaData
这些接口都继承了java.sql.Wrapper接口。许多JDBC驱动程序提供超越传统JDBC的扩展,为了符合JDBC API规范,驱动厂商可能会在原始类型的基础上进行包装,Wrapper接口为使用JDBC的应用程序提供访问原始类型的功能,从而使用JDBC驱动中一些非标准的特性。
java.sql.Wrapper接口提供了两个方法,具体如下:
public interface Wrapper {
/**
* Returns an object that implements the given interface to allow access to
* non-standard methods, or standard methods not exposed by the proxy.
*
* If the receiver implements the interface then the result is the receiver
* or a proxy for the receiver. If the receiver is a wrapper
* and the wrapped object implements the interface then the result is the
* wrapped object or a proxy for the wrapped object. Otherwise return the
* the result of calling <code>unwrap</code> recursively on the wrapped object
* or a proxy for that result. If the receiver is not a
* wrapper and does not implement the interface, then an <code>SQLException</code> is thrown.
*
* @param <T> the type of the class modeled by this Class object
* @param iface A Class defining an interface that the result must implement.
* @return an object that implements the interface. May be a proxy for the actual implementing object.
* @throws java.sql.SQLException If no object found that implements the interface
* @since 1.6
*/
<T> T unwrap(java.lang.Class<T> iface) throws java.sql.SQLException;
/**
* Returns true if this either implements the interface argument or is directly or indirectly a wrapper
* for an object that does. Returns false otherwise. If this implements the interface then return true,
* else if this is a wrapper then return the result of recursively calling <code>isWrapperFor</code> on the wrapped
* object. If this does not implement the interface and is not a wrapper, return false.
* This method should be implemented as a low-cost operation compared to <code>unwrap</code> so that
* callers can use this method to avoid expensive <code>unwrap</code> calls that may fail. If this method
* returns true then calling <code>unwrap</code> with the same argument should succeed.
*
* @param iface a Class defining an interface.
* @return true if this implements the interface or directly or indirectly wraps an object that does.
* @throws java.sql.SQLException if an error occurs while determining whether this is a wrapper
* for an object with the given interface.
* @since 1.6
*/
boolean isWrapperFor(java.lang.Class<?> iface) throws java.sql.SQLException;
}
其中,unwrap()方法用于返回未经过包装的JDBC驱动原始类型实例,我们可以通过该实例调用JDBC驱动中提供的非标准的方法。
sWrapperFor()方法用于判断当前实例是否是JDBC驱动中某一类型的包装类型。
Statement stmt = conn.createStatement ();
Class clzz = Class.forName("oracle.jdbc.OracleStatement");
if(stmt.isWrapperFor(clzz)) {
OracleStatement os = (OracleStatement)stmt.unwrap(clzz);
os.defineColumnType(1, Types.NUMBER);
}
如上面的代码所示,Oracle数据库驱动中提供了一些非JDBC标准的方法,如果需要使用这些非标准的方法,则可以调用Wrapper接口提供的unwrap()方法获取Oracle驱动的原始类型,然后调用原始类型提供的非标准方法就可以访问Oracle数据库特有的一些特性了。
JDBC API中的Connection、Statement、ResultSet等接口都继承自Wrapper接口,这些接口都提供了对JDBC驱动原始类型的访问能力。
Connection、Statement、ResultSet之间的关系如图所示。
2.javax.sql包详解
javax.sql包中的类和接口最早是由JDBC 2.0版本的可选包提供的,这个可选包最早出现在J2SE 1.2版本中,这个包中的内容不多,主要包括下面几个类和接口:
#数据源
javax.sgl.DataSource
javax.sql.CommonDataSource
#连接池相关
javax.sgl.ConnectionPoolDataSource
javax.sql.PooledConnection
javax.sgl.ConnectionEvent
javax.sgl.ConnectionEventListener
javax.sgl.StatementEvent
javax.sgl.StatementEventListener
#ResultSet 扩展
javax.sql.RowSet
javax.sgl.RowSetEvent
javax.sgl.RowSetInternal
javax.sgl.RowSetListener
javax.sgl.RowSetMetaData
javax.sgl.RowSetReader
javax.sgl.RowSetWriter
#分布式扩展
javax.sgl.XAConnection
javax.sql.XADataSource
JDBC 1.0中使用DriverManager类来产生一个与数据源连接的Connection对象。相对于DriverManager,JDBC 2.0提供的DataSource接口是一个更好的连接数据源的方式。
首先,应用程序不需要像使用DriverManager一样对加载的数据库驱动程序信息进行硬编码。开发人员可以选择通过JNDI注册这个数据源对象,然后在程序中使用一个逻辑名称来引用它,JNDI会自动根据我们给出的名称找到与这个名称绑定的DataSource对象。然后我们就可以使用这个DataSource对象来建立和具体数据库的连接了。
其次,使用DataSource接口的第二个优势体现在连接池和分布式事务上。连接池通过对连接的复用,而不是每次需要操作数据源时都新建一个物理连接来显著地提高程序的效率,适用于任务繁忙、负担繁重的企业级应用。
javax.sql.DataSource与java.sql.Connection之间的关系如图所示。
javax.sql包下还提供了一个PooledConnection接口。PooledConnection和Connection的不同之处在于,它提供了连接池管理的句柄。一个PooledConnection表示与数据源建立的物理连接,该连接在应用程序使用完后可以回收而不用关闭它,从而减少了与数据源建立连接的次数。
应用程序开发人员一般不会直接使用PooledConnection接口,而是通过一个管理连接池的中间层基础设施使用。当应用程序调用DataSource对象的getConnection()方法时,它返回一个Connection对象。但是当我们使用数据库连接池时(例如Druid),该Connection对象实际上是到PooledConnection对象的句柄,这是一个物理连接。连接池管理器(通常为应用程序服务器)维护所有的PooledConnection 对象资源。如果在池中存在可用的PooledConnection对象,则连接池管理器返回作为到该物理连接的句柄的Connection对象。如果不存在可用的PooledConnection对象,则连接池管理器调用ConnectionPoolDataSource对象的getConnection()方法创建新的物理连接。
连接池实现模块可以调用PooledConnection对象的addConnectionEventListener()将自己注册成为一个PooledConnection对象的监听者,当数据库连接需要重用或关闭的时候会产生一个ConnectionEvent对象,它表示一个连接事件,连接池实现模块将会得到通知。
javax.sql.PooledConnection与java.sql.Connection之间的关系如图所示。
另外,javax.sql包中还包含XADataSource、XAResource和XAConnection接口,这些接口提供了分布式事务的支持,具体由JDBC驱动来实现。更多分布式事务相关细节可参考JTA(Java Transaction API)规范文档。
XAConnection接口继承了PooledConnection接口,因此它具有所有PooledConnection的特性,我们可以调用XAConnection实例的getConnection()方法获取java.sql.Connection对象,它们与java.sql.Connection之间的关系如图所示。
javax.sql包中还提供了一个RowSet接口,该接口继承自java.sql包下的ResultSet接口。RowSet用于为数据源和应用程序在内容中建立一个映射。RowSet对象可以建立一个与数据源的连接并在其整个生命周期中维持该连接,在这种情况下,该对象被称为连接的RowSet。RowSet对象还可以建立一个与数据源的连接,从其获取数据,然后关闭它,这种RowSet被称为非连接RowSet。非连接Rowset可以在断开时更改其数据,然后将这些更改写回底层数据源,不过它必须重新建立连接才能完成此操作。
相较于java.sql.ResultSet而言,RowSet的离线操作能够有效地利用计算机越来越充足的内存减轻数据库服务器的负担。由于数据操作都是在内存中进行的,然后批量提交到数据源,因此灵活性和性能都有了很大的提高。
RowSet默认是一个可滚动、可更新、可序列化的结果集,而且它作为一个JavaBean组件,可以方便地在网络间传输,用于两端的数据同步。通俗来讲,RowSet就相当于数据库表数据在应用程序内存中的映射,我们所有的操作都可以直接与RowSet对象交互。RowSet与数据库之间的数据同步,作为开发人员不需要关注。
javax.sql.RowSet与java.sql.ResultSet之间的关系如图所示。
相关推荐
- 深度解读Spring框架的核心原理
-
深度解读Spring框架的核心原理在Java开发的世界里,提到Spring框架,就像提起一位久经沙场的老将,它几乎成了企业级应用开发的代名词。那么,这个被无数开发者膜拜的框架究竟有何独特之处?今天,我...
- 「Spring认证」Spring 框架概述
-
Spring是最流行的企业Java应用程序开发框架。全球数以百万计的开发人员使用SpringFramework来创建高性能、易于测试和可重用的代码。Spring框架是一个开源的Java...
- 学习Spring框架 这一篇就够了
-
1.spring概述1.1Spring是什么(理解)...
- Spring框架双核解析:IOC与AOP的本质与实战
-
#Spring核心#IOC容器#AOP编程#Java框架设计...
- Spring Boot与传统Spring框架的对比:探索Java开发的新境界
-
SpringBoot与传统Spring框架的对比:探索Java开发的新境界在Java生态系统中,Spring框架无疑是一个里程碑式的存在。从最初的简单依赖注入容器,到如今覆盖企业级开发方方面面的庞大...
- Spring MVC框架源码深度剖析:从入门到精通
-
SpringMVC框架源码深度剖析:从入门到精通SpringMVC框架简介SpringMVC作为Spring框架的一部分,为构建Web应用程序提供了强大且灵活的支持。它遵循MVC(Model-V...
- Spring框架入门
-
一.spring是什么?Spring是分层...
- 程序员必知必会技能之Spring框架基础——面向切面编程!
-
面向切面编程AOP(AspectOrientedProgramming)与OOP(ObjectOrientedProgramming,面向对象编程)相辅相成。AOP提供了与OOP不同的抽象软件结...
- Spring Security安全框架深度解读:为你的应用穿上“钢铁铠甲”
-
SpringSecurity安全框架深度解读:为你的应用穿上“钢铁铠甲”在现代网络世界里,保护我们的应用程序免受各种威胁攻击至关重要。而在这个过程中,SpringSecurity框架无疑是我们最可...
- Spring框架的设计哲学与实现:打造轻量级的企业级Java应用
-
Spring框架的设计哲学与实现:打造轻量级的企业级Java应用Spring框架自2003年诞生以来,已成为企业级Java应用开发的代名词。它不仅仅是一个框架,更是一种设计理念和哲学的体现。本文将带你...
- Spring框架深度解析:从核心原理到底层实现的全方位避坑指南
-
一、Spring框架核心概念解析1.控制反转(IoC)与依赖注入(DI)Spring的核心思想是通过IoC容器管理对象的生命周期和依赖关系。传统开发中,对象通过new主动创建依赖对象,导致高耦合;而S...
- Java框架 —— Spring简介
-
简介一般来说,Spring指的是SpringFramework,它提供了很多功能,例如:控制反转(IOC)、依赖注入...
- Spring 框架概述,模块划分
-
Spring框架以控制反转(InversionofControl,IoC)和面向切面编程(Aspect-OrientedProgramming,AOP)为核心,旨在简化企业级应用开发,使开发者...
- spring框架怎么实现依赖注入?
-
依赖注入的作用就是在使用Spring框架创建对象时,动态的将其所依赖的对象注入到Bean组件中,其实现方式通常有两种,一种是属性setter方法注入,另一种是构造方法注入。具体介绍如下:●属性set...
- Spring框架详解
-
Spring是一种开放源码框架,旨在解决企业应用程序开发的复杂性。一个主要优点就是它的分层体系结构,层次结构让你可以选择要用的组件,同时也为J2EE应用程序开发提供了集成框架。 Spring特征...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
推荐7个模板代码和其他游戏源码下载的网址
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)