mybatis-使用example查询时,参数被替换成冒号+index

使用example查询时,参数被替换成冒号+index

  • 1.问题现象
  • 2.问题解决

1.问题现象

使用example查询时,传入查询参数,调用接口,在控制台打印出SQL语句和参数都没问题,但是查询不到数据。
此时数据库里有数据,且将控制台的SQL和参数放到数据库中可以查询到数据。
代码:

//按类型和顺序查询数据
StandardDataExample stex1=new StandardDataExample();
StandardDataExample.Criteria criteria = stex1.createCriteria();
criteria.andDataTypeEqualTo("0103").andDataSequenceEqualTo("2");
List<StandardData> stageData = standardDataMapper.selectByExample(stex1);

mybatis生成的SQL:

==>  Preparing: select DATA_ID, DATA_TYPE, DATA_NAME, DATA_CODE, DATA_REQUIRED, DATA_SEQUENCE, DATA_DESC from T_TENDER_STANDARD_DATA WHERE ( DATA_TYPE = ? and DATA_SEQUENCE = ? ) 
==> Parameters: 0103(String), 2(String)
<==      Total: 0

可见是没有查到数据的,但是SQL和参数都没问题
将生成的SQL和参数拿到数据库查询是可以查到数据的
mybatis-使用example查询时,参数被替换成冒号+index_第1张图片

2.问题解决

在代码中使用自己写的SQL是没问题的,可以查询出数据
于是去数据库看记录,看mybatis提交给数据库的SQL究竟是啥
oracle查看SQL执行记录的SQL:

select t.sql_text,t.first_load_time 
from v$sqlarea t
where t.first_load_time like '2020-06-19%' 
and SQL_TEXT like '%你的表名%'  
order by t.first_load_time desc

结果发现mybatis最后提交给oracle的命令竟然是这样的:

select  DATA_ID, DATA_TYPE, DATA_NAME, DATA_CODE, DATA_REQUIRED, DATA_SEQUENCE, DATA_DESC      
from T_TENDER_STANDARD_DATA  
WHERE (  DATA_TYPE = :1   and DATA_SEQUENCE = :2  )

参数竟然变成了 :1 和 :2 !!!
宝贝,终于发现了问题所在是吗!?是mybatis框架的问题?
但是应该如何解决呢?
难道要抛弃example查询的方式,只用自己手写的SQL?
我觉得不甘心,于是去追踪mybatis的源码的执行过程,看他交给JDBC的参数是怎么出错的,
天真的我当然一无所获。。。
然后我开始反思自己的问题,这个bug这么明显,不应该是框架的问题,而且别的地方也没有出错啊
再仔细检查了一遍代码,也去网上查询了一下
网上关于mybatis查询结果为空的解决方案一般有:
1.数据库是否连错?
2.数据库编码是否设置正确
3.是否数据库字段中有特殊字符

在检查过程中我发现数据库中存储顺序的字段设置的是char(2),而有些值的大小为一个字符,此时oracle就会在后面补空格!!!
比如存进去的是 1,但是oracle中的实际值为1(空格)
我马上修改了字段的类型为varchar(2),并把数据库中的该字段的空格去掉
去掉空格SQL:

UPDATE 表名 
SET 字段名 = REPLACE ( 字段名, ' ', '' );
COMMIT;

然后再次调用接口,发现数据正常返回!!!
问题解决了,那么问题根源究竟是什么呢?
我又做了几次试验:
例1:在数据库是char(2),数据库字段后有空格时,example查询参数的后面加一个空格
结果:正常返回数据
例2:在数据库是varchar(2),数据库字段后有空格时,example查询参数的后面加一个空格
结果:正常返回数据
例3:在数据库是varchar(2),数据库字段后有空格时,example查询参数的后面不加空格
结果:无数据
例4:在数据库是varchar(2),数据库字段后有空格时,直接在数据库中执行SQL,参数的后面不加空格
结果:查出数据
因此判断当数据库中字段后面含有空格时,使用example查询时会出现,mybatis向jdbc提交的SQL中参数会出现被 :+参数index 替换的现象

I’m too smart

你可能感兴趣的:(mybatis)