SSM框架(十一)mybatis动态sql

目录

1. 动态SQL简介

2. if元素

3. choose元素

4. where元素(动态条件查询)

5. set元素(动态修改)

6. trim元素

trim元素代替Where

7. Foreach元素


1. 动态SQL简介

动态SQL是Mybatis框架中强大的特性之一。在一些组合查询页面,经常需要根据用户输入的查询条件生成不同的查询的SQL。根据不同条件拼接 SQL 语句容易出错(拼接时要确保不能忘记必要的空格,最后一列名去除逗号等等),MyBatis可以轻易解决这种问题。动态SQL元素与JSTL相似,它允许我们在XML中构建不同的SQL语句。

常用的元素如下:

  • 判断元素:if,choose
  • 关键字元素:where(常和if实现动态查询) ,set(和if实现动态修改),trim
  • 循环元素:foreach(实现批量插入或者更新)

2. if元素

If元素是简单的条件判断逻辑,满足制定条件时追加if元素的SQL,不满足条件时不追加,使用格式如下:

<select id="" resultMap="stu">
		SQL语句1
	<if test="条件">
		SQL语句2
	</if>
</select>

3. choose元素

有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个,此时就可以使用choose元素,choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。 当 choose 中所有 when 的条件都不满则时,则执行otherwise 中的sql:

<select ......>
	SQL 语句2
	<choose>
		<when test="条件一">
			SQL 语句2
		</when>
		<when test="条件二">
			SQL 语句2
		</when>
		<otherwise>
			SQL语句3
		</otherwise>
	</choose>
</select>

4. where元素(动态条件查询)

Where元素主要是用于简化查询语句中where部分的条件判断。比如我们在使用if的时候,要是所有条件都不满足,那么sql语句后面就会多一个where,很明显这个sql是错误的。如下这个例子

<select>
    SELECT * FROM t_emp  WHERE 
    <if test="">
         sql1
    </if>
    <if test="">
         sql2
    </if>
</select>

使用where元素就可以避免这种错误,使用where元素,当查询条件至少有一个以上的if元素满足条件时才去插入“WHERE”子句。

where元素的使用如下

<select>
    sql1
	<where> 
        <if test="条件一">sql2</if>
        <if test="条件二">sql2</if>
        <if test="条件三>sql2</if>
	</where>
</select>

5. set元素(动态修改)

Set元素用在更新操作的时候,和where元素相似,主要是在<set>元素所在位置输出一个set关键字,可以去避免一些因为sql不完整产生的错误。Set使用格式如下:

<update…>
	Update 表
	<set>
 		动态追加更新字段
	</set>
</update>

6. trim元素

Trim元素有点类似replace的效果,其使用也是围绕其四个属性来的:

  1、prefix:可以给Trim元素包裹内容之前加上指定前缀,

  2、suffix:可以给Trim元素包裹内容之后加上某些后缀,

  3、prefixOverrides:可以把Trim元素包含内容的首部某些内容过滤,

  4、suffixOverrides:可以把Trim元素包含内容的尾部的某些内容过滤。

所以也可以利用trim来代替where和set元素的功能。

trim元素代替Where

	<select>
        SELECT *  FROM student
	 	<!--prefix添加where前缀prefixOverrides将第一个AND去除-->
       <trim prefix="WHERE"  prefixOverrides="AND|OR">
           <if test="age!=null"> AND age>#{age}</if>
           <if test="score!=null"> AND score>#{score}</if>
      </trim>
	</select>

上述语句终于变成了:

  SELECT *  FROM   student  WHERE   age=#{age}  AND  score>#{score}

7. Foreach元素

Foreach元素实现了循环逻辑,可以实现对一个集合的迭代,通常是在构建 IN 条件语句的时候。Foreach元素一般实现对三种类型数据的遍历:List,  数组array,  Map三种。

Foreach元素属性简介:

  1.  item(必选):表示集合中每一个元素进行迭代时的别名。
  2.  collection(必选):表示传入过来的参数的数据类型,如果传入参数为List,则其属性值为list;传入数组则属性值为array;如果传入参数为User对象,而这个User对象有属性 List  list,那么属性值为collection =list
  3.  index:在 list 和数组中,index 是元素的序号;在 map 中,index 是元素的 key。
  4.  open:表示该语句以什么开始
  5.  close:表示该语句以什么结束
  6.  separator:表示在每次进行迭代之间以什么符号作为分隔符
<select>
    SELECT * FROM student WHERE sid IN
	<!-- 传入参数类型为array,每个元素别名为ids,以(开始,以 )结尾,每个元素用逗号分隔开-->
    <foreach collection="array"  item="id"  open="("  close=")" separator=",">
        #{id}
    </foreach>
</select>

 表示传入一个数组,查询学号在这个数组里面的学生信息

本人联系方式2329095893,欢迎各位进行学习讨论

欢迎关注熊熊出没ING公众号,不定时跟新Java、python、信息安全等相关知识哦。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值