业务需求背景
为另一个系统提供接口查询数据,当数据为空时,该字段就直接不显示了,不符合对方的参数要求,现需要将所有字段进行展示。
解决方法一
对具体字段进行判断,为空则给默认值显示
(CASE WHEN a.end_time is null then '' ELSE a.end_time END) as "endDate"
也可以使用ifnull函数进行判断
IFNULL(a.end_time,'') as "endDate"
解决方法二
- 修改Mybatis配置文件,在mybatis-config.xml文件中启用callSettersOnNulls组件
<setting name="callSettersOnNulls" value="true"/>
- 如果是使用的springMVC+Mybatis的架构的话,需要在spring-mybatis.xml文件中添加指定的Mybatis的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL MAP Config 3.1//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="callSettersOnNulls" value="true"/>
</settings>
</configuration>
spring-mybatis.xml
<!-- spring和MyBatis完美整合,添加mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-configuration.xml"/>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:mapping/*.xml"></property>
</bean>
解决方法三
查询结果类型,使用实体类接收,而不是map接收;(我没有使用这种方法,因为我的需求返回值类型为List<Map<String,Object>>,这样的返回类型无需二次处理,直接返回给调用者就行了。
总结对比
如果需要在值为空时,自定义显示值,显然是使用第一种方式比较好,但是缺点就是需要对每个修改的字段都做这样的判断;相比于方式一,方式二就更具有全局性,但是方式二不支持自定义的显示值,只会给为空的字段赋值为null;方式三的接收类型为实体类,方便于对象查询,而且字段为空时,可以进行自定义,需要在resultMap中,指定typeHandler即可。