MyBatis框架:第九章:動(dòng)態(tài)SQL語(yǔ)句
準(zhǔn)備工作:
public class User {
private int id;
private String lastName;
private int sex;
14.1、if 語(yǔ)句
說(shuō)明: if語(yǔ)句,可以動(dòng)態(tài)的根據(jù)你的值來(lái)決定,是否需要?jiǎng)討B(tài)的添加查詢條件。
UserMapper類中的方法
public interface UserMapper {
public List queryUsersByNameAndSex(User user);
}
UserMapper配置文件中的配置
<!--
if語(yǔ)句
-->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
select id,last_name lastName,sex from t_user where
<!-- 我們希望動(dòng)態(tài)的創(chuàng)建這個(gè)條件語(yǔ)句 -->
<if test="lastName != null">
last_name like concat('%',#{ lastName },'%')
</if>
<if test="sex == 0 or sex == 1">
and sex = #{sex}
</if>
</select>
測(cè)試代碼:
@Test
public void testQueryUsersByNameAndSex() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List users = userMapper.queryUsersByNameAndSex(new User(0, “dmi”, 1));
System.out.println(users);
} finally {
session.close();
}
}
執(zhí)行的結(jié)果:
14.2、where 語(yǔ)句
說(shuō)明: where語(yǔ)句,可以幫我們?cè)诙鄠€(gè)動(dòng)態(tài)語(yǔ)句中,有效的去掉前面的多余的and 或 or 之類的多余關(guān)鍵字
UserMapper配置文件
<!--
where - if語(yǔ)句
-->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.atguigu.bean.User">
select id,last_name lastName,sex from t_user
<where>
<!-- 我們希望動(dòng)態(tài)的創(chuàng)建這個(gè)條件語(yǔ)句 -->
<if test="lastName != null">
last_name like concat('%',#{ lastName },'%')
</if>
<if test="sex == 0 or sex == 1">
and sex = #{sex}
</if>
</where>
</select>
測(cè)試的代碼是:
@Test
public void testQueryUsersByNameAndSex() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List users = userMapper.queryUsersByNameAndSex(new User(0, null, 1));
System.out.println(users);
} finally {
session.close();
}
}
測(cè)試的結(jié)果:
14.3、trim語(yǔ)句
說(shuō)明: trim 可以動(dòng)態(tài)在包含的語(yǔ)句前面和后面添加內(nèi)容。也可以去掉前面或者后面給定的內(nèi)容
prefix 前面添加內(nèi)容
suffix 后面添加內(nèi)容
suffixOverrides 去掉的后面內(nèi)容
prefixOverrides 去掉的前面內(nèi)容
UserMapper配置文件中的內(nèi)容
<!--
trim - if 語(yǔ)句
-->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
select id,last_name lastName,sex from t_user
<!--
trim 可以動(dòng)態(tài)在包含的語(yǔ)句前面和后面添加內(nèi)容。也可以去掉前面或者后面給定的內(nèi)容
prefix 前面添加內(nèi)容
suffix 后面添加內(nèi)容
suffixOverrides 去掉的后面內(nèi)容
prefixOverrides 去掉的前面內(nèi)容
-->
<trim prefix="where" suffixOverrides="and" prefixOverrides="">
<!-- 我們希望動(dòng)態(tài)的創(chuàng)建這個(gè)條件語(yǔ)句 -->
<if test="lastName != null">
last_name like concat('%',#{ lastName },'%') and
</if>
<if test="sex == 0 or sex == 1">
sex = #{sex}
</if>
</trim>
</select>
測(cè)試代碼:
@Test
public void testQueryUsersByNameAndSex() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List users = userMapper.queryUsersByNameAndSex(new User(0, “dmi”, 5));
System.out.println(users);
} finally {
session.close();
}
}
測(cè)試的結(jié)果:
14.4、choose( when , otherwise )語(yǔ)句
說(shuō)明:choose when otherwise 可以執(zhí)行多路選擇判斷,但是只會(huì)有一個(gè)分支會(huì)被執(zhí)行。
類似switch case 語(yǔ)句
UserMapper接口中添加的方法:
public List queryUsersByNameAndSexForChoose(User user);
UserMapper配置文件的內(nèi)容:
<!--
choose when otherwise 語(yǔ)句
有點(diǎn)類似于switch case 多路判斷。只執(zhí)行一路。
-->
<select id="queryUsersByNameAndSexForChoose" parameterType="com.bean.User"
resultType="com.bean.User">
select id,last_name lastName,sex from t_user
<where>
<choose>
<when test="id > 0">
id = #{ id }
</when>
<when test="lastName != null">
last_name = #{lastName}
</when>
<otherwise>
1 = 1
</otherwise>
</choose>
</where>
</select>
測(cè)試的代碼:
@Test
public void testQueryUsersByNameAndSexForChoose() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List users = userMapper.queryUsersByNameAndSexForChoose(new User(1, “admin”, 0));
System.out.println(users);
} finally {
session.close();
}
}
測(cè)試的結(jié)果:
14.4、set語(yǔ)句
說(shuō)明: set語(yǔ)句可以去掉,更新時(shí)候,set更新的多個(gè)列,由于動(dòng)態(tài)生成的sql語(yǔ)句,而導(dǎo)致多出來(lái)的逗號(hào)
UserMapper中添加的方法
public int updateUserForSet(User user);
UserMapper配置文件中的內(nèi)容:
<!--
update語(yǔ)句
set標(biāo)簽,可以去掉,多個(gè)列中的逗號(hào)
-->
<update id="updateUserForSet" parameterType="com.bean.User">
update t_user
<set>
<if test="lastName != null">
last_name = #{lastName},
</if>
<if test="sex == 0 or sex == 1">
sex = #{sex}
</if>
</set>
where id = #{id}
</update>
測(cè)試代碼:
@Test
public void testUpdateUserForSet() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.updateUserForSet(new User(3, “xxxx”, 10));
session.commit();
} finally {
session.close();
}
}
測(cè)試結(jié)果:
14.5、foreach語(yǔ)句
說(shuō)明: foreach語(yǔ)句,可以遍歷輸出一個(gè)集合的數(shù)據(jù)
在UserMapper中添加的方法
public List queryUserByidsForIn(@Param(“ids”)List ids);
UserMapper配置文件中的內(nèi)容
<!--
foreach語(yǔ)句可以遍歷輸出數(shù)據(jù)
collection屬性設(shè)置遍歷的集合
open 屬性設(shè)置遍歷輸出前的內(nèi)容
close 屬性設(shè)置遍歷輸出后的內(nèi)容
separator 屬性設(shè)置每輸出一個(gè)元素中間的間隔內(nèi)容
item 屬性 當(dāng)前正在遍歷到的數(shù)據(jù)名
-->
<select id="queryUserByidsForIn" resultType="com.bean.User">
select id,last_name,sex from t_user
where
id in
<foreach collection="ids" open="(" close=")" separator="," item="item_id">
#{item_id}
</foreach>
</select>
測(cè)試代碼:
@Test
public void testQueryUserByidsForIn() {
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
List ids = new ArrayList<>();
ids.add(3);
ids.add(6);
ids.add(7);
List users = userMapper.queryUserByidsForIn( ids );
System.out.println(users);
} finally {
session.close();
}
}
測(cè)試結(jié)果: