mybatis执行带时间查询条件的查询语句时执行速度非常慢问题解决方案总结

今天在用mybatis执行带时间查询条件的查询语句时发现执行速度非常慢,但在plsql上速度很快,翻找资料后得出正解,在此备注下

产生原因: oralce数据库类型自动隐式转换导致没走索引:

在mybatis中如果使用的是#,拼接后参数带引号

where t.up_time >= #{begintime }
andt.up_time < #{endTime}

where t.up_time >= #{begintime ,jdbcType =timestamp }
and t.up_time< #{endTime,jdbcType =timestamp }
大数据量查询执行时会自动隐式转换,变为 to_timestamp(t.up_time) >= #{begintime ,jdbcType =timestamp }

此时 查询不会走数据库上的enter_time字段的索引,所以查询效率非常慢;
注:mapper.xml中大于号(>),小于号(<)需要转义
解决方法:

1.将传入参数改为String 在mybatis 使用 to_date 进行拼接:

t.up_time< to_date(#{endTime}, ‘yyyy-MM-dd hh24:mi:ss’)

and t.up_time>=to_date(#{begintime }, ‘yyyy-MM-dd hh24:mi:ss’)

2.将#改为$ , 详细可看#与$区别,这个改法主要使用 ’

where t.up_time>= ‘${begintime}’

  1. 在#{}后+0:这样不会让oracle 进行隐式转换,走索引查询
t.up_time<#{endtime}+0 and t.up_time>=#{begintime}+0

版权声明:本文为sundongshengdragon原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。