1. 程式人生 > >Mybatis語法錯誤的一個坑

Mybatis語法錯誤的一個坑

前言

        為什麼說是一個坑呢?是因為這個錯誤實在是比較難出現,只有在特定的場合才會出現,是關於Mybatis語法錯誤的一個問題,說到底,其實就是一個小逗號的事情。

問題描述

        先來看一段sql:

<update id="updateByPrimaryKeySelective" parameterType="com.weimob.mengdian.promotion.dao.model.PromotionInfo">
        update promotion_info set
        <if test="title != null"
>
title = #{title,jdbcType=VARCHAR}, </if> <if test="startTime != null"> start_time = #{startTime,jdbcType=TIMESTAMP}, </if> <if test="endTime != null"> end_time = #{endTime,jdbcType=TIMESTAMP}, </if
>
<if test="promotionType != null"> promotion_type = #{promotionType,jdbcType=INTEGER}, </if> <if test="status != null"> status = #{status,jdbcType=INTEGER}, </if> <if test="isAllGoods != null"> is_all_goods = #{isAllGoods,jdbcType=BIT}, </if
>
<if test="version != null"> version = #{version,jdbcType=VARCHAR}, </if> <if test="isDeleted != null"> is_deleted = #{isDeleted,jdbcType=BIT}, </if> <if test="createUserId != null"> create_user_id = #{createUserId,jdbcType=BIGINT}, </if> <if test="bannerImage != null"> banner_image = #{bannerImage,jdbcType=VARCHAR}, </if> <if test="merchantId != null"> merchant_id = #{merchantId,jdbcType=BIGINT} </if> where id = #{id} /*promotionInfo.updateByPrimaryKeySelective*/ </update>

        這一段sql乍一看是沒有什麼問題啊,但是,當一種特殊的情況就是當傳入的最後一個欄位為空的時候,就會出現一個問題,那就是前一個欄位的逗號就會多出來。這時候自然而然就報出語法錯誤了。

解決方案

        解決的方案呢實際上也是非常簡單,那就是保證最後一個欄位一定不為空。

總結

        看來使用動態sql一定也要注意某些特殊的情況,否則害死自己了!還有排查錯誤必須要各種的推敲,我只能對Mybatis說一句,受教了!