日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring 事务core 模块-元数据metaData 模块

發布時間:2024/4/13 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring 事务core 模块-元数据metaData 模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?CallMetaDataProviderFactory 創建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 創建TableMetaDataProvider 工廠類,其創建過程如下:

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 提供參數值

使用Map 來指定參數值有時候工作得非常好,但是這并不是最簡單的使用方式。Spring提供了一些其他的SqlParameterSource 實現類來指定參數值。我們首先可以看看BeanPropertySqlParameterSource 類,這是一個非常簡便的指定參數的實現類,只要你有一個符合JavaBean 規范的類就行了。它將使用其中的getter 方法來獲取參數值。

SqlParameter 封裝了定義sql 參數的對象。CallableStateMentCallback ,PrePareStateMentCallback,StateMentCallback,ConnectionCallback 回調類分別對應JdbcTemplate 中的不同處理方法。

simple 實現

Spring 通過DataSource 獲取數據庫的連接。Datasource 是jdbc 規范的一部分,它通過ConnectionFactory 獲取。一個容器和框架可以在應用代碼層中隱藏連接池和事務管理。

當使用spring 的jdbc 層,你可以通過JNDI 來獲取DataSource,也可以通過你自己配置的第三方連接池實現來獲取。流行的第三方實現由apache Jakarta Commons dbcp 和c3p0。

?

總結

以上是生活随笔為你收集整理的Spring 事务core 模块-元数据metaData 模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。