动态SQL

动态SQL

根据不同的条件执行不同的SQL语句

Mybatis中动态SQL在mapper.xml里面添加逻辑判断

前期准备:
        1. 准备好之前getMapper接口绑定和参数传递的环境

if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

//接口需要写方法
List<Log> selByAccinAccout(@Param("accout") String accout,@Param("accin") String accin);

//配置xml文件
<select id="selByAccinAccout" resultType="log">
select * from log where 1=1 //if是需要写where1=1

<!-- OGNL表达式 直接写key / 对象的属性 不需要添加任何特定字符号 -->
<if test="accin!=null and accin!=''">
and accin=#{accin}
</if>

<if test="accout!=null and accout!=''">
and accout=#{accout}
</if>
</select>

where (比if在sql少写where 1=1)

先去掉前面的and 然后加where (先去后加)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

//接口需要写方法
List<Log> selByAccinAccout(@Param("accout") String accout,@Param("accin") String accin);

<select id="selByAccinAccout" resultType="log">
select * from log //省去了if情况要写的where 1=1

<where>
<if test="accin!=null and accin!=''">
and accin=#{accin}
</if>

<if test="accout!=null and accout!=''">
and accout=#{accout}
</if>
</where>

</select>

choose when otherwise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

//接口需要写方法
List<Log> selByAccinAccout(@Param("accout") String accout,@Param("accin") String accin);

<select id="selByAccinAccout" resultType="log">
select * from log
<!-- OGNL表达式 直接写key / 对象的属性 不需要添加任何特定字符号 -->

<where>
<choose>
<when test="accin!=null and accin!=''"> //其实相当于将if改成了when
and accin=#{accin}
</when>
<when test="accout!=null and accout!=''">
and accout=#{accout}
</when>
</choose>
</where>

</select>

set 修改sqlset从句

去掉最后一个逗号 如果set里面有内容就会生成set关键字 (先去后加)

1
2
3
4
凑出形式: 
update log
set id=?,accin=?,accout=?, (最后一个逗号会被set删除掉 )
where id=?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

//接口写方法
int upd(Log log);

//配置xml里面

<update id="upd" parameterType="log">

update log
<set>
id=#{id},
<if test="accin!=null and accin!=''">
accin=#{accin},
</if>

<if test="accout!=null and accout!=''">
accout=#{accout},
</if>
</set>
where id=#{id}

</update>

//测试类使用接口产生getMapper对象 --然后创建log对象 set添加值
LogMapper logMapper = session.getMapper(LogMapper.class);
Log log=new Log();
log.setId(1);
log.setAccIn(accin); //上面输入
log.setAccOut(accout); //上面输入
int index=logMapper.upd(log); //获得结果

//提交
session.commit(); //一定要记得提交!!! 更新呀
session.close();
System.out.println("程序执行结束");

trim 可以去除和添加

trim属性介绍

1
2
3
4
prefix 在前面添加内容(+)
prefixOverrides 去掉前面内容(-)
suffix 在后面添加内容(+)
suffixOverrides 去掉后面内容(-)

模拟其他功能

先删除and 后添加where (模拟where功能)

1
2
3
4
凑出形式: 
select *
from log
where accin=? //先删除and 然后添加where
1
2
3
4
5
6
7

<select id="selByLog" parameterType="log" resultType="log">
select * from log
<trim prefix="where" prefixOverrides="and">
and accin={accin}
</trim>
</select>

先删除逗号 后添加set (模拟set功能)

1
2
3
4
凑出形式: 
update log
set id=?,accin=?,accout=?, (最后一个逗号会被set删除掉 )
where id=?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

<update id="upd" parameterType="log">
update log
<trim prefix="sex" suffixOverrides=,"">
id=#{id},
<if test="accin!=null and accin!=''">
accin=#{accin},
</if>

<if test="accout!=null and accout!=''">
accout=#{accout},
</if>
</trim>
where id={id}
</update>

bind 重新赋值 / 模糊查询

模糊查询
原内容前/后添加内容

1
2
3
4
<select id="selByLog" parameterType="log">
<bind name="accin" value="'%'+accin+'%'">
#{money}
</select>

foreach

循环参数内容 **
**内容前后添加内容

添加分隔符

属性介绍

1. collection 要遍历的集合
2. item 迭代变量 
      #{迭代变量名}获取内容
3. open 循环后左边添加内容
4. close 循环后右边添加内容
5. separator 每层循环时 元素之间的分隔符

在in查询

1
2
3
4
凑出来:
select *
from log
where id in (1,2,3);
1
2
3
4
5
6
<select id="selIn" parameterType="list" resultType="list">
select * from log where id in

<foreach collection="list" item="abc" open="(" close=")" separator=",">
#{abc}
</select>

批量新增 (效率低)

1. 写sql语句批量新增:

1
2
3
4
凑出来:
insert
into log
values (default,1,2,3),(default,12,2,3),(default,1,22,3)

2. openSession()必须指定

1
factory.openSession(ExecutorType.BATCH);  //底层的PreparedStatement.addBatch();

sql + include 多表查询

多表查询 (sql片段复用)

*将mysql这个表然后内容是四个属性 上面select可以直接include调用 *

1
2
3
4
5
6
7
8
<select id="">
select <include refid="mysql"></include> //直接include的refid标签调用mysql表
from log
</select>

<sql id="mysql">
id,accin,accout,money //给mysql这个表添加一个id 内容是四个属性
</sql>

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 动态SQL
  2. 2. if
  3. 3. where (比if在sql少写where 1=1)
  4. 4. choose when otherwise
  5. 5. set 修改sqlset从句
  6. 6. trim 可以去除和添加
    1. 6.1. trim属性介绍
    2. 6.2. 模拟其他功能
  7. 7. bind 重新赋值 / 模糊查询
  8. 8. foreach
    1. 8.1. 属性介绍
    2. 8.2. 在in查询
    3. 8.3. 批量新增 (效率低)
  9. 9. sql + include 多表查询
,