#1 mybatis实战系列--动态查询表数据

我们知道,在一般情况下,在查询数据时,是确定了表格名字的,这样一来,每一张表格基本都会对应一个实体类,但也有例外的情况,在某些特殊需求中,要求能够展示多张表的数据信息,这时我们是无法确定哪些表的,也能不可能建立多个实体类的,因此我们需要考虑动态查询表数据的方案。
一、映射xml文件的编写

<select id="queryDataMap" resultType="java.util.Map" statementType="STATEMENT">
    select ${tableAllColumn} from ${tableAndView}
     order by (select column_name
                      from (select a.*, rownum as rn
                              from user_tab_columns a
                             where a.TABLE_NAME = '''||${tableAndView}||'''
                             order by a.COLUMN_NAME)
                     where rn = 1)
</select>

说明:首先需要设置resultType=”java.util.Map”,并设置statementType=”STATEMENT”,最后使用List<Map<K,V>>进行接收,这里再说一下mybatis中一个属性:statementType。这个属性的作用是告诉mybatis我们写的这个sql到底是预编译(PRESTATEMENT)还是非预编译(STATEMENT)的。有什么区别呢?如果是预编译的,那么系统在初始化时就会读取这段sql代码,将指定的实体类中的字段替换了类似#{}这样的语句,就是形成了类似这样的语句:”select * from tableName where code=?” 这个时候你在系统运行时再想向这句sql中替换tableName或者code,结果可想而知。如果是非预编译呢,结果刚好相反,他会在系统运行时才会去生成这样类似的语句。此时就可以去替换这些动态的字段或者表名之类。对于非预编译一定要记得使用${}这个符号来接收参数。

二、Java接口的编写

/**
     * @function name queryDataMap
     * @Description 动态查询所选下拉表格或视图的信息
     * @param tableAndView
     * @Date 2018年7月20日
     * @author yzh
     * @return
    */
    public List<Map<Object,Object>> queryDataMap(@Param("tableAllColumn") String tableAllColumn, @Param("tableAndView") String tableAndView);

三、注意事项
需要注意的是,mybatis返回Map类型时,由List<Map<Object,Object>>进行接收后,凡是没有数据的字段所在的记录,都会被擦除该记录的该字段,用什么办法解决呢?实际上,我们可以使用oracle函数动态获取到当前动态表的所有字段,并对当前空值字段进行处理,该函数如下所示。

create or replace function getTableAllColumns(tableName varchar2) return varchar2 is
/**function name:getTableAllColumns
   author:yzh
   date:2018-08-09
   description:动态获取表字段,解决当字段值为空时该字段不存储在List<Map<String,Object>>中的问题
********/
v_columns varchar2(4000) :='';
v_columnType varchar2(40):='';
begin
  for x in(
    select u.COLUMN_NAME,u.DATA_TYPE from user_tab_columns u where u.TABLE_NAME = tableName
  )loop
    v_columnType :=x.data_type;
    --判断字段类型是否是DATE类型
    if(v_columnType = 'DATE') then
      v_columns :=v_columns|| 'nvl2('||x.column_name||','||x.column_name||',to_date(''9999-12-31'',''yyyy-mm-dd''))'||' as '|| x.column_name||' ,';
    else
      v_columns :=v_columns|| 'nvl2('||x.column_name||','||x.column_name||',-9999999988)'||' as '|| x.column_name||' ,';
    end if;
  end loop;
  /**去除末尾逗号*/
  return substr(v_columns,0,instr(v_columns,',',-1)-1);
end;
/
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值