<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script> 近来业务需要很灵活的sql语句.但是又不想拼凑sql语句.就不得不用ibatis.
这里只拿 动态的拼凑 union来具例子.有错误请大家指正
背景: 系统有一些相同表结构的表,命名有规则.比如 table_1,table_2....table_n为了方便多表查询.支持多关键字查询
现将ibaits的配置文件如下:
<select id="baseQueryTable" parameterClass="java.util.Map" resultMap="tableMap">
<dynamic>
<iterate property="code" conjunction="UNION ALL">
SELECT ID,NAME,AGE,SEX,MESSAGE FROM TABLE_$code[]$ WHERE
<iterate property="keys" conjunction="$operator$">
MESSAGE LIKE '%$keys[]$%'
</iterate>
</iterate>
</dynamic>
ORDER BY ID
</select>
执行语句如下:
SELECTID,NAME,AGE,SEX,MESSAGE FROM TABLE_0 WHERE MESSAGE LIKE '%1%' AND MESSAGE LIKE '%2%' AND MESSAGE
LIKE '%ibatis%' UNION ALL
SELECT ID,NAME,AGE,SEX,MESSAGE FROM TABLE_3 WHERE MESSAGE LIKE '%1%' AND MESSAGE LIKE '%2%' AND MESSAGE LIKE '%ibatis%' UNION ALL
SELECT ID,NAME,AGE,SEX,MESSAGE FROM TABLE_8 WHERE MESSAGE LIKE '%1%' AND MESSAGE LIKE '%2%' AND MESSAGE
LIKE '%ibatis%' ORDER BY ID
大家可以看到以上是三个表union连接的
下面将以上配置文件说明一下
1. id="baseQueryTable" 就不说了
2. resultMap="tableMap" 是自己表的映射bean 由于多表结构相同.所以共用一个bean就可以了
3. parameterClass="java.util.Map" 由于参数布置一个所以采用了Map来做parameterClass
传如的map如下:
key : value
code : new Long{0L , 3L ,8L}
keys : new String{"1","2","ibatis"}
operator : and (或者 or)
4. <dynamic>
<iterate property="code" conjunction="UNION ALL">
SELECT ID,NAME,AGE,SEX,MESSAGE FROM TABLE_$code[]$ WHERE
由于需要三个表连接这里把select 写入了<dynamic>
<iterate property="code" conjunction="UNION ALL">
这里面 code就是上面的code的值 new Long{0L , 3L ,8L}.当然也可以用List来代替
由于表内无重复数据所以使用了UNION ALL(传说可以提高效率)
TABLE_$code[]$ 由于表名的结构是 Table_[动态的数字] 所以会把 new Long{0L , 3L ,8L}的值
依次赋给TABLE_所以就有了 TABLE_0, TABLE_3 ,TABLE_8,要注意的是$ $符号不要替换成## 还有codle[]
的[]是必须的.否则ibatis可能会将你的惨说当成String去处理.
iterate 是ibatis提供的迭代器.具体使用去查书吧
5. <iterate property="keys" conjunction="$operator$">
CONTEXT LIKE '%$keys[]$%'
</iterate>
内部的ierate 是为了动态拼凑where子句 大体结构同4.
注意 conjunction="$operator$" operator是页面传入的 and 或者or
如题上面的几个动态都有了.还有一个动态的表结构.如果你把resultMap="tableMap"换成java.util.Map
这样基本就可以达到动态的效果 map里面key的值是列名 value就是每一值,如果返回的是List则List里面的每一个元素都是Map
剩下的事情就是解析map了. 这里没有考虑分页.如果需要可能还要改动.
好了.就这么多.有问题大家交流.
[email protected]