Spring框架之jdbc源碼徹底解析

Spring框架之jdbc源碼徹底解析html

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

       一、指定數據庫鏈接參數web

       二、打開數據庫鏈接算法

       三、聲明SQL語句spring

       四、預編譯並執行SQL語句sql

       五、遍歷查詢結果(若是須要的話)數據庫

       六、處理每一次遍歷操做數組

       七、處理拋出的任何異常緩存

       八、處理事務安全

       九、關閉數據庫鏈接

       使用了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模塊中包含的類和接口進行分析。

1、 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歸類到某一種通用的異常時拋出此異常。

2、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接口的實現類,獲取一列地區字符串,建立排序的一組資源實例。

3、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:三個核心回調接口中的一個,被JdbcTemplat類使用。該接口用於建立一個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主要提供如下三種類型的方法:

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

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

       三、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、DB二、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存儲,這樣對之後的查詢更新存儲等操做都提供很大的方便。

4、 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、H二、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、H二、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接口的實現類,簡單封裝一個給定的數據源,任何數據源名字都返回此值。

5、 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結果集中的每一行進行更新。

6、 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源碼深度解析之數據庫鏈接JDBC
  Spring框架之spring-webmvc源碼徹底解析
  Spring源碼深度解析之Spring MVC
  Spring框架之spring-web web源碼徹底解析
  Spring框架之spring-web http源碼徹底解析
  Spring框架之jms源碼徹底解析
  Spring框架之AOP源碼徹底解析
  Spring框架之beans源碼徹底解析

 

博衆家之所長,集羣英之薈萃。遴選各IT領域精品雄文!

歡迎關注「IT架構精選」

 

相關文章
相關標籤/搜索