mybatis之HashMap返回为null时,key不保存导致得到[null]

写这么多只是为了记录自己此次解决问题的过程和个中原理,可能会比较啰嗦,若不想看,拉到文章最下面直接看解决方案。

在进行ibatis升级至mybatis中,遇到一个问题

List<Map> list = this.getSqlMap().queryForList("mer.queryForTrans",sendmap);  

list的返回结果为[null],size=1。这个肯定是有问题的,我在数据库中执行了这条SQL,确实是没有记录。但返回结果应该是list=[],size=0 。这个问题困扰了我几天,期间也在网上查了很多资料,很多人说因为mybatis中HashMap得到null时,是不保存key的。我觉得这好像说的很有道理啊,然后就按照网上说的添加了<setting name="callSettersOnNulls" value="true" /> 。这个是在查询某列返回结果为null时,仍然保存该key,而key的值为null。可为什么这在别人那好使我这就不起作用,但是网上基本上能找到的都是这个办法。只能靠我自己了,今天上班接着跟这个问题杠上,我非得解决出。从这条语句一路debug进去,花了近半个小时查看mybatis对该SQL语句的执行情况,重点看mybatis的jar包是怎么对数据库返回的空记录保存并赋值的,发现了问题所在。

mybatis之HashMap返回为null时,key不保存导致得到[null]

问题就在这个rowValue原本是我们期待的结果{a=null,b=null,c=null},foundValues=false,但在执行了401行语句后rowValue变成null值,所以是这个configuration.isReturnInstanceForEmptyRow() 返回了false,导致rowValue变成了null,也就有了所谓的令人费解的[null]。进入这个configuration类,看到这是一个boolean类型的变量,看到这个变量名字我便认定一定和这个变量有关!

mybatis之HashMap返回为null时,key不保存导致得到[null]

在网上查了之后是这么说的 

returnInstanceForEmptyRow:MyBatis, by default, returns null when all the columns of a returned row are NULL. When this setting is enabled, MyBatis returns an empty instance instead. Note that it is also applied to nested results (i.e. collectioin and association). Since: 3.4.2。原来mybatis中默认当返回的记录每一列全都为null值时,便默认返回一个null的实例。所以我在项目的mybatis配置文件中又添加了<setting name="returnInstanceForEmptyRow" value="true" />。最终问题顺利解决。

在mybatis的配置文件中以下两个setting一定要搭配使用。mybatis版本要在3.4.2以上。

mybatis之HashMap返回为null时,key不保存导致得到[null]