問(wèn)題虛擬背景:
          A項(xiàng)目組要實(shí)現(xiàn)一個(gè)基于Sql Server的應(yīng)用,但工作環(huán)境只安裝有MySql(公司對(duì)開源比較看好: )),而且客戶有可能會(huì)轉(zhuǎn)移到Oracle數(shù)據(jù)庫(kù)環(huán)境。要求應(yīng)用具有數(shù)據(jù)庫(kù)移植能力和快速更換能力,使應(yīng)用在工作環(huán)境調(diào)試成功后能迅速轉(zhuǎn)移到客戶的Sql Server環(huán)境,而且將來(lái)可以方便地轉(zhuǎn)向Oracle。

          Andy提出的可用方案:
          1、使用標(biāo)準(zhǔn)JDBC
          2、使用抽象類定義數(shù)據(jù)訪問(wèn)單元
          3、定義具體數(shù)據(jù)源訪問(wèn)單元繼承2中接口

          代碼示例:
          定義數(shù)據(jù)訪問(wèn)單元抽象類,包含數(shù)據(jù)訪問(wèn)邏輯

          public abstract class DataManager
          {
           
          protected static String conString = null;
           
          protected static String urlString = null;
           
          public DataType[ ] getData()
           
          {
             
          //fetch data using standard JDBC with conString and urlString
           }


           
          public void setData(DataType[ ] dataArray)
           
          {
             
          //store data using standard JDBC with conString and urlString
           }

          }

          定義具體數(shù)據(jù)源訪問(wèn)單元

          public class HsqlDataManager extends DataManager
          {
           
          static
           
          {
            conString 
          = "org.hsqldb.jdbcDriver";
            urlString 
          = "jdbc:hsqldb:db/YourDatabaseName";
           }

          }


          public class OdbcBlogManager extends AbstractBlogManager
          {
           
          static
           
          {
            conString 
          = "sun.jdbc.odbc.JdbcOdbcDriver";
            urlString 
          = "jdbc:odbc:db/YourDatabaseName";
           }

          }


          在調(diào)用數(shù)據(jù)訪問(wèn)層時(shí),可以聲明一個(gè)DataManager的引用,然后在構(gòu)造器中實(shí)例化為具體子類,如:

          public class Andy
          {
           
          private DataManager dataManager = null;
           
           
          public Andy
           
          {
            dataManager 
          = new HsqlDataManager();
            
          //或者在資源文件里填寫具體子類,然后在這里動(dòng)態(tài)加載并實(shí)例化
           }
           

           
          public void doSomething()
           
          {
            dataManager.getData();
            
           }

          }


          以后要遷移到另一個(gè)數(shù)據(jù)庫(kù)(有JDBC驅(qū)動(dòng)),只需定義具體子類繼承DataManager(如HsqlDataManager),然后修改資源文件中的DataManager名稱(或者將new的類名改一下),不需要修改代碼。

          這興許可以解釋另一個(gè)問(wèn)題:不贊成使用存儲(chǔ)過(guò)程,而應(yīng)將SQL語(yǔ)句嵌在代碼中(適用于Java;微軟注定.Net不會(huì)有平臺(tái)移植性,數(shù)據(jù)庫(kù)大都用Sql Server,所以寫存儲(chǔ)過(guò)程還是比較好的)。

          (我在我的一個(gè)Eclipse RCP項(xiàng)目里使用了這種模式,從Sql server 2000到Hsql,特別方便,看起來(lái)感覺也比較好)

          歡迎大家拍轉(zhuǎn),^_^



          版權(quán)所有 羅明
          posted on 2005-10-06 15:49 羅明 閱讀(1041) 評(píng)論(2)  編輯  收藏 所屬分類: JavaProgramTech
          Comments
           
          主站蜘蛛池模板: 呼伦贝尔市| 西平县| 平山县| 宁津县| 慈利县| 时尚| 周宁县| 麻江县| 峨边| 昔阳县| 阜阳市| 西充县| 台湾省| 玛多县| 固原市| 英吉沙县| 铁岭县| 象山县| 阿城市| 丰镇市| 遵化市| 搜索| 澄城县| 什邡市| 洱源县| 宣威市| 广饶县| 九龙城区| 德保县| 大石桥市| 保山市| 北京市| 余姚市| 赣州市| 雷波县| 桃园市| 鞍山市| 博兴县| 辉县市| 沙洋县| 昭通市|