隨筆-35  評(píng)論-97  文章-0  trackbacks-0

          在某些情況下,我們可能需要同一個(gè)實(shí)體bean對(duì)應(yīng)著多個(gè)數(shù)據(jù)庫(kù)表,比如,你的數(shù)據(jù)庫(kù)表是按照每個(gè)月添加一個(gè),但是對(duì)應(yīng)的實(shí)體bean并沒(méi)有改變。這個(gè)時(shí)候,我們就需要支持表明變換了,否則,難道你每個(gè)月改變一下orm映射配置嗎?如果每天都換一個(gè)表呢?

          在EasyDBO上,要做到支持表名變換是很容易的。只需在使用各種數(shù)據(jù)庫(kù)操作時(shí)添加一個(gè)表名稱(chēng)的的變量(按照一定的算法產(chǎn)生),如原來(lái)的easyDB.add(object)變?yōu)閑asyDB.add(object, tablename)。

          在具體的實(shí)現(xiàn)上,我們應(yīng)該從哪里入手去替換表名呢?看看EasyDBO的源碼,保存有數(shù)據(jù)庫(kù)表名稱(chēng)的是在DBTable這個(gè)類(lèi)中,其中name就是指數(shù)據(jù)庫(kù)表名,利用setter方法,很容易植入數(shù)據(jù)庫(kù)表名。但是在哪個(gè)時(shí)機(jī)植入比較合適?當(dāng)然選取盡可能可以減少重復(fù)代碼就可以完成的時(shí)機(jī)。

          看看吧,在信息轉(zhuǎn)換為DBTable對(duì)象時(shí),再重新植入表名,就可以了。在EasyDB類(lèi)中,方法private DBTable findTable(Class cls)會(huì)從類(lèi)或?qū)ο笾蝎@取信息包裝成DBTable對(duì)象,所以這是關(guān)鍵的地方。private DBObject obj2dbo(Object obj)和其他的方法都直接或者間接調(diào)findTable(Class cls)來(lái)獲取表信息。做一些小改動(dòng)就可以了,最好是添加一個(gè)重載的方法,而不是修改原來(lái)的方法。修改添加兩個(gè)樣板,其他方法也差不多是這樣:

              private DBTable findTable(Class cls, String tableName)
              
          {
                  
          if(!StringUtils.hasText(tableName)){
                      
          return findTable(cls);
                  }

                  DBTable table 
          = this.mapping.findTable(cls);
                  table.setName(tableName);
                  
          return table;
              }


              
          private DBObject obj2dbo(Object obj, String tableName)
              
          {
                  
          if(!StringUtils.hasText(tableName)){
                      
          return obj2dbo(obj);
                  }

                  
          /**
                   * 若obj本來(lái)就是泛數(shù)據(jù)表DBOjbect對(duì)象,則直接返回
                   
          */

                  
          if(obj.getClass() == DBObject.class)
                  
          {
                      
          return (DBObject)obj;
                  }

                  DBTable table 
          = findTable(obj.getClass(),tableName);
                  DBObject dbo 
          = new DBObject(table);
                  dbo.setValue(obj2dboMap(obj, table));
                  dbo.setIdValue(dbo.get(table.getId()));
                  
          return dbo;
              }

          給出修改后的EasyDB類(lèi)的源碼,在這里下載。

           

          posted on 2007-07-06 10:42 三告習(xí)習(xí) 閱讀(974) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): easyJF-projects

          評(píng)論:
          # re: [EasyDBO] EasyDBO添加支持?jǐn)?shù)據(jù)庫(kù)表名(表結(jié)構(gòu)不變)變換功能 2007-07-16 20:53 | 小雨
          這個(gè)方法還真好用,以前沒(méi)這樣用過(guò)。  回復(fù)  更多評(píng)論
            
          # re: [EasyDBO] EasyDBO添加支持?jǐn)?shù)據(jù)庫(kù)表名(表結(jié)構(gòu)不變)變換功能 2007-07-16 21:09 | 三告習(xí)習(xí)
          @小雨
          呵呵,過(guò)獎(jiǎng)咯
          因?yàn)樾枰瑴愑靡幌露?

            回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 汉源县| 荆州市| 朝阳区| 黑山县| 长海县| 措勤县| 荆州市| 安岳县| 通化市| 东安县| 德安县| 苏州市| 闽清县| 新丰县| 甘泉县| 临沭县| 沁源县| 三亚市| 宝应县| 黎平县| 九江县| 岳西县| 保山市| 安远县| 盐山县| 曲阜市| 手机| 汨罗市| 墨江| 扬中市| 泸溪县| 大理市| 昌吉市| 常山县| 文昌市| 连州市| 弥渡县| 曲靖市| 丹棱县| 沾益县| 双峰县|