动态SQL简介

概念:

根据不同条件拼接 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=“”>

  1. foreach标签中的collection的值为list表示传入的是一个集合, 如果是一个数组, 那么就写为collection = “array”
  2. 我们从select标签中的parameterType属性值可以看出我们此时是传入了一个list集合
  3. foreach标签中的open的值表示以什么开始
  4. foreach标签中的close的值表示以什么结束
  5. foreach标签中的item就是在open和close值之间的变量, 就相当于Java中foreach循环中的临时变量
  6. 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>

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿究院-Cu-Sn合金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值