哈哈,已经好久没有在早上更新技术博客了,今早打算更新一篇技术博客!
Mybatis相信对于做Java开发的同学来说已经非常熟悉,,但大家在使用过程中是否有碰到Error updating database. Cause: java.sql.SQLException: SQL String cannot be empty 这样的报错,在上周项目开发过程中我还真遇到了这个问题。不管三七二十一,先上图:
从图上的报错信息我们可以大概出推断出可能是在某个标签内漏了某段sql,或者也有可能是if标签中的条件不生效,从而导致了sql语句没能动态生成。与其在这里瞎猜,还不如找到特定的代码去寻找原因。下面先贴出两个截图,大家可以慢慢细品下:
当时自己从表面上看似乎没发现任何问题,但经过调试和不断研究后才发现原来在批量更新sql语句时memberCardThirdpartyList这个列表是为empty的,也就是一个空列表,所以导致了Mybatis无法生成动态sql语句。那么该如何解决呢?很简单!有如下两种方法:
- 第一种方法:可以在代码层面对memberCardThirdpartyList这个列表进行判空处理。比如可以使用CollectionUtils的isEmpty方法。如下图所示:
- 第二种方法:可以在Mybatis层面使用if标签对列表进行判空处理,如下图所示:
这是自己在使用Mybatis进行持久层开发时遇到的一个坑,希望对大家有帮助。当时在群上跟同事讨论时,有个同事说得特别好,现在就引用那个同事的话来结束此篇博客:
mybatis其实是智能的,只是你的sql里用了item.xxx,item为空,空里面取属性,就报错了。如果是单条数据那种,不出现 对象.属性 这种取值,mybatis就不会执行。
mybatis 这个功能确实是需要做下增强,判断下传的list是否为空。
这类问题一般就两种方法:1.代码层面先判空 ;2.sql那里先判空,即<if test=“list != null and list.size() > 0”>