1. 程式人生 > >oracle動態update語句

oracle動態update語句

1、今天公司專案提交更新表單出錯,這個bug交給了我。

2、OK,debugger一下,發現提交的時候後臺打印出錯,提示大概就是這樣  SQLException '17004'  其實很簡單,這種錯誤一般都是說某一列傳進來的值為null,因此報錯,所以追蹤下去,發現是update語句沒有做動態傳值處理,也就是說需要寫成動態sql語句

3、那麼Mybatis的動態sql語句是怎麼樣的呢?

update TableName
<trim prefix="set" suffixOverrides=",">
<if test=" XX!=null and XX!='' ">
XX = #{xx,jdbcType='varchar'},
</if>
<if test=" XX!=null and XX!='' ">
XX = #{xx,jdbcType='varchar'},
</if>
<if test=" XX!=null and XX!='' ">
XX = #{xx,jdbcType='varchar'},
</if>
<trim>
4、解釋一下<trim>

官方文件大概意思:<trim>節點標籤:trim主要功能是可以在Trim包含的內容前加上某些字首(prefix),也可以在Trim包含的內容之後加上某些字尾(suffix)還可以把Trim包含內容的首部的某些內容忽略掉(prefixOverrides) ,也可以把Trim包含的內容的尾部的某些內容忽略掉(suffixOverrides)

<trim prefix="set" suffixOverrides=",">

所以這行程式碼的意思是:在前面加上set,去掉最後的逗號。

5、既然都說到update動態sql了那麼順便回顧一下其他動態sql的寫法。

6、查詢

SELECT    XX,  XX  
     FROM TableName 
     WHERE  
    <if test="XX !=null and XX!='' ">  
     XX LIKE CONCAT(CONCAT('%', #{XX, 
     jdbcType=varchar}),'%')  --模糊查詢
    </if>  
    <if test="XX != null and XX != '' ">  
        AND XX = #{XX, jdbcType=INTEGER}  
    </if>   
</if>   

7、增加

insert into TableName
(
<trim suffixOverrides=",">
        <if test="xx!=null and xx!=''">
            xx,
        </if>
        <if test="xx!=null and xx!=''">
            xx,
        </if>
      </trim>
)
values
(
<trim suffixOverrides=",">
        <if test="xx!=null and xx!=''">
            #{xx},
        </if>
        <if xx="name!=null and xx!=''">
            #{xx},
        </if>
      </trim>
)

8、刪除

delete from TableName where xx in
 <!-- foreach用於迭代陣列元素 
             open表示開始符號
             close表示結束符號
             seprator表示元素間的分割符
             items表示迭代的陣列
        -->
        <foreach collection="array" 
               open="(" close=")" 
            separator="," item="xx">
            #{xx}
        </foreach>
9、有問題歡迎指出,謝謝