Mybatis整型if判斷不生效,你也踩坑了嗎?

大家好,我是道哥,專注於後端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>

這樣就好了,你可以試試判斷是否生效了。

能夠看到這裏的都是真愛啊,覺得有用的話,就點個贊。評論和轉發是對道哥最大的鼓勵。
程序員的小夥伴們,學習之路,同行的人越多才可以走的更遠,加入公衆號[程序員之道],一起交流溝通,走出我們的程序員之道!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章