Mybatis05_動態的SQL語句
阿新 • • 發佈:2022-03-09
1、動態SQL值<if>標籤
根據業務的實際需求不同,有時需要不同的SQL語句。比如設定過濾條件,根據名字、id過濾。
如果id不為空就根據id過濾,如果名字不為空就根據名字過濾,如果兩者都不為空則都作為過濾條件。這種情況就需要我們通過if判斷
<select id="findByUser" resultType="user" parameterType="user"> select * from user where 1=1 <if test="username!=null and username != '' "> and username like #{username}</if> <if test="address != null"> and address like #{address} </if> </select> 注意:<if>標籤的 test 屬性中寫的是物件的屬性名,如果是包裝類的物件要使用 OGNL 表示式的寫法。注意沒有else的匹配使用 另外要注意 where 1=1 的作用~!
2、動態SQL之<where>標籤
比如用來替換上面的where 1=1
<!-- 根據使用者資訊查詢 --> <select id="findByUser" resultType="user" parameterType="user"> <include refid="defaultSql"></include> <where> <iftest="username!=null and username != '' "> and username like #{username} </if> <if test="address != null"> and address like #{address} </if> </where> </select>
3、動態SQL之<foreach>標籤
情景:傳入多個id來查詢使用者的SQL語句為
SELECT * FROM USERS WHERE username LIKE '%張%' AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '%張%' AND id IN (10,89,16)
這樣我們查詢的時候就需要將一個集合中的值,作為動態引數傳遞進來
public class QueryVo implements Serializable { private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } } <!-- 查詢所有使用者在 id 的集合之中 --> <select id="findInIds" resultType="user" parameterType="queryvo"> <include refid="defaultSql"></include> <where> <if test="ids != null and ids.size() > 0"> <foreach collection="ids" open="id in ( " close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
SQL 語句: select 欄位 from user where id in (?) <foreach>標籤用於遍歷集合,它的屬性: collection:代表要遍歷的集合元素,注意編寫時不要寫#{} open:代表語句的開始部分 close:代表結束部分
item:代表遍歷集合的每個元素,生成的變數名
sperator:代表分隔符
4、擴充套件
1)SQL片段:可以將重複的SQL提取出來,使用的時候通過include引入即可,達到SQL重用
<sql id="defaultSql"> select * from user </sql> <select id="findAll" resultType="user"> <include refid="defaultSql"></include> </select>