在日常開發中,查詢數據返回類型為map,數據庫中有些自動值為null,則返回的結果中沒有值為空的字段,則如何顯示值為空的字段呢?
1.xml文件:
- <resultMap id="userLoginInfo" type="map" >
- <result column="uuid" property="id" />
- <result column="uuid2" property="uuid" />
- <result column="account" property="phone" />
- <result column="login_time" property="loginTime" />
- <result column="token" property="token" />
- <result column="data_progress" property="dataProgress" />
- <result column="account_locked" property="accountLocked" />
- <result column="is_delete" property="isDelete" />
- <result column="nickname" property="nickname" />
- <result column="user_head" property="userHead" />
- </resultMap>
返回結果:
- {accountLocked=false, loginTime=1480559610977, phone=18301413850, isDelete=false, dataProgress=0, nickname=,
- id=93cd68fcb95043febd28d6ad86666029, uuid=544dc45953e2dcc60e23ecccc52c578b, token=WT1Kgx}
發現返回結果Map中沒有user_head字段,原來 user_head在數據庫中值為null,所以說數據庫中所有值為null的字段在查詢接收resultMap時都不存在
經過各種查資料,總結以下解決方案:
解決方法一:
1、在Mybatis_config.xml文件中添加配置信息:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <!--解決,查詢返回結果含null沒有對應字段值問題-->
- <setting name="callSettersOnNulls" value="true"/>
- </settings>
- </configuration>
備注:注意xml文件的頭部引入的是mybaties-3-config.dtd
測試結果:
- {accountLocked=false, loginTime=1480559610977, userHead=null, phone=18301413850, isDelete=false, dataProgress=0, nickname=,
- id=93cd68fcb95043febd28d6ad86666029, uuid=544dc45953e2dcc60e23ecccc52c578b, token=WT1Kgx}
經測試,值為null的結果在map中存在
方法二:通過sql語句實現空值填充:
1、postgresql數據庫:
select COALESCE(D.wk_ptn_cd, '00') as wk_ptn_cd
判斷字段wk_ptn_cd是否為空,空給默認值‘00’,否則取該字段
2、非postgresql數據庫:Mybatis使用IFNULL(P1,P2)函數
1.問題:
Mybatis中IFNULL(p1,p2)函數怎么用?
首先看沒有IFNULL的查詢:
2.1源代碼:
-
select md.valueofdouble, md.periodcode
-
from meas_data md
-
WHERE objectcode="YQ"
-
AND datatime="2017-5-25 00:00:00"
-
AND measurementcode="PI_DRFDL"
2.2.截圖:
3.1源代碼:
-
select md.valueofdouble, IFNULL(md.periodcode,0)
-
from meas_data md
-
WHERE objectcode="YQ"
-
AND datatime="2017-5-25 00:00:00"
-
AND measurementcode="PI_DRFDL"
3.2截圖:
4.總結:
1、IFNULL(P1,P2)如果如果P1不為空,則返回值為P1;P1為NULL,則返回為P2;P2有點類似替補球員;
2、注意,IFNULL只是針對局部字段的替換;如果整個結果查出來都是空,則不能使用IFNULL(P1,P2)
4.1源碼:
-
select md.valueofdouble, md.periodcode
-
from meas_data md
-
WHERE objectcode="YQ"
-
AND datatime="2017-5-25 00:00:01"
-
AND measurementcode="PI_DRFDL"
4.2截圖:
4.3源碼:
-
select md.valueofdouble, IFNULL(md.periodcode,0)
-
from meas_data md
-
WHERE objectcode="YQ"
-
AND datatime="2017-5-25 00:00:01"
-
AND measurementcode="PI_DRFDL"
4.4截圖: