??我們之前在配置文件中寫的sql都是死代碼,每次查詢需要不同的條件都需要去修改sql語(yǔ)句,如果我們將sql語(yǔ)句設(shè)置成動(dòng)態(tài)的,就可以根據(jù)參數(shù)的不同進(jìn)行不同的查詢了。
一、if判斷
??我們可以通過(guò)if語(yǔ)句對(duì)傳入的參數(shù)進(jìn)行判斷,檢查是否有此參數(shù),如果條件參數(shù)為空或空字符串,那么就不添加這個(gè)條件;如果有這個(gè)條件參數(shù),就進(jìn)行條件查詢。
第一步:定義接口中的方法
//動(dòng)態(tài)sql:if判斷
List<User> queryUserList(User user);
第二步:在配置文件中添加sql語(yǔ)句
<!-- 1=1:如果沒(méi)有這個(gè)恒等式,if條件滿足了,sql語(yǔ)句的拼接就會(huì)出現(xiàn)問(wèn)題
if里面的test:用于添加if判斷的條件
-->
<select id="queryUserList" resultType="domain.User">
select * from user where 1=1
<if test="id != null ">
and id = #{id}
</if>
<if test="address != null and address != ''">
and address = #{address}
</if>
</select>
第三步:在測(cè)試類中進(jìn)行測(cè)試
@Test
public void getUserIf() throws Exception {
UserMapperInterface mapper = sqlSession.getMapper(UserMapperInterface.class);
User user = new User();
user.setId(16);
user.setAddress("上海");
List<User> list = mapper.queryUserList(user);
for (User user2 : list) {
System.out.println(user2.toString());
}
}
二、where
??在我們不知道是否有查詢條件的時(shí)候,如果只使用if進(jìn)行判斷的話,還需要添加一個(gè)恒等條件,防止sql語(yǔ)句出現(xiàn)問(wèn)題;如果我們配合where標(biāo)簽使用,就會(huì)非常簡(jiǎn)單。
修改上面案例中的配置文件,然后進(jìn)行測(cè)試
<select id="queryUserList" resultType="domain.User">
select * from user
<where>
<if test="id != null ">
and id = #{id}
</if>
<if test="address != null and address != ''">
and address = #{address}
</if>
</where>
</select>
三、foreach
??sql語(yǔ)句中可以使用in進(jìn)行范圍查詢,如果我們想要實(shí)現(xiàn)動(dòng)態(tài)輸入范圍,就需要使用foreach。
接口添加方法
//使用in范圍查詢
List<User> queryUserIn(List<Integer> list);
在配置文件中添加sql語(yǔ)句
- collection:屬性值應(yīng)該與我們輸入映射的參數(shù)一致
- open:指定我們開(kāi)始的連接部分
- close:指定我們結(jié)束部分的連接
- separator:指定連接的連接符
- item:表示我們循環(huán)迭代的別名
<select id="queryUserIn" resultType="domain..User">
select * from user
<where>
<foreach collection="list" open=" id in (" close=")" separator="," item="id">
#{id}
</foreach>
</where>
</select>
在測(cè)試類中進(jìn)行測(cè)試
@Test
public void queryUserIn() throws Exception {
UserMapperInterface mapper = sqlSession.getMapper(UserMapperInterface.class);
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(10);
list.add(16);
list.add(22);
List<User> userList = mapper.queryUserIn(list);
for (User user : userList) {
System.out.println(user.toString());
}
sqlSession.close();
}
四、sql片段
??sql片段可以用來(lái)存放我們需要查詢的內(nèi)容。
接口中添加方法
//使用sql片段查詢
List<User> getUsers(User user);
在配置文件中添加sql語(yǔ)句
<!-- sql片段 -->
<sql id="baseSql">
id,username,birthday,sex,address
</sql>
<select id="getUsers" resultType="domain.User">
select <include refid="baseSql"/>
from user where
address like '%${address}%'
</select>
在測(cè)試類中進(jìn)行測(cè)試
@Test
public void queryUsers() throws Exception {
UserMapperInterface mapper = sqlSession.getMapper(UserMapperInterface.class);
User user = new User();
user.setAddress("上海");
List<User> list = mapper.getUsers(user);
for (User user2 : list) {
System.out.println(user2.toString());
}
}