MyBatis动态SQL语句

时间:2022-10-11 05:11:01

关键字

1.if 条件

2.choose , when 和 otherwise条件

3.where 条件

4.trim 条件

5.forEach循环

6.set 条件

 

一、if主要针对Map集合或者实体类

    <select id="selectduo" parameterType="Map" resultType="student" >
select * from student s where 1=1
<if test="sno!=null">
and s.sno=#{sno}
</if>
<if test="sname!=null">
and s.sname like #{sname}
</if>
</select>

 JUnit测试用例,判断map集合里的值

    @Test
public void selectduo() {
Map
<String, Object> map=new HashMap<String, Object>();
map.put(
"sno", 107);
map.put(
"sname", "%王%");
List
<Student> st=sm.selectduo(map);
for(Student tt:st){
System.out.println(tt);
}
}

MyBatis动态SQL语句

 

二、choose , when 和 otherwise条件

    <select id="selectduo" parameterType="Map" resultType="student" >
select * from student s where 1=1
<choose>
<when test="aaa=='zzz'">
and s.sno=#{sno}
</when>
<when test="aaa=='bbb'">
and s.sname like#{sname}
</when>
<!-- 都不符合时走这个 -->
<otherwise>
and 2=2
</otherwise>
</choose>
</select>

 JUnit测试用例

    @Test
public void selectduo() {
Map
<String, Object> map=new HashMap<String, Object>();
map.put(
"aaa", "bbb");
map.put(
"sno", 107);
map.put(
"sname", "%王%");
List
<Student> st=sm.selectduo(map);
for(Student tt:st){
System.out.println(tt);
}
}

MyBatis动态SQL语句

 

三、where:自动加上where,如果where子句以and或者or开头,则自动删除第一个and或者or。所以我们不需要自己加where

    <select id="selectduo" parameterType="Map" resultType="student" >
select * from student s
<where>
<if test="sno!=null">
and s.sno=#{sno}
</if>
<if test="sname!=null">
and s.sname like #{sname}
</if>
</where>
</select>

 JUnit测试用例

    @Test
public void selectduo() {
Map
<String, Object> map=new HashMap<String, Object>();
map.put(
"sno", 107);
map.put(
"sname", "%王%");
List
<Student> st=sm.selectduo(map);
for(Student tt:st){
System.out.println(tt);
}
}

 MyBatis动态SQL语句

 

四、trim 条件:trim条件和where条件类似但是功能更强大:不仅可以替换掉子句开头的and或者or,还提供了加前缀和后缀的功能。

     <select id="selectduo" parameterType="Map" resultType="student" >
select * from student s
<!-- 把第一个and或者or替换成where,替换最后一个用suffix="" suffixOverrides="" -->
<trim prefix="where" prefixOverrides="and|or" >
<if test="sno!=null">
and s.sno=#{sno}
</if>
<if test="sname!=null">
and s.sname like #{sname}
</if>
</trim>
</select>

 JUnit测试用例

    @Test
public void selectduo() {
Map
<String, Object> map=new HashMap<String, Object>();
map.put(
"sno", 107);
map.put(
"sname", "%王%");
List
<Student> st=sm.selectduo(map);
for(Student tt:st){
System.out.println(tt);
}
}

五、forEach循环

1.用list传值是

     <select id="selectduo" parameterType="list" resultType="student" >
select * from student s
<where>
s.sno in
<!-- 自己定义的名称,传来是什么类型变量 ,后面三个属性拼接成(,,,) -->
<foreach item="test" collection="list" open="(" separator="," close=")">
#{test}
</foreach>
</where>
</select>

JUnit测试用例

    @Test
public void selectduo() {
List
<Integer> snos=new ArrayList<>();
snos.add(
66);
snos.add(
110);
snos.add(
107);
List
<Student> st=sm.selectduo(snos);
for(Student tt:st){
System.out.println(tt);
}
}

2.用map传值时

     <select id="selectduo" parameterType="Map" resultType="student" >
select * from student s
<where>
s.sno in
<!-- 自己定义的名称,Map的key名字 ,后面三个属性拼接成(,,,) -->
<foreach item="test" collection="snoslist" open="(" separator="," close=")">
#{test}
</foreach>
</where>
</select>

JUnit测试用例

    @Test
public void selectduo() {
List
<Integer> snos=new ArrayList<>();
snos.add(
66);
snos.add(
110);
snos.add(
107);
Map
<String , Object> map=new HashMap<String,Object>();
map.put(
"snoslist", snos);
List
<Student> st=sm.selectduo(map);
for(Student tt:st){
System.out.println(tt);
}
}

结果都是一样的

MyBatis动态SQL语句

六、set 条件

自动加上set,自动去除最后一个逗号

    <update id="update" parameterType="student">
update student s
<set>
<if test="sname!=null">s.sname=#{sname},</if>
<if test="ssex!=null">s.ssex=#{ssex},</if>
<if test="sclass!=null">s.sclass=#{sclass}</if>
<where>
s.sno=#{sno}
</where>
</set>
</update>

JUnit测试用例

    @Test
public void update() {
Student st
=new Student(66, "蒙蒙", "男", 95033,null);
int m=sm.update(st);
System.out.println(m);
}