Spring框架之jdbc源碼完全解析


Spring框架之jdbc源碼完全解析

       Spring JDBC抽象框架所帶來的價值將在以下幾個方面得以體現:

       1、指定數據庫連接參數

       2、打開數據庫連接

       3、聲明SQL語句

       4、預編譯並執行SQL語句

       5、遍歷查詢結果(如果需要的話)

       6、處理每一次遍歷操作

       7、處理拋出的任何異常

       8、處理事務

       9、關閉數據庫連接

       使用了Spring JDBC抽象框架之后,應用開發人員只需要做步驟3(聲明SQL語句)和步驟6(處理每一次遍歷操作)的編碼工作。Spring將替我們完成所有單調乏味的JDBC底層細節處理工作。

       Spring JDBC抽象框架由五個包構成:config、core、 dataSource、object以及support。

       org.springframework.jdbc.config包負責JDBC的配置。

       org.springframework.jdbc.core包由JdbcTemplate類以及相關的回調接口(callback interface)和類組成。

       org.springframework.jdbc.datasource包由一些用來簡化DataSource訪問的工具類,以及各種DataSource接口的簡單實現(主要用於單元測試以及在J2EE容器之外使用JDBC)組成。工具類提供了一些靜態方法,諸如通過JNDI獲取數據連接以及在必要的情況下關閉這些連接。它支持綁定線程的連接,比如被用於DataSourceTransactionManager的連接。

       org.springframework.jdbc.object包由封裝了查詢、更新以及存儲過程的類組成,這些類的對象都是線程安全並且可重復使用的。它們類似於JDO,與JDO的不同之處在於查詢結果與數據庫是“斷開連接”的。它們是在org.springframework.jdbc.core包的基礎上對JDBC更高層次的抽象。

       org.springframework.jdbc.support包提供了一些SQLException的轉換類以及相關的工具類。

       在JDBC處理過程中拋出的異常將被轉換成org.springframework.dao包中定義的異常。因此使用Spring JDBC進行開發將不需要處理JDBC或者特定的RDBMS才會拋出的異常。所有的異常都是unchecked exception,這樣我們就可以對傳遞到調用者的異常進行有選擇的捕獲。

       下面基於的Spring版本為5.2.4.BUILD-SNAPSHOT源碼,對JDBC模塊中包含的類和接口進行分析。

一、 jdbc/

1.1  BadSqlGrammarException:sql語法異常。該異常類的子類可以表示沒有這種表格、沒有這種列等情況。

1.2  CannotGetJdbcConnectionException:當我們使用JDBC無法連接到數據庫時拋出的致命異常。

1.3  IncorrectResultSetColumnCountException:當結果集(result set)的列數目不對時拋出的異常,比如,期望得到的是單列,但是sql語句查詢的結果是0列或者多列。

1.4  InvalidResultSetAccessException:當以無效的方式去訪問結果集(ResultSet)時拋出的異常,比如結果集列索引無效。

1.5  JdbcUpdateAffectedIncorrectNumberOfRowsException:當JDBC更新操作影響了期望范圍之外的幾行記錄時拋出的異常。比如我們對單獨的一行數據執行更新操作,但是卻影響了其他幾行。

1.6  LobRetrievalFailureException:LOB無法被獲取的時候拋出此類異常。

       由於無結構的數據往往都是大型的,存儲量非常大,而LOB(large object ,大對象,一個LOB字段可存儲可多達4GB的數據)類型主要用來支持無結構的大型數據。用戶可以用LOB數據類型來存儲大型的無結構數據,特別是文本,圖形,視頻和音頻等多媒體數據。

       LOB數據類型可以分為以下幾種:

       BLOB:二進制LOB類型,用戶存放無結構的二進制數據,最大4GB  binary 二進制。

       CLOB:字符LOB類型,用於存放字符數據,最大可以存儲4GB。

       NLOB:字符LOB類型,和CLOB相同,支持國家字符集,多字符集 GBK。

       BFILE:二進制文件類型,與數據庫外的操作系統文件相關聯,該文件存儲二進制大對象。

1.7  SQLWarningException:當我們不忽略SQLWarnings警告時拋出的異常。

       當操作完成時出現SQLWarnings警告,如果我們對這個警告不滿意可以將其進行回滾。當然我們也可以忽略這個警告,或者僅僅記錄下來,或者以SQLWarningException的形式封裝並拋出。

1.8  UncategorizedSQLException:未分類的SQL異常,當我們無法將一個SQLException歸類到某一種通用的異常時拋出此異常。

二、jdbc/config

2.1  DatabasePopulatorConfigUtils:內部方法,用於JDBC配置。

2.2  EmbeddedDatabaseBeanDefinitionParser:繼承了AbstractBeanDefinitionParser,解析<embedded-database>元素,並使用EmbeddedDatabaseFactoryBean創建一個BeanDefinition。

2.3  InitializeDatabaseBeanDefinitionParser:繼承了AbstractBeanDefinitionParser,解析<initialize-database>元素,創建一個DataSourceInitializer類型的BeanDefinition。

2.4  JdbcNamespaceHandler:JDBC 配置的命名空間處理器。

2.5  SortedResourcesFactoryBean:FactoryBean接口的實現類,獲取一列地區字符串,創建排序的一組資源實例。

三、jdbc/core/

3.1  ArgumentPreparedStatementSetter:繼承自PreparedStatementSetter,應用一組給定的參數。

       PreparedStatementSetter接口充當JdbcTemplate類使用的一般回調接口。該接口在JdbcTemplate類提供的PreparedStatement上設置了使用相同SQL的批處理中的每個更新的值。實現負責設置必要的參數。

       PreparedStatement接口繼承自Statement,PreparedStatement可以使用占位符,是預編譯的,批處理比Statement效率高  。Java提供了 Statement、PreparedStatement 和 CallableStatement三種方式來執行查詢語句,其中 Statement 用於通用查詢, PreparedStatement 用於執行參數化查詢,而 CallableStatement則是用於存儲過程。

       Statement接口用於執行靜態 SQL 語句並返回它所生成結果的對象。

3.2  ArgumentTypePreparedStatementSetter:繼承自PreparedStatementSetter,應用一組給定的參數和JDBC參數類型。

3.3  BatchPreparedStatementSetter:批量更新回調接口,被JdbcTemplate類使用。

3.4  BatchUpdateUtils:批量更新的功能性方法。主要在框架內部使用。

3.5  BeanPropertyRowMapper:可以將查詢的ResultSet和實體類的字段進行自動映射

3.6  CallableStatementCallback:回調接口,用於操作一個CallableStatement。允許在單個CallableStatement執行任意數量的操作。比如,可以執行單次的調用,也可以使用不同參數執行多次調用。

3.7  CallableStatementCreator:三個核心回調接口中的一個,被JdbcTemplate類使用。該接口用於創建一個CallableStatement。實現類負責提供SQL和必要的參數。

3.8  CallableStatementCreatorFactory:基於一個SQL statement的不同參數和一組參數的聲明,來高效的創建多個CallableStatementCreator對象。

3.9  ColumnMapRowMapper:RowMapper接口的實現類,為每一行創建一個Map,用key-value鍵值對表示所有的列元素:作為每一個列元素的入口,列名字作為key。

3.10  ConnectionCallback:操作JDBC連接的通用回調接口,運行在單個連接上執行任意數量的操作,使用任何類型和數量的Statements。

3.11  DisposableSqlTypeValue:SqlTypeValue的子接口,增加了一個cleanup回調函數,當value值已經設置好,相應的statement已經執行完畢后該回調函數被調用。

3.12  InterruptibleBatchPreparedStatementSetter:繼承自BatchPreparedStatementSetter,增加了批量操作耗盡的檢查,也就是說判斷批量操作是否完成。

3.13  JdbcOperations:JdbcOperations接口定義了JDBC的一些基本操作,具體實現則放在JdbcTemplate類中,不推薦直接使用,但是由於比較適合於mock和stub,因此在測試的時候是一個非常好的選擇。

3.14  JdbcTemplate:JdbcTemplate是core包的核心類。它替我們完成了資源的創建以及釋放工作,從而簡化了我們對JDBC的使用。它還可以幫助我們避免一些常見的錯誤,比如忘記關閉數據庫連接。JdbcTemplate完成JDBC核心處理流程,比如SQL語句的創建、執行,而把SQL語句的生成以及查詢結果的提取工作留給我們的應用代碼。它可以完成SQL查詢、更新以及調用存儲過程,可以對ResultSet進行遍歷並加以提取。它還可以捕獲JDBC異常並將其轉換成org.springframework.dao包中定義的通用的、信息更豐富的異常。

  JdbcTemplate主要提供以下三種類型的方法:

       1、executeXxx() : 執行任何SQL語句,對數據庫、表進行新建、修改、刪除操作;

       2、updateXxx() : 執行新增、修改、刪除等語句;

       3、queryXxx() : 執行查詢相關的語句。

3.15  ParameterDisposer:該接口的實現類用來關閉參數(比如SqlLobValue對象)所分配的資源。

3.16  ParameterizedPreparedStatementSetter:參數化的回調接口,被JdbcTemplate類使用,用於批量更新。

3.17  ParameterMapper:當在連接時需要對參數進行個性化設置時實現該接口。

3.18  PreparedStatementCallback:操作一個PreparedStatement通用的回調接口,允許在單個PreparedStatement執行任意數量的操作。比如單個的executeUpdate調用,或者使用不同的參數executeUpdate多次調用。

3.19  PreparedStatementCreator:JdbcTemplate類使用的兩個核心回調接口中的一個,用於創建PreparedStatement。

3.20  PreparedStatementCreatorFactory:用於高效的創建多個PreparedStatementCreator。

3.21  PreparedStatementSetter:提供的PreparedStatement上設置value值,使用相同的SQL對批更新的每一項都進行設置。該接口的實現類負責設置所有必要參數。

3.22  ResultSetExtractor:JdbcTemplate的查詢方法使用的回調接口。該接口的實現類從ResultSet中提取出result,不要考慮異常的處理。JdbcTemplate會捕獲並處理SQLException。

       該接口主要在JDBC框架內部使用。對於ResultSet處理一般選擇RowMapper,將每一行記錄映射為一個結果對象,而不是將整個結果集ResultSet映射為一個結果對象。

3.23  ResultSetSupportingSqlParameter:ResultSet-supporting的SqlParameters類的通用基類,比如SqlOutParameter和SqlReturnResultSet。

3.24  RowCallbackHandler:用於處理ResultSet的每一行結果,用戶需實現方法processRow(ResultSet rs)來完成處理,在該回調方法中無需執行rs.next(),該操作由JdbcTemplate來執行,用戶只需按行獲取數據然后處理即可。

3.25  RowCountCallbackHandler:RowCallbackHandler接口的實現類。回調處理器的父類。一個實例只會使用一次。

3.26  RowMapper:Spring中的RowMapper可以將數據中的每一行數據封裝成用戶自定義的類。我們在數據庫查詢中,如果返回的類型是用戶自定義的類型(其實我們在數據庫查詢中大部分返回的都是自定義的類)則需要包裝,如果是Java自定義的類型,如String,則不需要。

       可以通過建立內部(外部)類實現RowMapper接口,RowMapper中有一個mapRow方法,所以實現RowMapper接口一定要實現mapRow方法,而對自定義類的包裝就在mapRow方法中實現。

3.27  RowMapperResultSetExtractor:ResultSetExtractor接口的實現類,委托給一個RowMapper,RowMapper類為每一行記錄創建一個對象。

3.28  SingleColumnRowMapper:RowMapper接口的實現類,當返回結果是單列的時候使用,為每一行記錄的單列轉換成單個的result value。

3.29  SqlInOutParameter:繼承自SqlOutParameter,表示一個INOUT參數。

3.30  SqlOutParameter:SqlParameter的子類,表示一個output參數。

3.31  SqlParameter:用來表示一個SQL參數定義。

3.32  SqlParameterValue:表示一個SQL參數值,包括參數的元數據,如SQL類型、數值的規模。

3.33  SqlProvider:實現該接口的類能夠提供SQL字符串。

3.34  SqlReturnResultSet:表示存儲過程調用中返回的ResultSet。

3.35  SqlReturnType:標准的CallableStatement.getObject方法對一些復雜的database-specific類型的不支持,該接口的實現類會從這些復雜的database-specific類型中提取值。

3.36  SqlReturnUpdateCount:表示一次存儲過程調用中更新過的數量。

3.37  SqlRowSetResultSetExtractor:ResultSetExtractor接口實現類,返回一個Spring的SqlRowSet,表示每一個給定的ResultSet。

3.38  SqlTypeValue:該接口的實現類用於為一些復雜的database-specific類型設置值,這些復雜的database-specific標准的setObject方法不支持。在拓展的SqlValue變量有效。

3.39  StatementCallback:操作一個JDBC Statement的通用回調接口。允許在單個Statement執行任意數量的操作,比如單個的executeUpdate調用或者使用不同的SQL多次的executeUpdate調用。主要在JdbcTemplate內部使用,在應用代碼中也有用。

3.40  StatementCreatorUtils:PreparedStatementSetter/Creator和CallableStatementCreator實現的一些實用的方法,提供了先進的參數管理(包括了對Lob (Large Object)的支持)。

jdbc/core/metadata

3.41  CallMetaDataContext:用來管理上下文元數據的類,這些元數據用在存儲過程調用的配置和執行中。

3.42  CallMetaDataProvider:該接口用來指定一個提供call meta-date的類需要實現的API。主要在Spring的SimpleJdbcCall內部使用。

3.43  CallMetaDataProviderFactory:該工廠基於正在使用的數據庫類型(如Apache Derby、DB2、Informix Dynamic Server、Microsoft SQL Server、MySQL、Oracle、PostgreSQL、Sybase)來創建CallMetaDataProvider實現類。

3.44  CallParameterMetaData:表示在call processing使用的特定的參數的元數據。

3.45  Db2CallMetaDataProvider:CallMetaDataProvider接口關於DB2的特定實現,這個類主要在簡單的JDBC類內部使用。

3.46  DerbyCallMetaDataProvider:CallMetaDataProvider接口關於Derby的特定實現,這個類主要在簡單的JDBC類內部使用。

       Apache Derby是一個完全用java編寫的數據庫,Derby是一個Open source的產品,基於Apache License 2.0分發。

3.47  DerbyTableMetaDataProvider:TableMetaDataProvider接口關於Derby的特定實現。覆蓋了Derby元數據信息,視為獲取的產生的keys。

3.48  GenericCallMetaDataProvider:CallMetaDataProvider接口的通用實現類,該類能夠被拓展以提供數據庫特定的操作。

3.49  GenericTableMetaDataProvider:TableMetaDataProvider接口的通用實現,為所有支持的數據庫提供足夠的features。

3.50  HanaCallMetaDataProvider:CallMetaDataProvider接口關於SAP HANA的實現類,被JDBC類內部使用。

       SAP HANA(High-Performance Analytic Appliance)是SAP公司於2011年6月推出的基於內存計算技術的高性能實時數據計算平台,用戶可以基於SAP HANA提供的內存計算技術,直接對大量實時業務數據進行查詢和分析。

3.51  HsqlTableMetaDataProvider:TableMetaDataProvider接口關於HSQL的實現,可以在沒有JDBC 3.0支持下提取generated keys。

3.52  OracleCallMetaDataProvider:CallMetaDataProvider接口關於Oracle-specific的實現,主要在JDBC類的內部使用。

3.53  OracleTableMetaDataProvider:TableMetaDataProvider接口關於Oracle-specific的實現,提供了在元數據查找中對同義詞的支持。同時也可以使用sys_context來查找當前的數據庫模式。

3.54  PostgresCallMetaDataProvider:CallMetaDataProvider接口關於Postgres-specific的實現,主要被JDBC類內部使用。

3.55  PostgresTableMetaDataProvider:TableMetaDataProvider接口關於PostgrelSQL的實現。在沒有JDBC 3.0 getGeneratedKeys支持下能提取generated keys。

3.56  SqlServerCallMetaDataProvider:CallMetaDataProvider接口關於SQL Server的實現,主要在JDBC類內部使用。

3.57  SybaseCallMetaDataProvider:CallMetaDataProvider接口關於Sybase的實現,主要被JDBC類內部使用。Sybase是美國Sybase公司研制的一種關系型數據庫系統。

3.58  TableMetaDataContext:該類用來管理上下文的元數據,用於在一個數據庫表格中進行配置和執行操作。

3.59  TableMetaDataProvider:該接口用來指定提供表格元數據的類需要實現的API,該類主要在JDBC類內部使用。

3.60  TableMetaDataProviderFactory:該工廠類用來基於當前使用的數據庫類型,來創建TableMetaDataProvider實例,

3.61  TableParameterMetaData:在表格處理中使用的參數的元數據的句柄。

jdbc/core/namedparam

3.62  AbstractSqlParameterSource:SqlParameterSource接口實現類的抽象基類。對每個參數的SQL類型進行注冊,toString函數枚舉了SqlParameterSource的所有參數。該抽象類的子類必須實現hasValue和getValue方法。

3.63  BeanPropertySqlParameterSource:SqlParameterSource接口實現類,用於從一個給定的JavaBean對象的bean 屬性中獲取參數值。bean屬性的名字必須和參數的名字相匹配。

3.64  EmptySqlParameterSource:SqlParameterSource接口的空實現。

3.65  MapSqlParameterSource:MapSqlParameterSource是一個類似Map風格的類,包括 Key-Value,Key就是SQL中的參數。

3.66  NamedParameterBatchUpdateUtils:提供一些功能性函數,主要用於使用命名參數的JDBC批量 statements。該類在框架內部使用。

3.67  NamedParameterJdbcDaoSupport:繼承自JdbcDaoSupport,另外還暴露一個NamedParameterJdbcTemplate。

3.68  NamedParameterJdbcOperations:用於指定一套JDBC基本操作的接口,使用命名的參數而不是使用傳統的“?”占位符。

3.69  NamedParameterJdbcTemplate:該類增加了在SQL語句中使用命名參數的支持。在此之前,在傳統的SQL語句中,參數都是用“?”占位符來表示的。 該類內部封裝了一個普通的JdbcTemplate,並作為其代理來完成大部分工作。

3.70  NamedParameterUtils:命名參數的解析的幫助類,僅在Spring JDBC框架內部使用。

3.71  ParsedSql:保存解析過的SQL statement的信息。

3.72  SqlParameterSource:該接口為對象定義了一些通用的函數,這些對象能夠為命名的SQL參數提供參數值。作為NamedParameterJdbcTemplate操作的參數使用。

3.73  SqlParameterSourceUtils:為使用SqlParameterSource提供一些幫助方法,特別是NamedParameterJdbcTemplate。

jdbc/core/simple

3.74  AbstractJdbcCall:抽象類,提供基本的功能方法用於基於配置選項和數據庫元數據的存儲過程調用。

3.75  AbstractJdbcInsert:抽象類,提供基本的功能方法用於基於配置選項和數據庫元數據的插入操作。

3.76  SimpleJdbcCall:SimpleJdbcCall類是表示對存儲過程或存儲函數的調用的多線程,可重用的對象。 它提供元數據處理以簡化訪問基本存儲過程/函數所需的代碼。 所有需要提供的是程序/函數的名稱和包含執行調用時參數的Map對象。 提供的參數的名稱將與創建存儲過程時聲明的輸入和輸出參數相匹配。

3.77  SimpleJdbcCallOperations:該接口用來列出被SimpleJdbcCall實現的API。該接口通常不會被直接使用,而是用來增強可測試性。

3.78  SimpleJdbcInsert:SimpleJdbcInsert類是一個多線程,可重用的對象,為將數據插入表提供了易用的功能。它提供元數據處理以簡化構建基本insert語句所需的代碼。實際的插入是使用Spring的JdbcTemplate來處理的。

3.79  SimpleJdbcInsertOperations:該接口指定了簡單的JDBC插入操作的API,會被SimpleJdbcInsert所實現。一般不直接使用,提供選擇以提高可測試性。

jdbc/core/support

3.80  AbstractInterruptibleBatchPreparedStatementSetter:InterruptibleBatchPreparedStatementSetter接口的抽象實現類,組合the check for available values,將他們設置到回調函數setValuesIfAvailable中。

3.81  AbstractLobCreatingPreparedStatementCallback:PreparedStatementCallback接口的抽象實現類,用於管理一個LobCreator。作為一個內部類使用,提供了對surrounding方法參數的訪問。

3.82  AbstractLobStreamingResultSetExtractor:提供解析數據的方法模板,並提供ResultSet對象實例

3.83  AbstractSqlTypeValue:SqlTypeValue接口的抽象實現類。

3.84  JdbcBeanDefinitionReader:基於一個給定的SQL statement,從一個數據庫表中讀取值。

3.85  JdbcDaoSupport:JdbcDaoSupport是JDBC數據訪問對象的超類。它與特定的數據源相關聯。IOC容器或BeanFactory負責獲得相應數據源的配置詳細信息,並將其與JdbcDaoSupport相關聯。這個類最重要的功能就是使子類可以使用JdbcTemplate對象。

3.86  SqlLobValue:該類用來表示一個SQL BLOB/CLOB值參數。

       BLOB和CLOB都是大字段類型,BLOB是按二進制來存儲的,而CLOB是可以直接存儲文字的。其實兩個是可以互換的的,或者可以直接用LOB字段代替這兩個。

       但是為了更好的管理,ORACLE數據庫通常像圖片、文件、音樂等信息就用BLOB字段來存儲,先將文件轉為二進制再存儲進去。而像文章或者是較長的文字,就用CLOB存儲,這樣對以后的查詢更新存儲等操作都提供很大的方便。

四、 jdbc/datasource/

4.1  AbstractDataSource:AbstractDataSource是一個實現了DataSource 接口的抽象基類。它實現了DataSource接口的 一些無關痛癢的方法,如果你需要實現自己的DataSource,那么就繼承 該類。

       DataSource接口:為了從數據庫中取得數據,我們首先需要獲取一個數據庫連接。 Spring通過DataSource對象來完成這個工作。 DataSource是JDBC規范的一部分, 它被視為一個通用的數據庫連接工廠。通過使用DataSource, Container或Framework可以將連接池以及事務管理的細節從應用代碼中分離出來。

       在使用Spring JDBC時,你既可以通過JNDI獲得數據源,也可以自行配置數據源( 使用Spring提供的DataSource實現類)。使用后者可以更方便的脫離Web容器來進行單元測試。

4.2  AbstractDriverBasedDataSource:這個抽象類的子類都是基於Driver/DriverManager來獲取Connection對象的,它也提供了這樣一個抽象方法來要求子類實現:getConnectionFromDriver(Properties props)。

4.3  ConnectionHandle:JDBC連接的句柄實現該接口,比如會被JpaDialect使用。

4.4  ConnectionHolder:封裝了一個JDBC 連接的資源句柄。DataSourceTransactionManager會為一個特定的DataSource,綁定該類的實例到線程上。

4.5  ConnectionProxy:繼承自Connection的接口,會被Connection proxy所實現。允許訪問目標連接。

4.6  DataSourceTransactionManager:該類是 PlatformTransactionManager接口的一個實現,用於處理單個JDBC數據源。 它將從指定DataSource取得的JDBC連接綁定到當前線程,因此它也支持了每個數據源對應到一個線程。

       我們推薦在應用代碼中使用DataSourceUtils.getConnection(DataSource)來獲取 JDBC連接,而不是使用J2EE標准的DataSource.getConnection。因為前者將拋出 unchecked的org.springframework.dao異常,而不是checked的 SQLException異常。Spring Framework中所有的類(比如 JdbcTemplate)都采用這種做法。如果不需要和這個 DataSourceTransactionManager類一起使用,DataSourceUtils 提供的功能跟一般的數據庫連接策略沒有什么兩樣,因此它可以在任何場景下使用。

       DataSourceTransactionManager類支持定制隔離級別,以及對SQL語句查詢超時的設定。 為了支持后者,應用代碼必須使用JdbcTemplate或者在每次創建SQL語句時調用 DataSourceUtils.applyTransactionTimeout方法。

       在使用單個數據源的情形下,你可以用DataSourceTransactionManager來替代JtaTransactionManager, 因為DataSourceTransactionManager不需要容器支持JTA。如果你使用DataSourceUtils.getConnection(DataSource)來獲取 JDBC連接,二者之間的切換只需要更改一些配置。最后需要注意的一點就是JtaTransactionManager不支持隔離級別的定制。

4.7  DataSourceUtils:DataSourceUtils作為一個幫助類提供易用且強大的數據庫訪問能力, 我們可以使用該類提供的靜態方法從JNDI獲取數據庫連接以及在必要的時候關閉。 它提供支持線程綁定的數據庫連接(比如使用DataSourceTransactionManager 的時候,將把數據庫連接綁定到當前的線程上)。

4.8  DelegatingDataSource:實現了JDBC DataSource接口,把所有的調用委托給一個給定的目標DataSource。

4.9  DriverManagerDataSource:該類實現了 SmartDataSource接口。在applicationContext.xml中可以使用 bean properties來設置JDBC Driver屬性,該類每次返回的都是一個新的連接。

       該類主要在測試以及脫離J2EE容器的獨立環境中使用。它既可以用來在application context中作為一個 DataSource bean,也可以在簡單的JNDI環境下使用。 由於Connection.close()僅僅只是簡單的關閉數據庫連接,因此任何能夠獲取 DataSource的持久化代碼都能很好的工作。不過使用JavaBean風格的連接池 (比如commons-dbcp)也並非難事。即使是在測試環境下,使用連接池也是一種比使用 DriverManagerDataSource更好的做法。

4.10  IsolationLevelDataSourceAdapter:該數據源繼承自UserCredentialsDataSourceAdapter,用於適配特定的數據源,並啟用isolationLevelName屬性指定的隔離級別,並在這一隔離級別下進行數據庫操作。

4.11  JdbcTransactionObjectSupport:JDBC-aware的事務對象的基類。

4.12  LazyConnectionDataSourceProxy:代理一個目標DataSource,延遲獲取一個JDBC連接,比如,直到第一次創建一個Statement。

4.13  SimpleConnectionHandle:ConnectionHandle接口的簡單實現,包含了一個給定的JDBC連接。

4.14  SimpleDriverDataSource:一個簡單的數據源,每次獲取Connection()時,會重新建立一個Connection。通過Driver來獲取Connection對象。

4.15  SingleConnectionDataSource:SmartDataSource接口 的一個實現,其內部包裝了一個單連接。該連接在使用之后將不會關閉,不能在多線程 的環境下使用。

       當客戶端代碼調用close方法的時候,如果它總是假設數據庫連接來自連接池(就像使用持久化工具時一樣), 你應該將suppressClose設置為true。 這樣,通過該類獲取的將是代理連接(禁止關閉)而不是原有的物理連接。 需要注意的是,我們不能把使用該類獲取的數據庫連接造型(cast)為Oracle Connection之類的本地數據庫連接。

       SingleConnectionDataSource主要在測試的時候使用。 它使得測試代碼很容易脫離應用服務器而在一個簡單的JNDI環境下運行。 與DriverManagerDataSource不同的是,它始終只會使用同一個數據庫連接, 從而避免每次建立物理連接的開銷。

4.16  SmartDataSource:DataSource 接口的一個擴展,用來提供數據庫連接。使用該接口的類在指定的操作之后可以檢查是否需要關閉連接。 該接口在某些情況下非常有用,比如有些情況需要重用數據庫連接。

4.17  TransactionAwareDataSourceProxy:TransactionAwareDataSourceProxy作為目標DataSource的一個代理, 在對目標DataSource包裝的同時,還增加了Spring的事務管理能力, 在這一點上,這個類的功能非常像J2EE服務器所提供的事務化的JNDI DataSource。

       該類幾乎很少被用到,除非現有代碼在被調用的時候需要一個標准的 JDBC DataSource接口實現作為參數。 這種情況下,這個類可以使現有代碼參與Spring的事務管理。通常最好的做法是使用更高層的抽象來對數據源進行管理,比如JdbcTemplate和DataSourceUtils等等。

4.18  UserCredentialsDataSourceAdapter:將連接數據庫的用戶憑證信息出入到getConnection(String userName,String password)中。

4.19  WebSphereDataSourceAdapter:繼承自IsolationLevelDataSourceAdapter,它會從WebSphere容器獲取數據源。

jdbc/datasource/embedded

4.20  AbstractEmbeddedDatabaseConfigurer:EmbeddedDatabaseConfigurer實現類的抽象基類,通過一個“SHUTDOWN”statement提供了通用的關閉操作。

4.21  ConnectionProperties:該接口作為一個簡單的數據容器,允許JDBC連接參數一致性的配置,和數據源實際實現無關。

4.22  DataSourceFactory:該工廠類封裝了一個特定數據源實現的創建,比如一個非池化的SimpleDriverDataSource、或者以HikariDataSource形式建立的HikariCP池。

       HikariCP是Spring Framework 5.0的默認數據庫連接池。

4.23  DerbyEmbeddedDatabaseConfigurer:EmbeddedDatabaseConfigurer接口關於Apache Derby數據庫的實現。調用getInstance()函數會獲得該類的一個單例實例。

       Apache Derby是一個完全用Java編寫的數據庫,Derby是一個Open source的產品,基於Apache License 2.0分發。Apache Derby非常小巧,核心部分derby.jar只有2M,所以既可以做為單獨的數據庫服務器使用,也可以內嵌在應用程序中使用。

4.24  EmbeddedDatabase:一個嵌入式數據源實例的句柄。

4.25  EmbeddedDatabaseBuilder:構建器,提供了便捷的API用於構建一個嵌入式的數據庫。

4.26  EmbeddedDatabaseConfigurer:該接口封裝了用來創建、連接到、關閉一個指定的嵌入式數據庫(如HSQL、H2、Derby)所需要的配置。

4.27  EmbeddedDatabaseConfigurerFactory:將熟知的嵌入式數據庫類型映射到EmbeddedDatabaseConfigurer ,核心函數getConfigurer()。EmbeddedDatabaseType為HSQL,映射到HsqlEmbeddedDatabaseConfigurer;為H2,映射到H2EmbeddedDatabaseConfigurer;為DERBY,映射到DerbyEmbeddedDatabaseConfigurer。

4.28  EmbeddedDatabaseFactory:該工廠用於創建一個EmbeddedDatabase實例。

4.29  EmbeddedDatabaseFactoryBean:EmbeddedDatabaseFactory的子類,同時實現了FactoryBean接口用於作為一個Spring bean被注冊。返回DataSource,用於提供連接嵌入式數據庫到Spring。

4.30  EmbeddedDatabaseType:枚舉類,枚舉了嵌入式數據庫三種類型:HSQL、H2、DERBY。

4.31  H2EmbeddedDatabaseConfigurer:EmbeddedDatabaseConfigurer接口基於H2嵌入式數據庫實例的實現類。

4.32  HsqlEmbeddedDatabaseConfigurer:EmbeddedDatabaseConfigurer接口基於HSQL嵌入式數據庫實例的實現類。

4.33  OutputStreamFactory:內部幫助類,用於暴露dummy輸出流到嵌入式數據庫,比如Derby,阻止創建一個日志文件。

4.34  SimpleDriverDataSourceFactory:用於創建一個SimpleDriverDataSource。

jdbc/datasource/init

4.35  CannotReadScriptException:當SQL腳本無法讀取的時候,ScriptUtils拋出此異常。

4.36  CompositeDatabasePopulator:組合的DatabasePopulator,代理一列給定的DatabasePopulator實現,執行所有的腳本。

4.37  DatabasePopulator:策略接口,用來對一個數據庫增添數據、初始化、清理。

4.38  DatabasePopulatorUtils:執行DatabasePopulator的一些功能性函數。

4.39  DataSourceInitializer:用來在初始化的時候創建一個數據庫,或者在銷毀的時候清理一個數據庫。

4.40  ResourceDatabasePopulator:使用外部資源中定義的SQL腳本來對一個數據庫進行增添數據、初始化、清理等操作。

4.41  ScriptException:處理SQL腳本時發生數據讀取異常拋出。

4.42  ScriptParseException:SQL腳本不能正確解析時由ScriptUtils拋出此異常。

4.43  ScriptStatementFailedException:當SQL腳本中的一個statement執行失敗時由ScriptUtils拋出此異常。

4.44  ScriptUtils:使用SQL腳本時一些通用的功能性方法。主要在框架內部使用。

4.45  UncategorizedScriptException:當處理SQL腳本時出現故障,但是無法進一步定位或者處理時拋出此異常,比如,JDBC拋出的SQLException,但是我們無法更精確的定位時。

jdbc/datasource/lookup

4.46  AbstractRoutingDataSource:通過這個類可以實現動態數據源切換。抽象方法 determineCurrentLookupKey() 決定使用哪個數據源。

4.47  BeanFactoryDataSourceLookup:基於Spring BeanFactory的DataSourceLookup接口的實現類。

4.48  DataSourceLookup:策略接口,通過名字來查找數據源。

       策略(Strategy)模式:該模式定義了一系列算法,並將每個算法封裝起來,使它們可以相互替換,且算法的變化不會影響使用算法的客戶。策略模式屬於對象行為模式,它通過對算法進行封裝,把使用算法的責任和算法的實現分割開來,並委派給不同的對象對這些算法進行管理。

4.49  DataSourceLookupFailureException:DataSourceLookup接口的實現類會拋出該異常,指示指定的數據源無法獲得。

4.50  IsolationLevelDataSourceRouter:根據當前Spring受管事務啟用的隔離級別來選定合適的DataSource數據源。事實上,該數據源主要在JTA環境中使用。

4.51  JndiDataSourceLookup:基於JNDI的DataSourceLookup接口實現類。JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是SUN公司提供的一種標准的Java命名系統接口。

4.52  MapDataSourceLookup:依賴一個map進行查找的DataSourceLookup接口的實現類。

4.53  SingleDataSourceLookup:DataSourceLookup接口的實現類,簡單封裝一個給定的數據源,任何數據源名字都返回此值。

五、 jdbc/object

5.1  BatchSqlUpdate:繼承自SqlUpdate,可以進行批量的更新操作。

5.2  GenericSqlQuery:一種具體的SqlQuery,可以使用RowMapper進行配置。

5.3  GenericStoredProcedure:繼承自StoredProcedure,在一個容器中定義關系數據庫的存儲過程。

5.4  MappingSqlQuery:MappingSqlQuery是一個可重用的查詢抽象類,其具體類必須實現 mapRow(ResultSet, int)抽象方法來將結果集中的每一行轉換成Java對象。在SqlQuery的各種實現中, MappingSqlQuery是最常用也是最容易使用的一個。

5.5  MappingSqlQueryWithParameters:繼承自SqlQuery,主要是實現了SqlQuery中的newRowMapper()虛函數。在該函數中創建了一個實現了RowMapper<T>的類RowMapperImpl的對象並返回。RowMapperImpl是在MappingSqlQueryWithParameters類中定義的內部類。

5.6  RdbmsOperation:RdbmsOperation 是一個重用的java object對象代表sql查詢,更新或者存儲過程。

5.7  SqlCall:繼承自RdbmsOperation,使用一個JdbcTemplate,表示一個SQL調用,比如一個存儲過程或者一個存儲函數。

5.8  SqlFunction:SqlFunction RDBMS操作類封裝了一個SQL“函數”包裝器(wrapper), 該包裝器適用於查詢並返回一個單行結果集。默認返回的是一個int值, 不過我們可以采用類似JdbcTemplate中的queryForXxx 做法自己實現來返回其它類型。SqlFunction優勢在於我們不必創建 JdbcTemplate,這些它都在內部替我們做了。

       該類的主要用途是調用SQL函數來返回一個單值的結果集,比如類似“select user()”、 “select sysdate from dual”的查詢。如果需要調用更復雜的存儲函數, 可以使用StoredProcedure或SqlCall。

       SqlFunction是一個具體類,通常我們不需要它的子類。 其用法是創建該類的實例,然后聲明SQL語句以及參數就可以調用相關的run方法去多次執行函數。

5.9  SqlOperation:操作對象,用來表示一個SQL操作,比如查詢或者更新,而不是一個存儲過程。

5.10  SqlQuery:SqlQuery是一個可重用、線程安全的類,它封裝了一個SQL查詢。 其子類必須實現newResultReader()方法,該方法用來在遍歷 ResultSet的時候能使用一個類來保存結果。 我們很少需要直接使用SqlQuery,因為其子類 MappingSqlQuery作為一個更加易用的實現能夠將結果集中的行映射為Java對象。 SqlQuery還有另外兩個擴展分別是 MappingSqlQueryWithParameters和UpdatableSqlQuery。

5.11  SqlUpdate:SqlUpdate類封裝了一個可重復使用的SQL更新操作。 跟所有RdbmsOperation類一樣,SqlUpdate可以在SQL中定義參數。

       該類提供了一系列update()方法,就像SqlQuery提供的一系列execute()方法一樣。

       SqlUpdate是一個具體的類。通過在SQL語句中定義參數,這個類可以支持 不同的更新方法,我們一般不需要通過繼承來實現定制。

5.12  StoredProcedure:StoredProcedure類是一個抽象基類,它是對RDBMS存儲過程的一種抽象。 該類提供了多種execute(..)方法,不過這些方法的訪問類型都是protected的。

       從父類繼承的sql屬性用來指定RDBMS存儲過程的名字。 盡管該類提供了許多必須在JDBC3.0下使用的功能,但是我們更關注的是JDBC 3.0中引入的命名參數特性。

5.13  UpdatableSqlQuery:繼承自SqlQuery,可重復使用的關系數據庫查詢,其實現的子類必須實現抽象方法updateRow(ResultSet, int, context)來對JDBC結果集中的每一行進行更新。

六、 jdbc/support

6.1  AbstractFallbackSQLExceptionTranslator:SQLExceptionTranslator接口的抽象實現類,允許回退到其他的SQLExceptionTranslator。

6.2  CustomSQLErrorCodesTranslation:JavaBean,保存用於特定數據庫的自定義的JDBC錯誤代碼轉換。“exceptionClass”屬性用來定義錯誤代碼中哪一種異常將被拋出。

6.3  CustomSQLExceptionTranslatorRegistrar:為特定的數據庫注冊自定義的SQLExceptionTranslator實例。

6.4  CustomSQLExceptionTranslatorRegistry:注冊特定的數據庫的自定義SQLExceptionTranslator實例。

6.5  DatabaseMetaDataCallback:JdbcUtils類使用的一個回調接口。該接口的實現類用於提取數據庫的元數據,而不用考慮異常的處理。SQLException將會被JdbcUtils類捕獲和處理。

6.6  DatabaseStartupValidator:用來檢測一個數據庫是否已經啟動的bean。

6.7  GeneratedKeyHolder:該類返回新增記錄時的自增長主鍵值。

6.8  JdbcAccessor:JdbcAccessor類是JdbcTemplate類的基類,用於處理JDBC的連接操作,同時也定義數據源、異常翻譯器等常用屬性。

6.9  JdbcUtils:JDBC工具類,包含數據源連接、斷連、數據查詢、數據更新及命令執行,方便直接使用Jdbc進行數據操作。

6.10  KeyHolder:用來檢索鍵的接口,通常用於JDBC進行插入操作后返回的自動生成的鍵。該接口的實現類可以保存任意數量的鍵,一般情況下,這些鍵作為一個列表返回,其中包含了每一行記錄的鍵值的映射。KeyHolder的默認實現為GeneratedKeyHolder。

6.11  MetaDataAccessException:該異常表示在進行JDBC元數據查找時發生了錯誤。

6.12  SQLErrorCodes:用來為一個特定數據庫保存JDBC錯誤代碼的JavaBean。該類的實例一般通過bean工廠載入。會被Spring的SQLErrorCodeSQLExceptionTranslator使用。此包中的"sql-error-codes.xml"文件包含了各種不同數據庫默認的SQLErrorCodes實例。

6.13  SQLErrorCodesFactory:工廠類,基於取自DatabaseMetaData的databaseProductName創建SQLErrorCodes。

6.14  SQLErrorCodeSQLExceptionTranslator:SQLExceptionTranslator的默認實現。 該實現使用指定數據庫廠商的error code,比采用SQLState更精確。 轉換過程基於一個JavaBean(類型為SQLErrorCodes)中的error code。 這個JavaBean由SQLErrorCodesFactory工廠類創建,其中的內容來自於 "sql-error-codes.xml"配置文件。該文件中的數據庫廠商代碼基於Database MetaData信息中的 DatabaseProductName,從而配合當前數據庫的使用。

  SQLErrorCodeSQLExceptionTranslator使用以下的匹配規則:

       首先檢查是否存在完成定制轉換的子類實現。通常SQLErrorCodeSQLExceptionTranslator 這個類可以作為一個具體類使用,不需要進行定制,那么這個規則將不適用。

       接着將SQLException的error code與錯誤代碼集中的error code進行匹配。 默認情況下錯誤代碼集將從SQLErrorCodesFactory取得。 錯誤代碼集來自classpath下的sql-error-codes.xml文件, 它們將與數據庫metadata信息中的database name進行映射。

       如果仍然無法匹配,最后將調用fallbackTranslator屬性的translate方法,SQLStateSQLExceptionTranslator類實例是默認的fallbackTranslator。

6.15  SQLExceptionSubclassTranslator:SQLExceptionTranslator接口的實現類,會對JDBC驅動拋出的SQLException進行解析。

6.16  SQLExceptionTranslator:是一個接口,如果你需要在 SQLException和org.springframework.dao.DataAccessException之間作轉換,那么必須實現該接口。 轉換器類的實現可以采用一般通用的做法(比如使用JDBC的SQLState code),如果為了使轉換更准確,也可以進行定制(比如使用Oracle的error code)。

6.17  SQLStateSQLExceptionTranslator:SQLExceptionTranslator接口的實現類,基於SQLException分析SQL的狀態。

6.18  SqlValue:用於一些復雜類型的接口,這些類型要作為statement參數被設置。

jdbc/support/incrementer

6.19  AbstractColumnMaxValueIncrementer:使用一張模擬序列的表產生主鍵值,可以通過cacheSize屬性指定緩存的主鍵個數,當內存中主鍵值用完后,遞增器將一次性獲取cacheSize個主鍵,這樣可以減少數據庫訪問的次數,提高應用的性能。

6.20  AbstractDataFieldMaxValueIncrementer:實現DataFieldMaxValueIncrementer接口,是一個抽象類,它定義了三個屬性:

       private DataSource dataSource;  // 數據源

       private String incrementerName;  // 發號表表名

       protected int paddingLength = 0;  // 返回字符串類型補零位數

       然后定義了一個抽象方法getNextKey(),將接口中的三個方法歸一化成這一個方法,子類只需實現返回long類型返回值即可。

6.21  AbstractIdentityColumnMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類的抽象基類,基於序列式表格的自增列。

6.22  AbstractSequenceMaxValueIncrementer:AbstractSequenceMaxAbstractSequence使用標准的數據庫序列產生主鍵值,

6.23  DataFieldMaxValueIncrementer:spring jdbc 提供了自增,自增對象讓我們可以不依賴數據庫的自增鍵,在應用層為新紀錄提供主鍵值。一般數據庫提供了自增鍵的功能,如MySql的auto_increment,SqlServer的identity字段等。Spring運行用戶在應用層產生主鍵值,為此定義了DataFieldMaxValueIncrementer接口。

  該接口提供3個獲取下一個主鍵值的方法,就是以不同類型獲取發號器的下一個值。

       int nextIntValue();獲取下一個主鍵值,主鍵值類型為int,

       long nextLongValue();獲取下一個主鍵值,主鍵值類型為long,

       String nextStringValue();獲取下一個主鍵值,主鍵值類型為String。

6.24  DB2MainframeSequenceMaxValueIncrementer:繼承自AbstractSequenceMaxValueIncrementer,在大型商業服務器(z/OS、 DB2/390、DB2/400)上的DB2中一個指定的序列中獲取下一個值。

       已廢棄,被Db2MainframeMaxValueIncrementer取代。

6.25  Db2MainframeMaxValueIncrementer:繼承自AbstractSequenceMaxValueIncrementer,在大型商業服務器(z/OS、 DB2/390、DB2/400)上的DB2中一個指定的序列中獲取下一個值。

6.26  DB2SequenceMaxValueIncrementer:繼承自AbstractSequenceMaxValueIncrementer,在DB2 LUW(Linux、Unix和Windows)上一個給定的序列中獲取下一個值。

       已廢棄,被Db2LuwMaxValueIncrementer取代。

6.27  Db2LuwMaxValueIncrementer:繼承自AbstractSequenceMaxValueIncrementer,在DB2 LUW(Linux、Unix和Windows)上一個給定的序列中獲取下一個值。

6.28  DerbyMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,對一個給定的Derby表格的最大值進行增加,等同於一個自增的列。注意:如果使用了該類,你的Derby的key列就不要設置為自增的列,因為序列化表格會做此事。

6.29  H2SequenceMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,對一個給定的H2序列取得下一個值。

6.30  HanaSequenceMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,對一個給定的SAP HANA序列取得下一個值。

6.31  HsqlMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,對於一個HSQL表格增加最大值,作用等同於自增的列。注意:如果你使用該類,你的HSQL鍵列不要設置為自增,因為這個序列化表格做了這份工作。

6.32  HsqlSequenceMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,從一個給定的HSQL表格中獲取下一個值。

6.33  MySQLMaxValueIncrementer:一個基於MySQL數據源的自增發號器類,它利用MySQL的last_insert_id()函數和內存緩存巧妙的實現了支持分布式和高效的發號器功能。

6.34  OracleSequenceMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,用於從一個給定的Oracle序列中獲取下一個值。

6.35  PostgreSQLSequenceMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,用於從一個給定的PostgreSQL序列中獲取下一個值。

       已廢棄,被PostgresSequenceMaxValueIncrementer取代。

6.36  PostgresSequenceMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,用於從一個給定的PostgreSQL序列中獲取下一個值。

6.37  SqlServerMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,對於一個SQL Server表格增加其最大值,作用等同於自增的列。注意:如果你使用該類,你的表格鍵列不要設置為自增,因為這個序列化表格做了這份工作。

6.38  SybaseAnywhereMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,對於一個Sybase表格增加其最大值,作用等同於自增的列。注意:如果你使用該類,你的表格鍵值列不要設置為自增,因為這個序列化表格做了這份工作。該類用在任意的Sybase處。

6.39  SybaseMaxValueIncrementer:DataFieldMaxValueIncrementer接口實現類,對於一個Sybase表格增加其最大值,作用等同於自增的列。注意:如果你使用該類,你的表格鍵值列不要設置為自增,因為這個序列化表格做了這份工作。該類用在Sybase Adaptive Server處。

jdbc/support/lob

       LOB 代表大對象數據,包括 BLOB 和 CLOB 兩種類型,前者用於存儲大塊的二進制數據,如圖片數據,視頻數據等,而后者用於存儲長文本數據,如論壇的帖子內容,產品的詳細描述等。

       在不同的數據庫中,大對象對應的字段類型是不盡相同的,如 DB2 對應 BLOB/CLOB,MySql 對應 BLOB/LONGTEXT,SqlServer 對應 IMAGE/TEXT。

       有些數據庫的大對象類型可以象簡單類型一樣訪問,如 MySql 的 LONGTEXT 的操作方式和 VARCHAR 類型一樣。在一般情況下, LOB 類型數據的訪問方式不同於其它簡單類型的數據,我們經常會以流的方式操作 LOB 類型的數據。此外,LOB 類型數據的訪問不是線程安全的,需要為其單獨分配相應的數據庫資源,並在操作完成后釋放資源。最后,Oracle 9i 非常有個性地采用非 JDBC 標准的 API 操作 LOB 數據。所有這些情況給編寫操作 LOB 類型數據的程序帶來挑戰,Spring 在org.springframework.jdbc.support.lob包中為我們提供了相應的幫助類,以便我們輕松應對這頭攔路虎。

       Spring 大大降低了我們處理 LOB 數據的難度。首先,Spring 提供了NativeJdbcExtractor接口,您可以在不同環境里選擇相應的實現類從數據源中獲取本地 JDBC 對象;其次,Spring 通過LobCreator接口取消了不同數據廠商操作 LOB 數據的差別,並提供了創建 LobCreator 的LobHandler接口,您只要根據底層數據庫類型選擇合適的 LobHandler 進行配置即可。

6.40  AbstractLobHandler:LobHandler接口實現類的抽象基類。

6.41  DefaultLobHandler:LobHandler接口的默認實現,調用ResultSet 和PreparedStatement提供的存取方法。

6.42  LobCreator:以統一的方式操作各種數據庫的 LOB 類型數據。因為 LobCreator 本身持有 LOB 所對應的數據庫資源,所以它不是線程安全的,一個 LobCreator 只能操作一個 LOB 數據。

6.43  LobHandler:LobHandler接口為操作 BLOB/CLOB 提供了統一訪問接口,而不管底層數據庫究竟是以大對象的方式還是以一般數據類型的方式進行操作。此外,LobHandler 還充當了 LobCreator 的工廠類。

6.44  PassThroughBlob:簡單的JDBC Blob適配器,暴露一個給定的字節數組或者二進制流。該類被DefaultLobHandler使用。

6.45  PassThroughClob:簡單的JDBC Clob適配器,暴露一個給定的字符串或者字符流。該類被DefaultLobHandler使用。

6.46  TemporaryLobCreator:基於臨時性的LOBs的LobCreator接口實現類。使用JDBC 4.0的java.sql.Connection#createBlob()。

jdbc/support/rowset

6.47  ResultSetWrappingSqlRowSet:Spring的SqlRowSet接口的默認實現類,封裝了一個ResultSet,捕獲所有的SQLException,然后將其轉換成相應的Spring InvalidResultSetAccessException。

6.48  ResultSetWrappingSqlRowSetMetaData:SqlRowSetMetaData接口的默認實現類,封裝了一個ResultSetMetaData實例,捕獲所有的SQLException,然后將其轉換成相應的InvalidResultSetAccessException。

6.49  SqlRowSet:繼承自java.io.Serializable,是RowSet的鏡像接口,用來表示一種斷開連接的結果集。SqlRowSet和標准的JDBC RowSet主要的不同之處在於它不會拋出SQLException。這就讓使用SqlRowSet時不需要考慮去處理此類異常。取而代之的是,一個SqlRowSet會拋出Spring的InvalidResultSetAccessException。

6.50  SqlRowSetMetaData:基於SqlRowSet的元數據接口,類似於JDBC的ResultSetMetaData。

jdbc/support/xml

6.51  Jdbc4SqlXmlHandler:SqlXmlHandler接口的默認實現類。借助於JDBC 4.0 java.sql.SQLXML實現了將XML文檔存儲到特定數據庫的域中,或者將其從數據庫域中取出。

6.52  SqlXmlFeatureNotImplementedException:當底層實現不支持請求的API時拋出異常。

6.53  SqlXmlHandler:對數據庫中XML字段處理的抽象。它的主要目的是隔離對存儲在數據庫中的XML的處理。

6.54  SqlXmlValue:繼承自SqlValue接口,支持將XML數據傳給特定的列,增加清理的回調方法,在值設置完畢和相應的statement執行完畢后調用。

6.55  XmlBinaryStreamProvider:該接口定義了對提供輸出流數據的處理操作,這些輸出流是作為作為XML輸入的。

6.56  XmlCharacterStreamProvider:該接口定義了一些處理操作,用於提供作為XML輸入的寫入數據。

6.57  XmlResultProvider:該接口定義了一些處理操作,用於提供作為XML輸入的結果數據。

 

拓展閱讀:

  Spring框架之beans源碼完全解析
  Spring框架之AOP源碼完全解析
  Spring框架之jdbc源碼完全解析
  Spring源碼深度解析之數據庫連接JDBC
  Spring框架之jms源碼完全解析
  Spring框架之事務源碼完全解析
  Spring源碼深度解析之事務
  Spring源碼深度解析之Spring MVC
  Spring框架之websocket源碼完全解析
  WebSocket協議中文版
  Spring框架之spring-web web源碼完全解析
  Spring框架之spring-web http源碼完全解析
  Spring框架之spring-webmvc源碼完全解析


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM