Mybatis 的映射文件中蜘腌,有些時候業(yè)務(wù)邏輯復(fù)雜時辰如,我們的 SQL 是動態(tài)變化的,此時使用前面的方式我們的 SQL 就不能滿足要求了责循。
建立工程:
1糟港、動態(tài) SQL 之<if>
根據(jù)實體類的不同取值,使用不同的 SQL 語句來進(jìn)行查詢院仿。比如在姓名如果不為空時可以根據(jù) 姓名查詢秸抚,如果性別不同空時還要加入用戶名作為條件。這種情況在我們的多條件組合查詢中經(jīng)常會碰到歹垫。
持久層 Dao 接口
UserDao.java
/**
* 根據(jù)傳入?yún)?shù)條件
* @param user 查詢的條件:有可能有用戶名剥汤,有可能有性別,也有可能有地址县钥,還有可能是都有
* @return
*/
List<User> findUserByCondition(User user);
持久層 Dao 映射配置
UserDao.xml
<!--根據(jù)條件查詢-->
<select id="findUserByCondition" resultMap="userMap" parameterType="user">
select * from user where 1=1
<if test="userName != null">
and username = #{userName}
</if>
<if test="userSex != null">
and sex = #{userSex}
</if>
</select>
MybatisTest.java
/**
* 測試查詢所有
*/
@Test
public void testFindByCondition(){
User u = new User();
//u.setUserName("王五");
u.setUserSex("女");
//執(zhí)行查詢所有方法
List<User> users = userDao.findUserByCondition(u);
for(User user : users){
System.out.println(user);
}
單個姓名查
單個性別查
姓名和性別一起查
注意:<if>標(biāo)簽的 test 屬性中寫的是對象的屬性名秀姐,如果是包裝類的對象要使用 OGNL 表達(dá)式的寫法。
另外要注意 where 1=1 的作用~若贮!
2省有、動態(tài) SQL 之<where>
為了簡化上面 where 1=1 的條件拼裝,我們可以采用<where>標(biāo)簽來簡化開發(fā)谴麦。
持久層 Dao 映射配置
<!-- 根據(jù)用戶信息查詢 -->
<select id="findUserByCondition" resultMap="userMap" parameterType="user">
select * from user
<where>
<if test="userName != null">
and username = #{userName}
</if>
<if test="userSex != null">
and sex = #{userSex}
</if>
</where>
</select>
3蠢沿、動態(tài)標(biāo)簽之<foreach> 標(biāo)簽
需求:
傳入多個 id 查詢用戶信息,用下邊兩個 sql 實現(xiàn):
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)
這樣我們在進(jìn)行范圍查詢時匾效,就要將一個集合中的值舷蟀,作為參數(shù)動態(tài)添加進(jìn)來。
這樣我們將如何進(jìn)行參數(shù)的傳遞面哼?
在 QueryVo 中加入一個 List 集合用于封裝參數(shù)
package com.neuedu.domain;
import java.util.List;
public class QueryVo {
private User user;
private List<Integer> ids;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
持久層 Dao 接口
/**
* 根據(jù)queryvo中提供的id集合野宜,查詢用戶信息
* @param vo
* @return
*/
List<User> findUserInIds(QueryVo vo);
持久層 Dao 映射
<!-- 根據(jù)queryvo中的Id集合實現(xiàn)查詢用戶列表 -->
<select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
select * from user
<where>
<if test="ids != null and ids.size()>0">
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
SQL 語句:
select 字段 from user where id in (?)
<foreach>標(biāo)簽用于遍歷集合,它的屬性:
collection:代表要遍歷的集合元素魔策,注意編寫時不要寫#{}
open:代表語句的開始部分
close:代表結(jié)束部分
item:代表遍歷集合的每個元素匈子,生成的變量名
sperator:代表分隔符
編寫測試方法
/**
* 測試foreach標(biāo)簽的使用
*/
@Test
public void testFindInIds() {
QueryVo vo = new QueryVo();
List<Integer> list = new ArrayList<Integer>();
list.add(41);
list.add(42);
list.add(46);
vo.setIds(list);
//執(zhí)行查詢所有方法
List<User> users = userDao.findUserInIds(vo);
for (User user : users) {
System.out.println(user);
}
}
4、sql標(biāo)簽
<!-- 了解的內(nèi)容:抽取重復(fù)的sql語句-->
<sql id="defaultUser">
select * from user
</sql>
<!-- 查詢所有 -->
<select id="findAll" resultMap="userMap">
<include refid="defaultUser"></include>
/*select * from user;*/
</select>