如果直接跑sql是能走索引很快,在mybatis中不能,可能就是jdbcType的原因。
比如,我有一个属性A,在表里面是VARCHAR2类型,但是在mybatis中的sql是#{a},缺少jdbcType=JdbcType.VARCHAR,就会导致mybatis默认给NVARCHAR类型,调用PS对象会使用setNString,最后导致隐式转换问题不走索引。
把jdbcType加上就行了
如果是mybatis plus的话,在TableField注解上加了jdbcType还要在TableName注解中设置autoResultMap自动生成,不然这个jdbcType不会生效。
具体可以debug看一下
如果用JdbcTemplate发现很快,那是因为JdbcTemplate如果没有指定jdbcType,他在设置值的时候会判断一下是不是oracle数据库的,如果是oracle数据库的,他就会调用PS对象的setString方法,这个就不会导致隐式转换问题,所以感觉速度是正常的