本篇內(nèi)容介紹了“基于JDBC模式怎么適配和管理動態(tài)數(shù)據(jù)源”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)治多,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
動態(tài)管理數(shù)據(jù)源的基本功能:數(shù)據(jù)源加載,容器維護(hù),持久化管理。
不同廠商的關(guān)系型數(shù)據(jù)庫,提供的鏈接方式,驅(qū)動包,驅(qū)動類名都是不一樣的,Java數(shù)據(jù)庫連接API,JDBC是Java語言中用來規(guī)范客戶端程序如何來訪問數(shù)據(jù)庫的應(yīng)用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫中數(shù)據(jù)的方法,且適配大部分關(guān)系型數(shù)據(jù)庫。
核心要素:驅(qū)動包、驅(qū)動類名、URL格式、默認(rèn)端口。
關(guān)系型數(shù)據(jù)庫很多,這里一定是不全的,根據(jù)需要自行完善即可。
public enum DataSourceType { MySQL("MySql", "com.mysql.jdbc.Driver"), Oracle("Oracle", "oracle.jdbc.OracleDriver"), DB2("DB2", "com.ibm.db2.jcc.DB2Driver"); private String dataSourceName; private String driverClassName; public static String getDriver (String dataSourceName) { DataSourceType[] types = DataSourceType.values(); for (DataSourceType type : types) { if (type.getDataSourceName().equals(dataSourceName)) { return type.getDriverClassName(); } } return null; } DataSourceType (String dataSourceName,String driverClassName){ this.dataSourceName = dataSourceName ; this.driverClassName = driverClassName ; } }
DriverManager
管理JDBC驅(qū)動程序的基本服務(wù)API。調(diào)用方法Class.forName,顯式地加載驅(qū)動程序類,正好適用于動態(tài)數(shù)據(jù)源的業(yè)務(wù)場景,數(shù)據(jù)源類型未知情況。加載Driver類并在DriverManager類注冊后,即可用來與數(shù)據(jù)庫建立連接。
DataSource
DataSource接口,由驅(qū)動程序供應(yīng)商實(shí)現(xiàn),負(fù)責(zé)建立與數(shù)據(jù)庫的連接,當(dāng)在應(yīng)用程序中訪問數(shù)據(jù)庫時(shí),常用于獲取操作數(shù)據(jù)的Connection對象。
Connection
Connection接口代表與特定的數(shù)據(jù)庫的連接,要對數(shù)據(jù)庫數(shù)據(jù)進(jìn)行操作,首先要獲取數(shù)據(jù)庫連接,Connection實(shí)現(xiàn)就像在應(yīng)用程序中與數(shù)據(jù)庫之間開通了一條通道,通過DriverManager類或DataSource類都可獲取Connection實(shí)例。
這里幾個(gè)核心類的封裝思路:模塊化功能,API分開封裝,如果需要適配處理各類數(shù)據(jù)源類型,則分別可以向上抽象提取,向下自定義適配策略,設(shè)計(jì)模式影響下的基本意識。
基于DriverManager管理數(shù)據(jù)源的驅(qū)動加載,鏈接獲取等。
public class ConnectionUtil { public static synchronized Connection getConnect(String driverClassName,String userName, String passWord,String jdbcUrl) { Properties prop = new Properties(); prop.put("user", userName); prop.put("password", passWord); return connect(driverClassName,prop,jdbcUrl) ; } private static synchronized Connection connect(String driverClassName, Properties prop,String jdbcUrl) { try { Class.forName(driverClassName); DriverManager.setLoginTimeout(JdbcConstant.LOGIN_TIMEOUT); return DriverManager.getConnection(jdbcUrl, prop); } catch (Exception e) { e.printStackTrace(); } return null ; } }
提供API配置獲取類,加載需要的數(shù)據(jù)源API,關(guān)閉資源等基本操作。
@Component public class JdbcConfig { /** * 獲取數(shù)據(jù)源連接 */ public Connection getConnection (ConnectionEntity connectionEntity){ String dataTypeName = connectionEntity.getDataTypeName(); String driverClassName = DataSourceType.getDriver(dataTypeName) ; if (driverClassName == null){ throw new RuntimeException("不支持該數(shù)據(jù)源類型") ; } connectionEntity.setDriverClassName(driverClassName); return ConnectionUtil.getConnect(connectionEntity.getDriverClassName(), connectionEntity.getUserName(), connectionEntity.getPassWord(), connectionEntity.getJdbcUrl()) ; } }
維護(hù)一個(gè)Map容器,管理數(shù)據(jù)源的添加,刪除,動態(tài)獲取等基本需求。
@Component public class DataSourceFactory { private volatile MapdataSourceMap = new HashMap<>(); @Resource private JdbcConfig jdbcConfig ; @Resource private ConnectionMapper connectionMapper ; /** * 數(shù)據(jù)源API包裝 */ private static DataSource getDataSource (ConnectionEntity connectionEntity){ DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(connectionEntity.getJdbcUrl()); datasource.setUsername(connectionEntity.getUserName()); datasource.setPassword(connectionEntity.getPassWord()); datasource.setDriverClassName(connectionEntity.getDriverClassName()); return datasource ; } /** * 獲取 JDBC 鏈接 */ public JdbcTemplate getById (Integer id){ return new JdbcTemplate(dataSourceMap.get(id)) ; } /** * 移除 數(shù)據(jù)源 */ public void removeById (Integer id) { dataSourceMap.remove(id) ; } /** * 添加數(shù)據(jù)源管理 * 注意這里的方法,連接驗(yàn)證之后直接調(diào)用 */ public void addDataSource (ConnectionEntity connectionEntity){ DataSource dataSource = getDataSource(connectionEntity); dataSourceMap.put(connectionEntity.getId(),dataSource) ; } }
基于動態(tài)的數(shù)據(jù)源,查詢表數(shù)據(jù),這里操作的表示已知的表結(jié)構(gòu),實(shí)際上動態(tài)數(shù)據(jù)源的表結(jié)構(gòu)都是需要再次動態(tài)獲取表字段,才能操作。(下節(jié)數(shù)據(jù)動態(tài)讀取和寫入會詳說)
@Api(value = "JdbcQueryController") @RestController public class JdbcQueryController { @Resource private DataSourceFactory dataSourceFactory ; @GetMapping("getList") public ListgetList (@RequestParam("id") Integer id){ String sql = "SELECT * FROM jm_connection WHERE state='1'" ; JdbcTemplate jdbcTemplate = dataSourceFactory.getById(id); List connectionEntities = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ConnectionEntity.class)); return connectionEntities ; } }
持久化數(shù)據(jù)源的配置信息,多了一步配置信息入庫,和入庫信息加載到容器,使用時(shí)動態(tài)獲取。
存儲配置信息的表結(jié)構(gòu),轉(zhuǎn)換Mapper文件。
測試數(shù)據(jù)源鏈接是否成功,可用的數(shù)據(jù)源鏈接,配置信息入庫保存。
@Service public class ConnectionServiceImpl implements ConnectionService { @Resource private ConnectionMapper connectionMapper ; @Resource private JdbcConfig jdbcConfig ; @Resource private DataSourceFactory dataSourceFactory ; @Override public boolean testConnection(ConnectionEntity connectionEntity) { return jdbcConfig.getConnection(connectionEntity) !=null ; } @Override public boolean addConnection(ConnectionEntity connectionEntity) { Connection connection = jdbcConfig.getConnection(connectionEntity) ; if (connection !=null){ int addFlag = connectionMapper.insert(connectionEntity); if (addFlag > 0){ dataSourceFactory.addDataSource(connectionEntity) ; return true ; } } return false ; } }
容器工廠類中,添加一個(gè)初始化的方法,加載入庫的數(shù)據(jù)源配置信息。
@Component public class DataSourceFactory { /** * 初始化 JDBC 鏈接API */ @PostConstruct public void init (){ ListconnectionList = connectionMapper.getAllList(); if (connectionList != null && connectionList.size()>0){ for (ConnectionEntity connectionEntity:connectionList) { Connection connection = jdbcConfig.getConnection(connectionEntity) ; if (connection != null){ DataSource dataSource = getDataSource(connectionEntity); dataSourceMap.put(connectionEntity.getId(),dataSource) ; } } } } }
“基于JDBC模式怎么適配和管理動態(tài)數(shù)據(jù)源”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!