mybatis 返回null之迷(java web)

1.问题描述

先贴一下我mapping的代码



mybatis 返回null之迷(java web)

 在写项目的时候遇到了一个问题,就是要求我返回给前端的String类型数据不能有空值,即该值为null的时候我要返回“”空字符串过去。但那些数据在MySQL数据库里面的时候就是一个null,那我提取出来的时候必须对那些null值的数据做一些处理,于是我灵机一动。


mybatis 返回null之迷(java web)

根据mybatis的源代码,在返回的时候mybatis会利用反射机制获取该javabena的set方法来进行对属性的赋值,那么我就修改set方法使返回null的时候变为“”。就在我为自己这个机智的想啊沾沾自喜的时候,骨感的现实狠狠的打击了我。

mybatis 返回null之迷(java web)


返回值如图,根本没用啊!!!!!!!难道我的set方法是假的吗?不存在的!!

于是我在javaben加了一个静态变量 a 

mybatis 返回null之迷(java web)


set方法加

mybatis 返回null之迷(java web)


于是测试结果是:


没毛病啊 输出了10个 set方法也调用了10遍 这到底是什么问题啊!!!!要崩溃了


2.问题分析

对于这个set问题,我深思了一下我 printf方法是加在没null字段的set方法中的,那么我在加在

mybatis 返回null之迷(java web)


看看这个setNickname方法被调用了多少次,由之前的返回结果看出来 nickname是有6个是null的,

mybatis 返回null之迷(java web)



很明显这个set方法只被调用了4次,因为到mybatis返回null的时候是不会调用set的方法的。因为在restultmap源码中,默认返回的不是一个实体类是一个map,存在null的时,map中就少了这个值就缺少了值的映射调用,所以就没有调用那个set方法,所有null还是null的!!!

mybatis 返回null之迷(java web)



3.解决方案

 1.做到这里我就有一个解决方案了!既然他不调用我的set方法,那好你强仍你强,我就初始化的时候把string的值设置一下


mybatis 返回null之迷(java web)


就这样初始化一下,我看看测试结果

mybatis 返回null之迷(java web)


很好所有null都不见了!!

2.如果我是铁头娃,我头很铁,我就要mybatis返回的时候调用一下我的set方法,

那当然是有办法的啦,创建 configuration.xml (这是spring-mybatis结合配置的方法,如果你mybatis配置文件分开可以直接在里面加入

<setting>中的语句

内容如下:


mybatis 返回null之迷(java web)

在spring-mybatis中加这样语句


mybatis 返回null之迷(java web)

在这样的配置中,你就可以让null也映射到map里面就可以调用set方法了(value是你刚刚创建文件的路径)

测试一下结果:

mybatis 返回null之迷(java web)

set方法被调用了10次,null也不见了没毛病!!


3.当然还有一种方法,通过修改mybatis的源码,来对这个null值弄一个默认值。比如返回null的时候把null改成""这样就可以set进去了

传送门:http://www.mamicode.com/info-detail-1647006.html

具体怎么操作,太高大上了我没试过....感兴趣可以去试试


总结:

 一个初学者的小小经验,不及格的初学者...........