概念:
根据不同条件拼接 SQL 语句,实现对数据库更准确的操作;
什么时候用动态SQL:
1、条件查询:当查询条件可能因用户输入或业务逻辑而变化时,可以使用动态 SQL 来构建查询语句。例如,根据用户提供的关键字进行模糊查询,或者根据不同的筛选条件动态拼接 WHERE 子句。
2、分页查询:在需要实现分页功能时,可以使用动态 SQL 配合分页插件(如 PageHelper)来生成带有 LIMIT 和 OFFSET 的 SQL 语句。
3、动态表名:在需要根据不同情况查询不同的表时,可以通过动态 SQL 动态切换表名。
4、动态字段:在返回结果集中,根据不同的需求动态选择返回的字段。
5、复杂逻辑处理:当 SQL 逻辑较为复杂,需要根据不同条件进行不同的处理时,可以使用动态 SQL 中的 choose(类似于 Java 中的 switch)、when、otherwise 等标签来实现。
6、批量操作:在进行批量插入、更新或删除操作时,可以通过动态 SQL 的 foreach 标签来遍历集合,构建批量操作的 SQL 语句。
7、安全性和性能考虑:动态 SQL 可以帮助避免直接拼接用户输入的字符串到 SQL 语句中,从而减少 SQL 注入的风险,同时也可以提高 SQL 语句的执行效率。
动态标签怎么用:
<if>标签
作用是如果test中的条件满足,则if标签中间的语句成立,否则不成立
<select id="selteacherSQL" resultType="Teacher" parameterType="Teacher">
select * from teacher
<if test="tsex != 0 or tname != null" >
where
</if>
<if test="tsex != 0">
Tsex = #{tsex}
</if>
<if test="tsex !=0 and tname !=null">
and
</if>
<if test="tname != null">
Tname = #{tname}
</if>
</select>
test中的是OGNL表达式, 叫做对象图导航语言,用#{}来拿Teacher的属性值,逻辑符号是and,or,not,字符串用''表示而不是"",
稍微优化一下可以写成:
<select id="selteacherSQL" resultType="Teacher" parameterType="Teacher">
select * from teacher where 1=1
<if test="tsex != 0">
and Tsex = #{tsex}
</if>
<if test="tname != null">
and Tname = #{tname}
</if>
</select>
where的作用:对表里的每一条数据进行判断
所以用上面的方法where 1 =1会使其效率变低
<where>标签
1、当where标签中有条件是,会拼接一个where关键字
2、将where关键字后面的and或者or这样的关键字处理掉
<select id="selteacherSQL" resultType="Teacher" parameterType="Teacher">
select * from teacher
<where> //当只有第一个条件,where后面的的and就会被去掉
<if test="tsex != 0">
and Tsex = #{tsex}
</if>
<if test="tname != null">
and Tname = #{tname}
</if>
</where>
</select>
<choose>标签
用来进行有优先级的条件选择,和Java中的switch相似,在前面的先判断,满足条件就用并且停止向后继续走,不满足就一直向后走,直到otherwise;(当然otherwise是可写可不写的,要注意when的权重)
<select id="selteacherxuanze" resultType="Teacher" parameterType="Teacher">
select * from teacher
<where>
<choose>
<when test="tname != null">
Tname = #{tname}
</when>
<when test="tsex != 0">
Tsex = #{tsex}
</when>
<when test="tmoney">
Tmoney = #{tmoney}
</when>
<otherwise>
tid = 1
</otherwise>
</choose>
</where>
</select>
<set>标签
用于修改的动态SQL,主要功能和 where 标签元素其实是差不多的,主要是在包含的语句前输出一个 set, 然后如果包含的语句是以逗号结束的话将会 把该逗号忽略,如果 set 包含的内容为空的 话则会出错。有了 set 元素就可以动态的更 新那些修改了的字段。
<update id="updatateacherss" parameterType="Teacher">
update teacher
<set>
<if test="tsex != 0 and tsex != ''">
and Tsex = #{tsex},
</if>
<if test="tname != null and tname != ''">
and Tname = #{tname},
</if>
</set>
</update>
<trim>
啥都能干,但是一般不选择,除非像新增这种没有特殊标签的才用
用法:trim有4个变量:
prefix:前缀
prefixoverride:去掉第一个and或者是or
suffix:后缀
suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)
<update id="updatatrimteacher" parameterType="Teacher">
update teacher
<trim prefix="where" prefixOverrides="and" suffixOverrides=",">
<if test="tsex != 0 and tsex != ''">
Tsex = #{tsex},
</if>
<if test="tname != null and tname != ''">
Tname = #{tname},
</if>
</trim>
</update>
<foreach>
< foreach item = “”index=“” collection=“” open=“” separator=“” close=“”>
- foreach标签中的collection的值为list表示传入的是一个集合, 如果是一个数组, 那么就写为collection = “array”
- 我们从select标签中的parameterType属性值可以看出我们此时是传入了一个list集合
- foreach标签中的open的值表示以什么开始
- foreach标签中的close的值表示以什么结束
- foreach标签中的item就是在open和close值之间的变量, 就相当于Java中foreach循环中的临时变量
- foreach 标签中的separation就是每个item之间的分隔符
模糊查询
<!-- 模糊查询-->
<select id="" parameterType="String" resultType="Teacher">
-- select * from teacher where tname like '#{v}%';
-- 有问题,''会把#{v}%当成一个字符串,没法传递数据
select * from teacher where tname like #{v}
--1 从view层就接受%,这里就不用改,不推荐
select * from teacher where tname like concat{#{v,'%'}
--2 concat进行字符串拼接
select * from teacher where tname like ${v}%
--3 ${}是纯字符串拼接,不能防止sql注入,不能用啊,用来理解${},#{}的区别
select * from teacher where tname like #{v}"%"
--4 #{v}最后会被翻译成'张',后面是"%",这个是单双引号交替出现,手册上找不到但是好用
<bind name="x" value="_parameter+'%'"/>
select * from teacher where tname like #{x}
--5 bind标签,官方推荐,bind是用来定义变量的
</select>