輕鬆學習Mybatis動態SQL

傳統的使用JDBC的方法,在組合複雜的的SQL語句的時候,需要去拼接,稍不注意哪怕少了個空格,都會導致錯誤。Mybatis的動態SQL功能爲了解決這種問題, 通過 if, choose, when, otherwise, trim, where, set, foreach標籤,可組合成非常靈活的SQL語句,從而提高開發人員的效率

實體類entity

User.java

public class User {
	private String id;
	private String username;
	private String password;
	private String sex;
	private String address;
	
		/*無參構造,有參構造,get/set方法,toString方法*/
}

數據庫

表結構
在這裏插入圖片描述
user表
在這裏插入圖片描述

1.if標籤

假設查詢的時候並不需要列出所有的條件,而只是從多個可選條件中選擇一個或者多個進行查詢,使用if標籤實現

	<select id="selectUserIf" parameterType="User" resultType="User">
		<!-- select * from user where 1=1 -->
		<!-- where 1=1 也可以寫成<where></where>標籤 -->
		select * from user
		<where>
			<if test="id!=null">
				and id = #{id}
			</if>
			<if test="sex!=null">
				and sex=#{sex}
			</if>
			<if test="username!=null">
				and username = #{username}
			</if>
			<if test="password!= null">
				and password = #{password}
			</if>
			<if test="address!= null">
				and address=#{address}
			</if>
		</where>
	</select>

Tips:在if標籤中,只要test中的表達式爲true,就會執行if標籤中的條件,即在sql語句中使用一個或多個and 條件來進行拼接完成查詢

例:查詢user表中性別爲“男”,地址爲“西安”的用戶

		// 讀取配置文件
		InputStream in = new FileInputStream("src/main/resources/mybatis.xml");
		// 解析配置文件
		SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
		//打開session
		SqlSession session = sf.openSession();
		
		User u = new User();
		u.setSex("男");
		u.setAddress("西安");
		List<User> list = session.selectList("Users.selectUserIf",u);
		for (User user : list) {
			System.out.println(user);
		}
		
		//提交
		session.commit();
		//關閉
		session.close();

在這裏插入圖片描述

2.choose標籤

choose標籤功能與switch語句相似,choose即switch,when對應case,otherwise對應default;
choose標籤是按順序判斷其內部when標籤中的test條件出否成立,如果有一個成立,則 choose 結束。當 choose 中所有 when 的條件都不滿則時,則執行 otherwise 中的sql

	<select id="selectUserChoose" parameterType="User" resultType="User">
		<!-- 1=1 是恆成立的,where默認爲1=1,即使不選擇任何條件,sql查詢也不會出錯 -->
		select * from user where 1=1
		<choose>
			<when test="id!=null">
				and id=#{id}
			</when>
			<when test="username!=null">
				and username=#{username}
			</when>
			<otherwise>
				and sex=#{sex}
			</otherwise>
		</choose>
	</select>

上面mapper映射中的select表示的是:

  • 如果參數Userid不爲空就按照id查詢;
  • 如果idnull,就按照username查詢;
  • 如果idusername都爲null,就按照sex查詢
		User u = new User();
		//u.setId("1");
		u.setUsername("王五");
		u.setSex("男");
		List<User> list = session.selectList("Users.selectUserChoose",u);
		for (User user : list) {
			System.out.println(user);
		}
		
		//提交
		session.commit();
		//關閉
		session.close();

在這裏插入圖片描述
Tips:if標籤是與(and)的關係,而choose標籤是或(or)的關係

3.foreach標籤

foreach標籤顧名思義是用來實現遍歷操作的,遍歷對象可以是集合,也可以是數組。

foreach標籤相關屬性:

  • collection 表示集合類型,比如list,map,array
  • index表示索引
  • separator表示分隔符,即迭代時每個元素之間以什麼分隔
  • item表示每次循環的對象,即在迭代過程中每一個元素的別名
  • open表示拼接開始字符
  • close表示拼接結束字符

例:每次添加多個User對象,且只添加idusername屬性

	<insert id="insertUsersForeach">
		insert into user(id,username) values
		<foreach collection="list" index="n" separator="," item="u">
			<!-- foreach 		循環 -->
			<!-- collection 	集合類型,比如list,map,array -->
			<!-- index 		索引 -->
			<!-- separator 分隔符 -->
			<!-- item 	每次循環的項,即傳遞過來的對象 -->
			<!-- open 	拼接開始字符 -->
			<!-- close 	拼接結束字符 -->
			(#{u.id},#{u.username})
		</foreach>
	</insert>
		User u1 = new User();
		u1.setId("5");
		u1.setUsername("小明");
		
		User u2 = new User();
		u2.setId("9");
		u2.setUsername("小紅");
		
		List<User> users = new ArrayList<User>();
		users.add(u1);
		users.add(u2);
		
		session.insert("Users.insertUsersForeach", users);
		//提交
		session.commit();
		//關閉
		session.close();

在這裏插入圖片描述
例:查詢地址爲“西安”,“長春”的用戶

	<select id="selectUserByAddress" resultType="User">
		select * from user where address in 
		<foreach collection="list" item="item" separator="," open="(" close=")">
			#{item}
		</foreach>
	</select>

拼接後的sql語句
在這裏插入圖片描述

		List<String> address = new ArrayList<String>();
		address.add("西安");
		address.add("長春");
		
		List<User> list = session.selectList("Users.selectUserByAddress",address);
		for (User user : list) {
			System.out.println(user);
		}
		
		//提交
		session.commit();
		//關閉
		session.close();

在這裏插入圖片描述
例:查詢username中帶有“張”字(有是可能姓“張”,也有可能名字中帶有“張”),且地址爲“西安”或“北京”的用戶
在這裏插入圖片描述
Tips:當使用模糊查詢需要拼接字符串的時候,就不能單純傳遞一個List,可以考慮將需要傳遞的字符串和List放入Map中進行傳遞

	<select id="selectUsersByAddressAndUsername" resultType="User">
	<!-- sql語句使用通配符時,需要加" ",否則會報錯-->
		SELECT
			*
		FROM
			USER
		WHERE
			username LIKE "%"#{str.username}"%"
		AND address IN
		<foreach collection="city" item="item" separator="," open="(" close=")">
			#{item}
		</foreach>
	</select>

拼接的後sql語句
在這裏插入圖片描述

		List<String> address = new ArrayList<String>();
		address.add("西安");
		address.add("北京");

		User u = new User();
		u.setUsername("張");

		Map<String, Object> map = new HashMap<String, Object>();
		//將User放進Map中
		map.put("str", u);
		//將List放進Map中
		map.put("city", address);
		
		//傳遞Map使用selectList即可
		List<User> list = session.selectList("Users.selectUsersByAddressAndUsername", map);
		for (User user : list) {
			System.out.println(user);
		}
		//提交
		session.commit();
		//關閉
		session.close();

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章