javascript
Spring 事务core 模块-元数据metaData 模块
?CallMetaDataProviderFactory 創(chuàng)建CallMetaDataProvider 的工廠類,其代碼如下:
public class CallMetaDataProviderFactory {public static final List<String> supportedDatabaseProductsForProcedures = Arrays.asList("Apache Derby", "DB2", "MySQL", "Microsoft SQL Server", "Oracle", "PostgreSQL", "Sybase");public static final List<String> supportedDatabaseProductsForFunctions = Arrays.asList("MySQL", "Microsoft SQL Server", "Oracle", "PostgreSQL");private static final Log logger = LogFactory.getLog(CallMetaDataProviderFactory.class);public CallMetaDataProviderFactory() {}public static CallMetaDataProvider createMetaDataProvider(DataSource dataSource, CallMetaDataContext context) {try {CallMetaDataProvider result = (CallMetaDataProvider)JdbcUtils.extractDatabaseMetaData(dataSource, (databaseMetaData) -> {String databaseProductName = JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());boolean accessProcedureColumnMetaData = context.isAccessCallParameterMetaData();if (context.isFunction()) {if (!supportedDatabaseProductsForFunctions.contains(databaseProductName)) {if (logger.isWarnEnabled()) {logger.warn(databaseProductName + " is not one of the databases fully supported for function calls -- supported are: " + supportedDatabaseProductsForFunctions);}if (accessProcedureColumnMetaData) {logger.warn("Metadata processing disabled - you must specify all parameters explicitly");accessProcedureColumnMetaData = false;}}} else if (!supportedDatabaseProductsForProcedures.contains(databaseProductName)) {if (logger.isWarnEnabled()) {logger.warn(databaseProductName + " is not one of the databases fully supported for procedure calls -- supported are: " + supportedDatabaseProductsForProcedures);}if (accessProcedureColumnMetaData) {logger.warn("Metadata processing disabled - you must specify all parameters explicitly");accessProcedureColumnMetaData = false;}}Object provider;if ("Oracle".equals(databaseProductName)) {provider = new OracleCallMetaDataProvider(databaseMetaData);} else if ("DB2".equals(databaseProductName)) {provider = new Db2CallMetaDataProvider(databaseMetaData);} else if ("Apache Derby".equals(databaseProductName)) {provider = new DerbyCallMetaDataProvider(databaseMetaData);} else if ("PostgreSQL".equals(databaseProductName)) {provider = new PostgresCallMetaDataProvider(databaseMetaData);} else if ("Sybase".equals(databaseProductName)) {provider = new SybaseCallMetaDataProvider(databaseMetaData);} else if ("Microsoft SQL Server".equals(databaseProductName)) {provider = new SqlServerCallMetaDataProvider(databaseMetaData);} else if ("HDB".equals(databaseProductName)) {provider = new HanaCallMetaDataProvider(databaseMetaData);} else {provider = new GenericCallMetaDataProvider(databaseMetaData);}if (logger.isDebugEnabled()) {logger.debug("Using " + provider.getClass().getName());}((CallMetaDataProvider)provider).initializeWithMetaData(databaseMetaData);if (accessProcedureColumnMetaData) {((CallMetaDataProvider)provider).initializeWithProcedureColumnMetaData(databaseMetaData, context.getCatalogName(), context.getSchemaName(), context.getProcedureName());}return provider;});return result;} catch (MetaDataAccessException var3) {throw new DataAccessResourceFailureException("Error retrieving database metadata", var3);}} }TableMetaDataProviderFactory 創(chuàng)建TableMetaDataProvider 工廠類,其創(chuàng)建過程如下:
public static TableMetaDataProvider createMetaDataProvider(DataSource dataSource, TableMetaDataContext context) {try {TableMetaDataProvider result = (TableMetaDataProvider)JdbcUtils.extractDatabaseMetaData(dataSource, (databaseMetaData) -> {String databaseProductName = JdbcUtils.commonDatabaseName(databaseMetaData.getDatabaseProductName());boolean accessTableColumnMetaData = context.isAccessTableColumnMetaData();Object provider;if ("Oracle".equals(databaseProductName)) {provider = new OracleTableMetaDataProvider(databaseMetaData, context.isOverrideIncludeSynonymsDefault());} else if ("HSQL Database Engine".equals(databaseProductName)) {provider = new HsqlTableMetaDataProvider(databaseMetaData);} else if ("PostgreSQL".equals(databaseProductName)) {provider = new PostgresTableMetaDataProvider(databaseMetaData);} else if ("Apache Derby".equals(databaseProductName)) {provider = new DerbyTableMetaDataProvider(databaseMetaData);} else {provider = new GenericTableMetaDataProvider(databaseMetaData);}if (logger.isDebugEnabled()) {logger.debug("Using " + provider.getClass().getSimpleName());}((TableMetaDataProvider)provider).initializeWithMetaData(databaseMetaData);if (accessTableColumnMetaData) {((TableMetaDataProvider)provider).initializeWithTableColumnMetaData(databaseMetaData, context.getCatalogName(), context.getSchemaName(), context.getTableName());}return provider;});return result;} catch (MetaDataAccessException var3) {throw new DataAccessResourceFailureException("Error retrieving database metadata", var3);} }使用SqlParameterSource 提供參數(shù)值
使用Map 來指定參數(shù)值有時(shí)候工作得非常好,但是這并不是最簡單的使用方式。Spring提供了一些其他的SqlParameterSource 實(shí)現(xiàn)類來指定參數(shù)值。我們首先可以看看BeanPropertySqlParameterSource 類,這是一個(gè)非常簡便的指定參數(shù)的實(shí)現(xiàn)類,只要你有一個(gè)符合JavaBean 規(guī)范的類就行了。它將使用其中的getter 方法來獲取參數(shù)值。
SqlParameter 封裝了定義sql 參數(shù)的對象。CallableStateMentCallback ,PrePareStateMentCallback,StateMentCallback,ConnectionCallback 回調(diào)類分別對應(yīng)JdbcTemplate 中的不同處理方法。
simple 實(shí)現(xiàn)
Spring 通過DataSource 獲取數(shù)據(jù)庫的連接。Datasource 是jdbc 規(guī)范的一部分,它通過ConnectionFactory 獲取。一個(gè)容器和框架可以在應(yīng)用代碼層中隱藏連接池和事務(wù)管理。
當(dāng)使用spring 的jdbc 層,你可以通過JNDI 來獲取DataSource,也可以通過你自己配置的第三方連接池實(shí)現(xiàn)來獲取。流行的第三方實(shí)現(xiàn)由apache Jakarta Commons dbcp 和c3p0。
?
總結(jié)
以上是生活随笔為你收集整理的Spring 事务core 模块-元数据metaData 模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring 事务core 模块-Row
- 下一篇: TransactionAwareData