甜咖啡

          我的IT空間

          Ibatis和Hibernate 數(shù)據(jù)庫分表(動(dòng)態(tài)表名映射)的實(shí)現(xiàn)方法

          自從ibatis 2.0.9以后,ibatis支持動(dòng)態(tài)表名。 

          以下為用Map做參數(shù)的動(dòng)態(tài)表名實(shí)現(xiàn)方法: 

          示例代碼如下: 
          Sample : 

          < select  id ="getRighe"  
          remapResults ="true" 
          resultMap ="resultRighe"  
          parameterClass ="java.util.Map" > 
          select * from 
          $tablePrefix$_righe 
          where IDUser = #IDUser# 
          </ select > 

          and java code : 

          param.put("IDUser", IDUser); 
          param.put("tablePrefix", "NAG"); 
          utente = (Riga)getSqlMapClientTemplate().queryForObject("getRighe", param); 


          但 如果我們要插入一個(gè)對(duì)象,我們需傳進(jìn)一個(gè)POJO對(duì)象,由于Ibatis 只能接受一個(gè)參數(shù),這時(shí)用Map來傳對(duì)象,會(huì)比較麻煩 

          可不可以用POJO對(duì)象里的一個(gè)屬性來決定表名呢? 

          答案是肯定的。 

          在分表設(shè)計(jì)的數(shù)據(jù)庫中,一般存在許多結(jié)構(gòu)相同,但表名后綴不同的表。 

          我們?cè)诓迦胍粋€(gè)新對(duì)象到表中里,由自己制定的路由規(guī)則是可以得到這個(gè)對(duì)象要插到那個(gè)表里的。即程序知道插到哪個(gè)表里,那么 

          怎么讓Ibatis也知道呢? 

          當(dāng)然你可以把Pojo對(duì)象屬性全放到Map里,再在Map里加一個(gè)表名的屬性,傳給Ibatis,但這樣比較麻煩 

          我們可以為每一個(gè)POJO對(duì)象增加一個(gè)表名后綴的屬性(或表名),在Ibatis里直接用這個(gè)屬性做表名。 

          不過,且記,用“$”來界定這個(gè)屬性的名字,而不是“#” 

          因?yàn)椋贗batis里,每一個(gè)#,除了替換值,它都會(huì)加上一個(gè)單引號(hào)'. 

          如下例所示:(假設(shè),你在Pojo對(duì)象里,增加了一個(gè)suffix的屬性,就可以這樣來決定插入表名) 

          INSERT INTO myTable$suffix$  
               (column1,column2)   
             VALUES (#column1#,#column2#) 
             
          這時(shí)的parameterClass仍為你的Pojo類。 


          Ibatis能比較方便地實(shí)現(xiàn)數(shù)據(jù)庫的分表問題,Hibernate可以用NamingStrategy實(shí)現(xiàn)動(dòng)態(tài)表名映射 


          以下內(nèi)容引自:http://jinguo.javaeye.com/blog/209642 

          用一個(gè)配置文件,一個(gè)類去映射多個(gè)表,(每個(gè)表的結(jié)構(gòu)相同)。按照平時(shí)的做法,有多少個(gè)表就要 
          寫多少個(gè)配置文件,豈不是很麻煩。怎樣才能只寫一個(gè)配置文件就能達(dá)到上述目的呢? 

             經(jīng)過研究,發(fā)現(xiàn)Hibernate中的NamingStrategy可以達(dá)到這個(gè)目的。它是用來定義表名和列名映射規(guī) 
          則的一個(gè)接口。我們要通過實(shí)現(xiàn)這個(gè)接口來實(shí)現(xiàn)自己的命名策略。這個(gè)接口中包含的十個(gè)方法,其中的 
          public String classToTableName(String className)是通過類名來映射表名的。實(shí)現(xiàn)我們的想法就要用 
          到這個(gè)方法。好了,下面來看怎么做: 

             1、自定義一個(gè)類MyNamingStrategy來實(shí)現(xiàn)NamingStrategy。(這樣你要實(shí)現(xiàn)10個(gè)方法,如果其他方法 
          不需要,我們可以通過繼承它的一個(gè)適配器類DefaultNamingStrategy來只實(shí)現(xiàn)我們需要的方法)好了,我 
          們就繼承DefaultNamingStrategy 吧。 
             
                2、實(shí)現(xiàn)public String classToTableName(String className)方法來實(shí)現(xiàn)自己命名策略。 

                例如業(yè)務(wù)需要是每隔一個(gè)月就要換一個(gè)表。比如1月用biz_1,那么2月就用biz_2....但是這些表的結(jié)構(gòu)是相同的。我們要做的就是通過獲得月份來動(dòng)態(tài)的選擇表。我們從這個(gè)方法中這樣寫: 
              public class MyNamingStrategy extends DefaultNamingStrategy { 
                  public static final MyNamingStrategy INSTANCE = new MyNamingStrategy(); 
                  public String classToTableName(String className) { 
                  return "biz_" + Calendar.getInstance().get(Calendar.DAY_OF_MONTH); 
                  } 
              } 

                 好了,這樣就可以根據(jù)月份來動(dòng)態(tài)的選擇表名了。 

              3、使用命名策略。 
                 要使用這個(gè)命名策略可以這樣: 
                 Configuration cfg = new Configuration() 
                         .setNamingStrategy(MyNamingStrategy.INSTANCE) 
                         .configure("hibernate.cfg.xml") 
                         .addFile("biz.hbm.xml"); 
          ---------------------------------- 
          for exemple 


          package com.etong.common.hibernate; 

          import net.sf.hibernate.cfg.NamingStrategy; 
          import net.sf.hibernate.util.StringHelper; 

          /** 
          * <p>Title: TNamingStrategy</p> 
          * <p>Description: </p> 
          * <p>Copyright: Copyright (c) 2005</p> 
          * <p>Company: </p> 
          * <p>Created on 2005-5-30 </p> 
          * @author jinguo 
          * @version 1.0 
          * 
          */ 

          public class TNamingStrategy implements NamingStrategy { 

          /** 
          * @see net.sf.hibernate.cfg.NamingStrategy#classToTableName(java.lang.String) 
          */ 
          public String classToTableName(String className) { 
          return tableName(StringHelper.unqualify(className).toUpperCase()); 
          } 

          /** 
          * @see net.sf.hibernate.cfg.NamingStrategy#propertyToColumnName(java.lang.String) 
          * @todo 
          */ 
          public String propertyToColumnName(String arg0) { 
          return null; 
          } 

          /** 
          * @see net.sf.hibernate.cfg.NamingStrategy#tableName(java.lang.String) 
          */ 
          public String tableName(String tableName) { 
          return "TBL_" + tableName.toUpperCase(); 
          } 

          /** 
          * @see net.sf.hibernate.cfg.NamingStrategy#columnName(java.lang.String) 
          */ 
          public String columnName(String columnName) { 
          return "COL_" + columnName; 
          } 

          /** 
          * @see net.sf.hibernate.cfg.NamingStrategy#propertyToTableName(java.lang.String, java.lang.String) 
          * @todo 
          */ 
          public String propertyToTableName(String arg0, String arg1) { 
          return null; 
          } 

          }

          posted on 2011-03-26 23:36 甜咖啡 閱讀(7226) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2011年3月>
          272812345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          我參與的團(tuán)隊(duì)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 太保市| 曲靖市| 黎平县| 武威市| 阿瓦提县| 莱西市| 乌苏市| 大庆市| 赫章县| 错那县| 凉城县| 弥勒县| 屏东市| 威宁| 新源县| 林芝县| 德昌县| 梓潼县| 福泉市| 潮安县| 武宁县| 连平县| 淮安市| 沽源县| 泸水县| 永康市| 墨竹工卡县| 慈利县| 茶陵县| 买车| 博罗县| 迁安市| 滕州市| 林周县| 任丘市| 寻乌县| 江津市| 景东| 固原市| 旅游| 晋州市|