<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    甜咖啡

    我的IT空間

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

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

    以下為用Map做參數(shù)的動態(tài)表名實現(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); 


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

    可不可以用POJO對象里的一個屬性來決定表名呢? 

    答案是肯定的。 

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

    我們在插入一個新對象到表中里,由自己制定的路由規(guī)則是可以得到這個對象要插到那個表里的。即程序知道插到哪個表里,那么 

    怎么讓Ibatis也知道呢? 

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

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

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

    因為,在Ibatis里,每一個#,除了替換值,它都會加上一個單引號'. 

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

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


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


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

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

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

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

          例如業(yè)務(wù)需要是每隔一個月就要換一個表。比如1月用biz_1,那么2月就用biz_2....但是這些表的結(jié)構(gòu)是相同的。我們要做的就是通過獲得月份來動態(tài)的選擇表。我們從這個方法中這樣寫: 
        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ù)月份來動態(tài)的選擇表名了。 

        3、使用命名策略。 
           要使用這個命名策略可以這樣: 
           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 甜咖啡 閱讀(7232) 評論(0)  編輯  收藏


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


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

    導(dǎo)航

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

    統(tǒng)計

    常用鏈接

    留言簿(1)

    我參與的團(tuán)隊

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲高清无码专区视频| 四虎免费大片aⅴ入口| 一本久久a久久精品亚洲| 亚洲AV成人片无码网站| 麻豆国产人免费人成免费视频| 亚洲一卡2卡4卡5卡6卡残暴在线| 足恋玩丝袜脚视频免费网站| 亚洲网站在线观看| 日韩插啊免费视频在线观看 | 日本不卡免费新一区二区三区| 国产成人精品久久亚洲| 亚美影视免费在线观看| 国产亚洲美女精品久久久2020| 一级毛片免费不卡直观看| 精品亚洲一区二区三区在线播放| 国产激情久久久久影院老熟女免费 | 精品少妇人妻AV免费久久洗澡| 亚洲砖码砖专无区2023| 成人A级毛片免费观看AV网站| 亚洲性无码一区二区三区| 午夜男人一级毛片免费| 青青久久精品国产免费看| 久久久久久A亚洲欧洲AV冫| 两个人看www免费视频| 亚洲另类激情综合偷自拍| 99无码人妻一区二区三区免费| 亚洲天堂2017无码中文| 国产18禁黄网站免费观看| 72pao国产成视频永久免费| 亚洲嫩模在线观看| 毛片A级毛片免费播放| 免费人成动漫在线播放r18| 亚洲精品无码专区久久久| 亚洲成人免费电影| 色偷偷亚洲男人天堂| 亚洲国产精品福利片在线观看| 无码国产精品一区二区免费16| 在线精品亚洲一区二区| 国产福利电影一区二区三区,亚洲国模精品一区 | 亚洲成年人啊啊aa在线观看| 久久精品免费一区二区三区|