zoukankan      html  css  js  c++  java
  • JDBC详解一 jdbc是什么

    一、简介

    JDBC是java语言提供的一套访问关系数据的接口。关系数据不仅仅是关系型数据库,也可以是一些关系型文件,只要相应的数据源提供实现JDBC接口的驱动。在java编写的应用中,可以利用JDBC接口可以执行SQL语句、检索执行结果以及把对数据的修改写回底层数据源。
    JDBC与ODBC都是基于X/Open SQL CLI。JDBC提供了从java语言到X/Open SQL CLI以及SQL标准的映射,这种映射比较自然且易于使用。
    JDBC是java平台的一部分,在java SE与java EE版本中都有JDBC的接口。JDBC API主要包含在java.sql与javax.sql这两个包中。

    二、概述

    JDBC API为java程序提供了一个访问一个或多个数据源的方式。在大多数情况下,这些数据源都是关系型数据库管理系统,请求是通过SQL对数据进行访问。 但是,也可以在其他数据源上实现支持JDBC API的驱动程序,比如在遗留文件系统和面向对象系统上实现JDBC API。

    2.1、创建连接

    在JDBC中,定义一个Connection接口来代表 一个底层数据源的链接。在典型场景中,JDBC应用程序将使用以下两种机制之一连接到目标数据源:

    (1)DriverManager—这个完全实现的类是在最初的JDBC1.0API中引入的。当应用程序首次尝试通过指定URL连接到数据源时,DriverManager将自动加载在类路径中找到的任何JDBC驱动程序(在JDBC4.0之前,任何驱动程序都必须被应用程序显示的加载)
    
    (2)DataSource—这个接口是在JDBC2.0可选包API中引入的。它优于DriverManager,因为它允许底层数据源的详细信息对应用程序透明。一个被赋值了的DataSource对象就代表一个特定的数据源。当调用DataSource对象的getConnection方法时,DataSource实例将返回到该数据源的连接。只需更改DataSource对象的属性即可将应用程序定向到不同的数据源;无需更改应用程序代码。同样,可以更改DataSource的实现,而无需更改使用它的应用程序代码。
    

    JDBC API还定义了支持企业应用程序的DataSource的两个重要扩展。这些扩展包括以下两个接口:

    (1)ConnectionPoolDataSource—支持缓存与重用物理连接,从而提高应用程序性能和可伸缩性
    (2)XADataSource—提供可以参与分布式事务的连接
    

    2.2、SQL执行与结果处理

    一旦建立了连接,使用JDBC API的应用程序就可以对目标数据源执行查询和更新。JDBC API提供对SQL:2003的最常用实现功能的访问。由于不同的供应商对这些特性的支持程度不同,所以JDBC API提供了DatabaseMetadata接口。应用程序可以使用DatabaseMetadata接口来确定所使用的数据源是否支持某个特定的功能。
    

    应用程序使用Connection接口中的方法指定事务属性并创建Statement,PreparedStatement或CallableStatement对象。 这些语句对象被用来行SQL语句并检索结果。 ResultSet接口封装了SQL查询的结果。语句也可能是批处理的,从而允许应用程序向数据源提交多个更新作为单个执行单元。

    JDBC API用RowSet接口扩展了ResultSet接口,从而为表格数据提供了一个比标准结果集更通用的容器。RowSet对象是JavaBeans组件,它可以在不连接其数据源的情况下运行。 例如,RowSet实现可以是可序列化的,因此可以通过网络发送,这对于希望在不影响JDBC驱动程序和数据源连接开销的情况下对表格数据进行操作的小型客户端特别有用。 RowSet实现的另一个功能是它可以包括一个自定义阅读器,用于访问表格格式的任何数据,而不仅仅是关系数据库中的数据。 此外,当RowSet对象与数据源断开连接时,它可以更新其行,并且其实现可以包括一个自定义写入器,该写入器将这些更新写回到基础数据源。

    支持SQL高级数据类型

    JDBC API定义了标准映射,以将SQL数据类型转换为JDBC数据类型并转换回JDBC数据类型。 这包括对SQL:2003高级数据类型的支持,例如BLOB,CLOB,ARRAY,REF,STRUCT,XML和DISTINCT。 JDBC驱动程序还可以为用户定义类型(user-defined types UDT)实现一个或多个自定义类型映射,其中UDT映射为Java编程语言中的类。 JDBC API还提供对外部管理数据的支持,例如,数据源外部文件中的数据。
    

    2.3、两层模型

    两层模型将功能划分为客户端层和服务器层,如下图所示:

    image

    客户端层包括一个或多个应用程序以及一个或多个JDBC驱动程序,其中应用程序负责处理以下职责范围:

    1. 表达逻辑
    2. 业务逻辑
    3. 对包含多条语句的事务或者分布式事务的事务管理
    4. 资源的管理

    在此模型中,应用程序直接与JDBC驱动程序交互,包括建立和管理物理连接以及处理特定底层数据源实现的详细信息。 该应用程序可以利用其对特定实现的了解来利用非标准功能或进行性能调整。

    该模型的一些缺点包括:

    1. 将表示和业务逻辑与基础结构和系统级功能相结合。这给使用定义良好的体系结构生成可维护代码带来了障碍。
    2. 使应用程序的可移植性降低,因为应用程序被调整到特定的数据库实现。需要连接到多个数据库的应用程序必须了解不同供应商实现之间的差异
    3. 限制了可扩展性。 Typically, the application will hold onto one or more physical database connections until it terminates, limiting the number of concurrent applications that can be supported. In this model, issues of performance, scalability and availability are handled by the JDBC driver and the corresponding underlying data source. If an application deals with multiple drivers, it may also need to be aware of the different ways in which each driver/data source pair resolves these issues.

    2.4、三层模型

    三层模型引入了一个中间层服务器,以容纳业务逻辑和基础架构,如下图所示:

    image

    此体系结构旨在为企业应用程序提供改进的性能、可扩展性和可用性。各层的功能划分如下:

    • 客户端:用来表示人机交互的表现层。Java程序、web浏览器和 PDAs都是典型的客户端层的实现。客户端与中间层应用程序交互,客户端层不需要知道任何的底层架构以及底层数据源。

    • 中间层服务器:一个中间层,其中包括:

      1、应用程序:应用程序与客户机交互并实现业务逻辑。如果应用程序包含与数据源的交互,应用程序只会在更高级别的抽象层进行处理,例如DataSource对象和Connection对象,而不是较低级别的驱动程序API。

      2、应用程序服务器:为各种应用程序提供支持基础设施服务。这些服务包括物理连接的管理与池化、事务管理以及屏蔽不同JDBC驱动程序之间差异。因为应用程序服务器提供的这些基础服务,使得编写可移植的程序更加的容易。应用服务器角色可以由javaEE服务器实现。应用程序使用的那些高层次抽象的操作都由应用程序服务器来实现,并且应用程序服务器直接与JDBC驱动程序交互。

      3、JDBC驱动程序:提供与底层数据源的连接。每个驱动程序在其底层数据源支持的任何特性之上实现标准JDBC API。

    • 底层数据源:数据所在的一层。它可以包括关系式DBMS、遗留文件系统、面向对象的DBMS、数据仓库、电子表格或其他打包和呈现数据的方法。唯一的要求是一个支持J的相应的驱动程序

    三、类和接口

    以下类和接口构成了JDBC API。

    3.1、java.sql包

    核心JDBC API包含在程序包java.sql中。下面列出了java.sql中的枚举、类和接口。枚举数和类为粗体类型,接口为标准类型。

    java.sql.Array

    java.sql.BatchUpdateException

    java.sql.Blob

    java.sql.CallableStatement

    java.sql.Clob

    java.sql.ClientinfoStatus

    java.sql.Connection

    java.sql.ConnectionBuilder

    java.sql.DataTruncation

    java.sql.DatabaseMetaData

    java.sql.Date

    java.sql.Driver

    java.sql.DriverAction

    java.sql.DriverManager

    java.sql.DriverPropertyInfo

    java.sql.JDBCType

    java.sql.NClob

    java.sql.ParameterMetaData

    java.sql.PreparedStatement

    java.sql.PseudoColumnUsage

    java.sql.Ref

    java.sql.ResultSet

    java.sql.ResultSetMetaData

    java.sql.RowId

    java.sql.RowIdLifeTime

    java.sql.Savepoint

    java.sql.ShardingKey

    java.sql.ShardingKeyBuilder

    java.sql.SQLClientInfoException

    java.sql.SQLData

    java.sql.SQLDataException

    java.sql.SQLException

    java.sql.SQLFeatureNotSupportedException

    java.sql.SQLInput

    java.sql.SQLIntegrityConstraintViolationException

    java.sql.SQLInvalidAuthorizationSpecException

    java.sql.SQLNonTransientConnectionException

    java.sql.SQLNonTransientException

    java.sql.SQLOutput

    java.sql.SQLPermission

    java.sql.SQLSyntaxErrorException

    java.sql.SQLTimeoutException

    java.sql.SQLTransactionRollbackException

    java.sql.SQLTransientConnectionException

    java.sql.SQLTransientException

    java.sql.SQLType

    java.sql.SQLXML

    java.sql.SQLWarning

    java.sql.Statement

    java.sql.Struct

    java.sql.Time

    java.sql.Timestamp

    java.sql.Types

    java.sql.Wrapper

    以下类和接口是JDBC4.3API中新的,也是更新的。新的类和接口将以粗体突出显示。

    java.sql.CallableStatement

    java.sql.Connection

    java.sql.ConnectionBuilder

    java.sql.DatabaseMetaData

    java.sql.Date

    java.sql.DriverManager

    java.sql.PreparedStatement

    java.sql.ResultSet

    java.sql.ShardingKey

    java.sql.ShardkingKeyBuilder

    java.sql.Statement

    java.sql.Timestamp

    javax.sql.CommonDataSource

    javax.sql.ConnectionPoolDataSource

    javax.sql.DataSource

    javax.sql.PooledConnection

    javax.sql.PooledConnectionBuilder

    javax.sql.XAConnectionBuilder

    javax.sql.XADataSource

    下图展示了java.sql软件包中的关键类和接口之间的交互和他们之间的关系。还显示了创建语句、设置参数和检索结果所涉及的方法

    3.2、 javax.sql包

    以下列表包含javax.sql程序包中所包含的类和接口。类以粗体突出显示,接口为正常类型。

    javax.sql.CommonDataSource

    javax.sql.ConnectionEvent

    javax.sql.ConnectionEventListener

    javax.sql.ConnectionPoolDataSource

    javax.sql.DataSource

    javax.sql.PooledConnection

    javax.sql.PooledConnectionBuilder

    javax.sql.RowSet

    javax.sql.RowSetEvent

    javax.sql.RowSetInternal

    javax.sql.RowSetListener

    javax.sql.RowSetMetaData

    javax.sql.RowSetReader

    javax.sql.RowSetWriter

    javax.sql.StatementEvent

    javax.sql.StatementEventListener

    javax.sql.XAConnection

    javax.sql.XAConnectionBuilder

    javax.sql.XADataSource

    3.3、关键类关系图

    数据源与连接关系图

    image

    连接池关系图

    image

    分布式事务关系图

    image

    行结果集关系图

    image

    四、Database Metadata

    DatabaseMetaData接口由JDBC驱动程序实现,用来提供有关其底层数据源的信息。它主要被应用程序服务器和工具使用来确定如何与给定的数据源进行交互。应用程序也可以使用DatabaseMetaData方法来获取有关数据源的信息,但这中情况不经常出现。
    

    DatabaseMetaData接口包括150多种方法,可根据它们提供的信息类型进行分类:

    • 有关数据源的一般信息
    • 数据源是否支持给定的功能或功能
    • 数据源的限制
    • 数据源包含的SQL对象以及这些对象的属性
    • 由数据源提供的事务处理支持

    DatabaseMetaData接口还包含40多个字段,这些字段是用作各种DatabaseMetaData方法的返回值的常量。

    4.1、创建DatabaseMetaData对象

    可以使用Connection接口的getMetaData()方法来创建DababaseMetaData对象。DababaseMetaData对象被创建后,它可以用于动态发现有关底层数据源的信息。代码示例创建一个DababaseMetaData对象,并使用它来确定数据库中表的命名允许的最大字符数。
    
    // con is a Connection object 
    DatabaseMetaData dbmd = con.getMetadata();
    int maxLen = dbmd.getMaxTableNameLength();
    

    4.2、检索一般信息

    DababaseMetaData接口中提供一些用于获取底层数据源信息或者这些驱动实现细节的一些方法。

    ■ getURL

    ■ getUserName

    ■ getDatabaseProductVersion, getDriverMajorVersion and getDriverMinorVersion

    ■ getSchemaTerm, getCatalogTerm and getProcedureTerm

    ■ nullsAreSortedHigh and nullsAreSortedLow

    ■ usesLocalFiles and usesLocalFilePerTable

    ■ getSQLKeywords

    4.3、判断是否支持某种特性

    DatabaseMetaData中有大量的方法是用来判断某个给定的特性或者一组特性是否被当前驱动或者底层数据源支持。除此之外,其中一些方法还描述了所提供的支持级别。

    一些描述对单个特征的支持的方法是:

    ■ supportsAlterTableWithDropColumn

    ■ supportsBatchUpdates

    ■ supportsTableCorrelationNames

    ■ supportsPositionedDelete

    ■ supportsFullOuterJoins

    ■ supportsStoredProcedures

    ■ supportsMixedCaseQuotedIdentifiers

    描述功能支持级别的方法包括:

    ■ supportsANSI92EntryLevelSQL

    ■ supportsCoreSQLGrammar

    4.4、数据源限制

    DatabaseMetaData中还有一部分方法用来提供当前数据源有哪些限制。这一类方法中的一些方法包括:

    ■ getMaxRowSize

    ■ getMaxStatementLength

    ■ getMaxTablesInSelect

    ■ getMaxConnections

    ■ getMaxCharLiteralLength

    ■ getMaxColumnsInTable

    此组中的方法将限制作为int形式返回。返回值为零表示没有限制或限制未知

    4.5、SQL对象与其属性

    DatabaseMetaData中的一些方法提供有关填充给定数据源的SQL对象的信息。

    ■ getSchemas

    ■ getCatalogs

    ■ getTables

    ■ getPrimaryKeys

    ■ getProcedures

    ■ getProcedureColumns

    ■ getUDTs

    ■ getFunctions

    ■ getFunctionColumns

    4.6、事务支持

    一小组方法提供有关数据源支持的事务语义的信息。

    supportsMultipleTransactions

    getDefaultTransactionIsolation

  • 相关阅读:
    frida rpc调用维护ios手机脚本
    latex表格调整行距
    latex插图自动在双栏的最top,IEEE期刊格式
    latex插图egin{minipage}强制左移hspace命令
    SYNTHIA-RAND-CITYSCAPES数据集云盘下载
    一种用于多张图片同时缩放比较细节的软件faststone
    shopxo安装插件被限制绑定账号的问题
    ShopXo框架去掉绑定商店的提示
    拓扑排序
    前缀和和差分
  • 原文地址:https://www.cnblogs.com/cplinux/p/14710975.html
Copyright © 2011-2022 走看看