动态SQL中的关键字
> if
> choose
> foreach
> where、trim、set
我们在映射器中配置相应的SQL语句
1、if 多条件查询(动态查询)
通过test属性进行条件判断,决定是否拼接相应的SQL语句
<select id="getPersonList3" resultMap="Person2" parameterType="map">
select * from t_person
where pid > #{pid}
<if test="pname!=null">
and person_name like #{pname}
</if>
<if test="age!=null">
and age > #{age}
</if>
<if test="address!=null">
and person_address like #{address}
</if>
</select>
对应的java 测试代码
@Test
public void getPersonList3(){
Map<String,Object> params = new HashMap<String, Object>();
params.put("pid",5);
// params.put("pname", "%m%");
// params.put("age", 10);
// params.put("address", "%k%");
List<Person> persons = session.selectList("com.kgc.mybatis.pojo.getPersonList3", params);
for (Person person : persons) {
System.out.println(person);
}
}
描述需求:一般查询中,会根据自己的意愿,可以有多个或者模糊查询来控制条件,也有可能没有条件。
2、choose
相当于java中的switch 语句,提供了多种判断条件,如果有符合要求的下面的不执行。
<select id="getPersonList4" resultMap="Person2" parameterType="map">
select * from t_person
where pid > #{pid}
<choose>
<when test="pname!=null">
and person_name like #{pname}
</when>
<when test="age!=null">
and age > #{age}
</when>
<when test="address!=null">
and person_address like #{address}
</when>
<otherwise> and 1=1 </otherwise>
</choose>
</select>
choose、when、otherwise 对应的是java中的switch、case、default,根据条件判断执行哪一个分支
对应的java 测试代码
@Test
public void getPersonList4(){
Map<String,Object> params = new HashMap<String, Object>();
params.put("pid",1);
// params.put("pname", "%m%");
// params.put("age", 10);
// params.put("address", "%k%");
List<Person> persons = session.selectList("com.kgc.mybatis.pojo.getPersonList4", params);
for (Person person : persons) {
System.out.println(person);
}
}
3、where
前面两个我们都用了 where 1=1 ,但是使用 where 可以不这样处理
映射代码如下:
<select id="getPersonList5" resultMap="Person2" parameterType="map">
select * from t_person
<where>
<if test="pid!=null">
<!--第一个 and 可以删 -->
and pid > #{pid}
</if>
<if test="pname!=null">
and person_name like #{pname}
</if>
<if test="age!=null">
and age > #{age}
</if>
<if test="address!=null">
and person_address like #{address}
</if>
</where>
</select>
如上,当判断第一个是,会只能删除前面多余的 and。
以下对应测试代码,跟上面相同,考虑到篇幅就不写了。
4、set
当我们更新操作时,使用set元素可以帮助我们去掉多余的逗号
映射代码如下:
<update id="updatePerson" parameterType="map">
update t_person
<set>
<if test="pname!=null"> person_name = #{pname}, </if>
<if test="age!=null"> age = #{age}, </if>
<if test="address!=null"> person_address = #{address}, </if>
</set>
where pid = #{pid}
</update>
java测试代码如下:
@Test
public void updatePerson(){
Map<String,Object> params = new HashMap<String, Object>();
params.put("pid",1);
params.put("pname", "jim");
params.put("age", 10);
params.put("address", "kgc");
int count = session.update("com.kgc.mybatis.pojo.updatePerson", params);
System.out.println(count>0?"update success":"update fail!");
}
5、trim
trim可以帮我们加入和减少SQL的前缀和后缀
映射代码如下:
<select id="getPersonList6" resultMap="Person2" parameterType="map">
select * from t_person
<trim prefix="where" prefixOverrides="and|or">
<if test="pid!=null">
pid > #{pid}
</if>
<if test="pname!=null">
and person_name like #{pname}
</if>
<if test="age!=null">
and age > #{age}
</if>
<if test="address!=null">
and person_address like #{address}
</if>
</trim>
</select>
以上代码就相当于使用 where 标签, 当 if 条件成立时,profixOverrides="and"的作用是去掉SQL前面的“and”,prefix=“where” 的作用是在SQL前面加上“where”。
相应的属性还有suffix 和 suffixOverrides ,用于处理SQL 后面的内容(set)
<update id="updatePerson2" parameterType="map">
update t_person
<trim prefix="set" suffixOverrides=",">
<if test="pname!=null"> person_name = #{pname}, </if>
<if test="age!=null"> age = #{age}, </if>
<if test="address!=null"> person_address = #{address}, </if>
</trim>
where pid = #{pid}
</update>
6、foreach
映射代码如下:
<select id="getPersonList7" resultMap="Person2" parameterType="map">
select * from t_person where pid in
<foreach collection="list" item="pidTemp" open="(" close=")" separator=",">
#{pidTemp}
</foreach>
</select>
foreach元素中的属性含义解释如下:
> collection: 传递进来的 list 接口
> item: 配置循环的当前元素,表示集合中每一个元素进行迭代时的别名
> index: 当前元素的索引值,指定一个名称,用于表示在迭代的过程中每次迭代到的位置
> open、close: 配置使用什么符号把集合元素包装起来
> separator: 每个元素的间隔符
测试关键代码:
@Test
public void getPersonList7(){
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
List<Person> persons = session.selectList("com.kgc.mybatis.pojo.getPersonList7", list);
for (Person person : persons) {
System.out.println(person);
}
}