大家好,我是道哥,專注於後端java開發,喜歡寫作和分享。如果覺得文章對你有用,那就點個讚唄!如果能轉發那是對道哥最大的支持!
詭異的問題
最近在開發過程中遇到了一個奇怪的問題,線上有個數據庫表,爲了描述方便,這裏做了簡化:
CREATE TABLE `goods_info` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`gmt_create` datetime NOT NULL COMMENT '創建時間',
`gmt_modified` datetime NOT NULL COMMENT '修改時間',
`name` varchar(50) DEFAULT NULL COMMENT '貨物名稱',
`status` int(11) NOT NULL COMMENT '貨物狀態,0-未出售,1-已出售',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 COMMENT='貨物信息表'
;
前端查詢貨物列表時,可以根據status=0(未出售),status=1(已出售),及name去做聯合查詢。
mybatis的查詢語句是這麼寫的:
<select id="getGoodsInfoList" resultMap="GoodsInfo"
parameterType="java.util.Map">
SELECT
<include refid="columns"/>
FROM goods_info where 1=1
<if test="id != null ">
and id = #{id}
</if>
<if test="name !=null and name != ''">
and (name like CONCAT('%',#{name}, '%'))
</if>
<if test="status !=null and status != ''">
and status = #{status}
</if>
</select>
邏輯也很簡單,使用if test判斷,如果前端傳的參數有對應的test字段,則將其加入到判斷條件中,但是運行結果差強人意。
查詢結果並未如所料
前端傳入status=1,查詢的結果與預期一致,status=1的行記錄被查詢出來。當status=0時,status像未生效一樣,查詢出的行記錄包含status=1和status=0的記錄,這真是見了鬼了,我明明賦值寫了查詢條件爲status=0了啊。
查了不少資料和博客內容,基本上都描述的很含糊。
其實這是mybatis的一個bug,當判斷條件status爲整型時,如果status=0時,if test裏會判斷status=’ ',所以在這裏需要將
<if test="status !=null and status != ''">
and status = #{status}
</if>
修改爲
<if test="status !=null">
and status = #{status}
</if>
這樣就好了,你可以試試判斷是否生效了。
能夠看到這裏的都是真愛啊,覺得有用的話,就點個贊。評論和轉發是對道哥最大的鼓勵。
程序員的小夥伴們,學習之路,同行的人越多才可以走的更遠,加入公衆號[程序員之道],一起交流溝通,走出我們的程序員之道!