目錄
1.?動態SQL
1.1. if
1.1.1. 持久層接口添加方法
1.1.2.?映射文件添加標簽
1.1.3.?編寫測試方法
1.2.?where
1.3.?set
1.4.?choose、when、otherwise
1.5.?foreach
1.5.1.?遍歷數組
1.5.2.?遍歷Collection
1.5.3.?遍歷Map
2. 總結
前言
本文來講解MyBatis的動態SQL
集合代碼和圖片演示,旨在讓大家更好的理解(??????)??
個人主頁:藝杯羹🌿
系列專欄:本文ben'weben'wbenbeMyBbatis🚀
1.?動態SQL
一個查詢的方法的Sql語句不一定是固定的
比如電影選片,根據不同要求,Sql語句就會添加不同的查詢條件
如圖:
此時就需要在方法中使用動態Sql語句
1.1. if
?<if>?標簽內的Sql片段在滿足條件后才會添加,用法為:<if test="條件">?。例如:根據不同條件查詢用戶:
1.1.1. 持久層接口添加方法
// 用戶通用查詢
List<User> findByCondition(User user);
1.1.2.?映射文件添加標簽
<select id="findByCondition" parameterType="com.yibeigen.pojo.User" resultType="com.itbaizhan.pojo.User">select * from user where 1 = 1<if test = "username != null and username.length() != 0">and username like #{username}</if><if test = "sex != null and sex.length() != 0">and sex = #{sex}</if><if test="address != null and address.length() != 0">and address = #{address}</if>
</select>
1.1.3.?編寫測試方法
@Test
public void testFindByCondition(){User user = new User();List<User> users1 = userMapper2.findByCondition(user);//users1.forEach(System.out::println);user.setUsername("%金%");List<User> users2 = userMapper2.findByCondition(user);users2.forEach(System.out::println);user.setAddress("北京");List<User> users3 = userMapper2.findByCondition(user);users3.forEach(System.out::println);
}
- if中的條件不能使用 && / ||,而應該使用 and / or
- if中的條件可以直接通過屬性名獲取參數POJO的屬性值,并且該值可以調用方法。
- where后為什么要加1=1?
任意條件都可能拼接到Sql中。如果有多個條件,從第二個條件開始前都需要加And關鍵字。加上1=1這個永久成立的條件,就不需要考慮后面的條件哪個是第一個條件,后面的條件前都加And關鍵字即可
1.2.?where
?<where>?可以代替sql中的 where 1=1 和 第一個and
更符合程序員的開發習慣,使用<where>?后的映射文件如下:
if 標簽放在 where 里
<select id="findByCondition" resultType="com.itbaizhan.user.User" parameterType="com.itbaizhan.user.User">select * from user<where><if test="username != null and username.length() != 0">username like #{username}</if><if test="sex != null and sex.length() != 0">and sex = #{sex}</if></where>
</select>
1.3.?set
<set>?標簽用在update語句中
借助<if>?,可以只對有具體值的字段進行更新
<set>?會自動添加set關鍵字,并去掉最后一個if語句中多余的逗號
<update id="update" parameterType="com.yibeigen.user.User">update user<set><if test="username != null and username.length() > 0">username = #{username},</if><if test="sex != null and sex.length() > 0">sex = #{sex},</if></set><where>id = #{id}</where>
</update>
1.4.?choose、when、otherwise
這些標簽表示多條件分支,類似JAVA中的switch...case
<choose>類似switch
<when>類似case
<otherwise>類似default
用法如下:
<select id="findByCondition" resultType="com.yibeigen.user.User" parameterType="com.yibeigen.user.User">select * from user<where><choose><when test="username.length() < 5">username like #{username}</when><when test="username.length() < 10">username = #{username}</when><otherwise>id = 1</otherwise></choose></where>
</select>
這段代碼的含義為:
用戶名 < 5 時使用 模糊查詢
用戶名 >= 5 并且 < 10 時使用 精確查詢
否則查詢id為1的用戶
1.5.?foreach
?<foreach>?類似 JAVA 中的for循環,可以遍歷集合或數組。<foreach>?有如下屬性:
- collection:遍歷的對象類型
- open:開始的sql語句
- close:結束的sql語句
- separator:遍歷每項間的分隔符
- item:表示本次遍歷獲取的元素,遍歷List、Set、數組時表示每項元素,遍歷map時表示鍵值對的值
- index:遍歷List、數組時表示遍歷的索引,遍歷map時表示鍵值對的鍵
1.5.1.?遍歷數組
我們使用<foreach>?遍歷數組進行批量刪除
1. 持久層接口添加方法
void deleteBatch(int[] ids);
2.?映射文件添加標簽
<delete id="deleteBatch" parameterType="int">delete from user<where><foreach open="id in(" close=")" separator="," collection="array" item="id" >#{id}</foreach></where>
</delete>
3.?編寫測試方法
@Test
public void testDeleteBatch(){int[] ids = {5,8};userMapper.deleteBatch(ids);session.commit();
}
1.5.2.?遍歷Collection
?<foreach>?遍歷List和Set的方法是一樣的,我們使用<foreach>?遍歷List進行批量添加。
1. 持久層接口添加方法
void insertBatch(List<User> users);
2.?映射文件添加標簽
<insert id="insertBatch" parameterType="com.yibeigen.user.User">insert into user values<foreach collection="list" item="user" separator=",">(null ,#{user.username},#{user.birthday},#{user.sex},#{user.address})</foreach>
</insert>
3.?編寫測試方法
@Test
public void testInsertBatch(){User user1 = new User("程序員1", "男", "北京");User user2 = new User("程序員2", "女", "上海");List<User> users = new ArrayList();users.add(user1);users.add(user2);userMapper2.insertBatch(users);session.commit();
}
1.5.3.?遍歷Map
我們使用<foreach>?遍歷Map進行多條件查詢
1.?持久層接口添加方法
/*** 多條件查詢* @param map 查詢的條件鍵值對 鍵:屬性名 值:屬性值* @return要給參數起一個參數名才能用!!!*/
List<User> findUser(@Param("queryMap") Map<String,Object> map);
2.?映射文件添加標簽
<select id="findUser" parameterType="map" resultType="com.yibeigen.pojo.User">select * from user<where><foreach collection="queryMap" separator="and" index="key" item="value">-- 鍵是拼進來的,這個key和value是到時候會傳進來的!!!-- ${} 是直接會加上的,#{},是會預編譯的${key} = #{value}</foreach></where>
</select>
3.?編寫測試方法
@Test
public void testFileUser(){Map<String, Object> queryMap = new HashMap<>();queryMap.put("sex", "男");queryMap.put("address", "北京");List<User> user = userMapper.findUser(queryMap);user.forEach(System.out::println);
}
2. 總結
現在就講解完了動態SQL,希望對你有所幫助(??????)??