基于JDBC模式怎么適配和管理動態(tài)數(shù)據(jù)源

本篇內(nèi)容介紹了“基于JDBC模式怎么適配和管理動態(tài)數(shù)據(jù)源”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)治多,十年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

一、關(guān)系型數(shù)據(jù)源

1、動態(tài)數(shù)據(jù)源

動態(tài)管理數(shù)據(jù)源的基本功能:數(shù)據(jù)源加載,容器維護(hù),持久化管理。

2、關(guān)系型數(shù)據(jù)庫

不同廠商的關(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ù)庫。

3、適配要素

核心要素:驅(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 ;
    }
}

4、JDBC基礎(chǔ)API

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)商實現(xiàn),負(fù)責(zé)建立與數(shù)據(jù)庫的連接,當(dāng)在應(yīng)用程序中訪問數(shù)據(jù)庫時,常用于獲取操作數(shù)據(jù)的Connection對象。

Connection

Connection接口代表與特定的數(shù)據(jù)庫的連接,要對數(shù)據(jù)庫數(shù)據(jù)進(jìn)行操作,首先要獲取數(shù)據(jù)庫連接,Connection實現(xiàn)就像在應(yīng)用程序中與數(shù)據(jù)庫之間開通了一條通道,通過DriverManager類或DataSource類都可獲取Connection實例。

二、鏈接和管理

這里幾個核心類的封裝思路:模塊化功能,API分開封裝,如果需要適配處理各類數(shù)據(jù)源類型,則分別可以向上抽象提取,向下自定義適配策略,設(shè)計模式影響下的基本意識。

1、鏈接工具

基于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 ;
    }
}

2、API工具類

提供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()) ;
    }
}

3、數(shù)據(jù)源容器

維護(hù)一個Map容器,管理數(shù)據(jù)源的添加,刪除,動態(tài)獲取等基本需求。

@Component
public class DataSourceFactory {
    private volatile Map<Integer, DataSource> dataSourceMap = 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ù)源管理
     * 注意這里的方法,連接驗證之后直接調(diào)用
     */
    public void addDataSource (ConnectionEntity connectionEntity){
        DataSource dataSource = getDataSource(connectionEntity);
        dataSourceMap.put(connectionEntity.getId(),dataSource) ;
    }
}

4、流程測試

基于動態(tài)的數(shù)據(jù)源,查詢表數(shù)據(jù),這里操作的表示已知的表結(jié)構(gòu),實際上動態(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 List<ConnectionEntity> getList (@RequestParam("id") Integer id){
        String sql = "SELECT * FROM jm_connection WHERE state='1'" ;
        JdbcTemplate jdbcTemplate = dataSourceFactory.getById(id);
        List<ConnectionEntity> connectionEntities = jdbcTemplate.query(sql,
                new BeanPropertyRowMapper<>(ConnectionEntity.class));
        return connectionEntities ;
    }
}

三、批量管理

持久化數(shù)據(jù)源的配置信息,多了一步配置信息入庫,和入庫信息加載到容器,使用時動態(tài)獲取。

1、庫表Mapper結(jié)構(gòu)

存儲配置信息的表結(jié)構(gòu),轉(zhuǎn)換Mapper文件。

<mapper namespace="com.dynamic.add.mapper.ConnectionMapper">
    <!-- 通用查詢映射結(jié)果 -->
    <resultMap id="BaseResultMap" type="com.dynamic.add.entity.ConnectionEntity">
        <id column="id" property="id" />
        <result column="data_type_name" property="dataTypeName" />
        <result column="driver_class_name" property="driverClassName" />
        <result column="jdbc_url" property="jdbcUrl" />
        <result column="user_name" property="userName" />
        <result column="pass_word" property="passWord" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="state" property="state" />
    </resultMap>
    <select id="getAllList" resultMap="BaseResultMap" >
        SELECT * FROM jm_connection WHERE state='1'
    </select>
</mapper>

2、持久化管理

測試數(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 ;
    }
}

3、動態(tài)加載

容器工廠類中,添加一個初始化的方法,加載入庫的數(shù)據(jù)源配置信息。

@Component
public class DataSourceFactory {
    /**
     * 初始化 JDBC 鏈接API
     */
    @PostConstruct
    public void init (){
        List<ConnectionEntity> connectionList = 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ì)量的實用文章!

新聞標(biāo)題:基于JDBC模式怎么適配和管理動態(tài)數(shù)據(jù)源
文章鏈接:http://muchs.cn/article20/ijodco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、動態(tài)網(wǎng)站、網(wǎng)站排名App設(shè)計、移動網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化