傳統的使用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表示的是:
- 如果參數
User
的id
不爲空就按照id
查詢; - 如果
id
爲null
,就按照username
查詢; - 如果
id
和username
都爲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對象,且只添加id
和username
屬性
<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();