日期:2014-05-16  浏览次数:20711 次

ibatis,sql语句中,动态在表名前增加数据库名前缀的方法
解决方案:

1.增加sqlmap.properties
定义里面内容:全局变量
dbSchema1=cl4motdta.
dbSchema2=pbsec6m.
dbSchema3=cl4devdta.


2.修改sqlmap-config.xml
<!-- 数据库 方案名 配置文件装载 -->
<properties resource="com/biz/sqlmap.properties"/>


3.运用到sqlmap
<!-- 查询  记录总数  -->
<select id="queryUserAccreditTotal"
parameterClass="com.citicpru.euis.maintain.vo.EufgpkyVO"
resultClass="java.lang.Long">
				
select  count(*) as total
from  ${dbSchema1}eufgpky,${dbSchema2}asaepf     
where userid = ae01 
</select>



需求:
关于ibatis  的sql 
--------------------------- 
谁碰到过  动态定义  数据库名的吗 

select * from   table 
要改成 
select * from  database.table 
动态定义 database 

我这边的数据太变态了  在 多个数据库里面 
关联查询。 
加上测试环境、生产环境,那是N多库了 
不想改sql哦,那累死的 


请问怎么配置?怎么改? 


--------------------
问题补充:
database 对于 oracle数据库来说,就是表空间; 
          对于  db2数据库来说,就是方案名--还是指的数据库名。 
有些时候,虽然数据跟着用户走,但是为了区分测试数据还是正式数据, 
我们都会定义相同用户但是不同的表空间;不会定义同一表空间多用户,这样dba用户查数据不方便。 

这个改动有两种思路,拿下列sqlmap来说, 
<!-- 根据 id 条件  查询实例. --> 
<select id="queryEufgpkyVObyID" 
       parameterClass="java.lang.String" 
       resultClass="com.vo.EufgpkyVO"> 

        select  a.userid, b.ae02,        
        from    ttdata.eufgpky a, ptdata.asaepf b  
        where   a.userid = b.ae01 
        and     <![CDATA[ a.userid = #id#]]> 
</select> 
现在要将 ttdata 和 ptdata 改成变量 
1. 思路一:改配置文件,看能否定义统一的变量代替 
2. 思路二:改parameterClass,改成对象,对象包含数据库名的属性。相当于vo继承一个globalDatabase类。 

思路二代价太大,要改大量的sql和调用类、配置文件 
这样的话,以后不存在 
parameterClass="java.lang.String" 
parameterClass="java.lang.Long"  类似这样的参数了 

parameterClass 全是对象了。 

1 楼 pppqqq800 2010-05-20  
加入properties  还是蛮实用的。
学习~~