MyBatis動態SQL之增、刪、改、查操作
阿新 • • 發佈:2018-11-06
概述
在實際的場景中,經常會遇到動態SQL的增、刪、改、查問題,這裡就必要說明何謂動態SQL,我們舉一個實際的例子,比如,在一個web工程中,經常會有一個搜尋框,並且在搜尋之前通常會進行一個關鍵詞的過濾,比如可以過濾的條件有:姓名、年齡等,這樣的話當我們姓名和年齡都不選,則等價於下面的SQL語句
select * from students; -- 不去限制姓名和年齡
當我們將年齡選擇為>20時,相當於下面的SQL語句:
select * from students where age>20;
當我們同時選擇條件姓名為:張三,年齡>20,則相當於下面的SQL語句:
select * from students where age > 20 and name = '張三';
當我們有很多的條件時,此時就需要我們去組合這些條件,並動態的生成一個可執行的SQL語句,這樣就不是一個簡單的SQL語句能夠解決問題,那麼我們該怎麼辦呢?在MyBatis中同樣是支援這種動態SQL的寫法,具體見下面的內容。
MyBatis動態SQL支援
動態SQL之查詢
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="studentNameSpace"> <!-- resultMap標籤將了工程entity實體類中的物件與資料庫中的表對應起來 resultMap中的id屬性是一個唯一的名字 子標籤中的id屬性用來指定主鍵 result標籤用來指定其他的鍵,其中property屬性是指實體中的欄位,對應的 column屬性表示的資料庫中的響應的欄位 --> <resultMap type="com.jpzhutech.entity.Student" id="studentMap"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sal" column="sal"/> </resultMap> <!-- 動態查詢SQL語句 --> <select id="findAll" parameterType="map" resultMap="studentMap"> select id , name , sal from students <where> <if test="pid!=null" > and id = #{pid} <!-- #{}和之前使用c3p0的時候寫的?含義是相同的 --> </if> <if test="pname!=null" > and name = #{pname} </if> <if test="psal!=null" > and sal = #{psal} </if> </where> </select> </mapper>
動態SQL之插入
<!-- 動態insert --> <!-- 定義兩個sql片段,第一個對應欄位名,id屬性值任意並且唯一 --> <sql id="key"> <trim suffixOverrides=","> <if test="id!=null"> id, </if> <if test="name!=null"> name, </if> <if test="sal!=null"> sal, </if> </trim> </sql> <!-- 定義第二個sql片段,第二個對應?,key屬性值任意並且唯一 --> <sql id="value"> <trim suffixOverrides=","> <if test="id!=null"> #{id}, </if> <if test="name!=null"> #{name}, </if> <if test="sal!=null"> #{sal}, </if> </trim> </sql> <!-- <include refid="key"/>和<include refid="value"/>表示引用上面sql片段 --> <insert id="insertStudent" parameterType="com.jpzhutech.entity.Student"> insert into students(<include refid="key"/>) values(<include refid="value"/>); </insert>
動態SQL之刪除
<!-- 動態刪除操作 delete from students where id in(?,?,?);-->
<delete id="deleteStudent">
delete from students where id in
<!-- foreach用於迭代陣列元素
open表示開始符號
close表示結束符號
seprator表示元素間的分割符
items表示迭代的陣列
-->
<foreach collection="array" open="(" close=")" separator="," item="ids">
#{ids}
</foreach>
</delete>
動態SQL之更新
<!-- 動態更新SQL語句,update table_name set name=? , sal=? where id=?,
其中id不能更新,因為id為主鍵,這個動態更新該怎麼寫呢?
set標籤會自動判斷後面是否加,
-->
<update id="updateStudent" parameterType="map" >
update students
<set>
<if test="pname!=null">
name = #{pname},
</if>
<if test="psal!=null">
sal = #{psal},
</if>
</set>
where id = #{pid}
</update>