自從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;
}
}
聯(lián)系客服