ibaits 的动态sql语句 ,动态的表,动态的表结构,动态的拼凑 union

来源:互联网 发布:帧数测试软件fraps 编辑:程序博客网 时间:2024/06/05 08:40
近来业务需要很灵活的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了. 这里没有考虑分页.如果需要可能还要改动.

好了.就这么多.有问题大家交流. luyuwww@126.com