mybatis踩坑
问题的产生
我使用的mybatis版本为1.3.1,比较老了。
有个接口需要判断表中某条数据的某个字段是否为空或null,原本采用的是IFNULL方法判断:
select IFNULL((select A from user where B=#{B} limit 1),0)
当字段A为空时返回0,字段不为空返回查询结果。根据网上博客,select返回值如果设置为boolean,会根据查询到的记录数,0返回false,否则返回true。于是我认为上述sql语句满足该条件,即查询结果为空返回0,mybatis转换false,否则为true,xml代码:
<select id="test" parameterType="string" resultType="boolean">
select IFNULL((select A from user where B=#{B} limit 1),0)
</select>
其中字段A为String类型。但是问题就处在这里,String转Boolean出现了问题。如果按照其他博客所说根据查询结果个数判断返回值,那么这里应该不会出现问题,可是出现了问题。
问题的解决
由于只是初学mybatis,并不是很明白返回值的转换原理。这些讲返回Boolean的博客也是互相抄袭,sql语句都一模一样,不过我发现他们sql中是利用count来判断数据是否存在的。我只能理解成,他们所说的“mybatis根据select的记录数转换boolean”这句话中的记录数,就是sql中count得到的数据,这么一来才解释的通。
于是我也将sql语句改成了count
select count(A) from user where B=#{B} limit 1
但是count耗费性能,由于没想到更好的解决方案只能凑合用了(这里也可以更改service层的代码,但工作量相对大不少)。