mybatis之动态sql、if\choose\when\otherwise\trim\where\set\foreach\bind有案例

这篇具有很好参考价值的文章主要介绍了mybatis之动态sql、if\choose\when\otherwise\trim\where\set\foreach\bind有案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

动态SQL

定义:根据不同条件拼接SQLy语句,实现对数据库更准的操作。

实现方式:映射器配置文件或者注解

常用动态SQL元素

  1. if元素:判断语句,但条件分支判断
  2. choose元素:when、otherwise;多条件分支判断,等同于Java中的switch
  3. trim元素:where,set;辅助元素,用于处理一些SQL拼接的问题
  4. foreach元素:foreach元素用于遍历集合或数组
  5. bind元素:自定义上下文变量,传递参数

实体类中定义int还是Integer:一般情况下应该定义为Integer,选择的条件是判断该值能不能为0,因为在动态sql中判读是否输入的条件是0(引用数据类型为null)

if元素

语法:

<if test="条件"> 满足条件的语句</if>
如果需要多重条件进行判断在test中用or或and连接;该表达式也称为OGNL表达式(对象图导航语言),中的字符串比较不能用equals比较;属性名直接写
eg:
	<select id="findStudnet" resultType="Student" parameterType="Student">
	 	select * from studnet where 
	 		<if test="classId != 0">
	 			classid = #{classId}
	 		</if>
	 		<if test="ssex != null">
	 			and ssex = #{ssex}
	 		</if>
	 </select>
	 
解决办法一:在where后面加 1=1;但是where会对表中的数据逐行进行判断,因此效率低

解决办法二:

上面的案例存在问题:当传入一个参数时正常,当传入0个参数时where多余,当传入两个参数缺少and,解决办法是引入where标签;第一个and会自动去掉

<select id="findStudnet" resultType="Student" parameterType="Student">
	 	<!-- sql片段的使用 -->
	 	<include refid="sql1"></include>
	 	<where>
	 		<if test="classId != 0">
	 			and classid = #{classId}
	 		</if>
	 		<if test="ssex != null">
	 			and ssex = #{ssex}
	 		</if>
	 	</where>
	 </select>

choose 、when 、otherwise 元素

语法:

<choose>
	<when test="条件">满足条件的语句</when>
    <otherwise>满足其他条件条件的语句</otherwise>
</choose>
	 
eg:
	<select id="findStudentChoose" resultType="Student" parameterType="Student">
	 select * from student
	 	<where>
	 		<choose>
	 			<when test="sname != null">
	 				sname = #{sname}
	 			</when>
	 			<when test="birthday != null">
	 				birthday = #{birthday}
	 			</when>
	 			<when test="ssex != ssex">
	 				ssex = #{ssex}
	 			</when>
	           <!--	<otherwise>
	 				sid = 10
	 			</otherwise> -->
	 		</choose>
	 	</where>
	 </select>

注意:

  1. when中传入参数不论是否有结果匹配到后面的when都不会执行(等同于java中switch的break,前面的条件都为执行otherwise中的内容执行,不是必须的)

trim 、where 、set 元素

where语法:

<where>
    <if test="条件">满足条件的语句</if>
</where>



eg:
	<where>
		<if test="title != null">
        	and title = #{title}
        </if>
	</where>

where注意:

where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。

set语法:

<set>
    <if test = "条件">满足条件的语句</if>
</set>

eg:
	<set>
        <if test = "title != null">
        	title = #{title}
        </if>
	</set>

注意:

set 标签元素主要是用在更新操作的时候,它的主要功能和 where 标签元素其实是差不 多的,主要是在包含的语句前输出一个 set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果 set 包含的内容为空的话则会出错。有了 set 元素就可以动态的更新那些修改了的字段。

trim语法:

<trim prefix = “”suffixOverrides = “” prefixOverrides=“”suffix=“”></trim>
<!-- 
 prefix:在开始添加一个
 prefixOverrides:开始去掉一个
 suffix:结束添加一个
 suffixOverrides:结束去掉一个
-->

eg:
<update id="findStudentTrim" parameterType="Student">
		 update student
		 <trim prefix="set" suffixOverrides=",">
		 	<if test="sname != null">
	 			sname = #{sname},
	 		</if>
	 		<if test="birthday != null">
	 			birthday = #{birthday},
	 		</if>
	 		<if test="ssex != null">
	 			ssex = #{ssex},
	 		</if>
		 </trim>
		 where sid = #{sid}
	 </update>

foreach 元素

语法:

<foreach item="" index="" collection="" open="" separator="" close=""></foreach>

<!-- 
	item:循环中的当前元素
	index:当前循环位置的下标
	collection:方法传递的参数,一个数组(array)或是一个集合(list,l为小写)
	open:以什么符号开头
	close:以什么符号结束
	separator:元素间的间隔符号
-->

eg:
<select id="findStudentArray" resultType="Student">
	select * from student
    <where>
    	<foreach item="sid" collection="array" open="sid in (" separator="," close=")">
        	#{sid}
        </foreach>
    </where>
</select>

批量插入数据:将对象存入集合中,再通过 对象.属性 将值赋给数据库中的字段
<insert id="insertStudentForeach">
	 	insert into student (sname,birthday,ssex,classid)
	 	<foreach collection="list" open=" values"  separator="," item="stu">
	 		(#{stu.sname},#{stu.birthday},#{stu.ssex},#{stu.classId})
	 	</foreach> 	
</insert>

mybatis中的模糊查询

五种模糊查询:

  1. 方式一:业务层处理传入’张%’ 不推荐,耦合度高
  2. 方式二:通过MySQL的函数进行模糊处理,推荐
  3. ${}:纯字符串替换,不防止sql注入;不能用不能防止sql注入
  4. 方式四:通过sql语法进行特殊字符串拼接:#{v}“%”
  5. 方式五:bind标签 官方推荐;
<select id="selectStudnetLike" parameterType="String" resultMap="Student">
	 	<!-- 方式一:业务层处理传入'张%'  不推荐,耦合度高-->
	 	<!-- select * from student where sname like #{v} -->
	 	
	 	<!-- 方式二:通过MySQL的函数进行模糊处理 推荐 -->
	 	select * from student where sname like concat(#{v},'%')
	 	
	 	<!-- 方式三:不能用
	 		#{}:参数位置用?进项占位(sql预处理),然后用PreparedStatement进行传参处理
	 		${}:纯字符串替换,不防止sql注入
	 	-->
	 	select * from student where sname like '${v}%'
	 	
	 	<!-- 方式四:通过sql语法进行特殊字符串拼接 -->
	 	select * from student where sname like #{v}"%"
	 	
	 	<!-- 方式五:bind标签 官方推荐 -->
	 	<bind name="x" value="_parameter+'%'"/>
	 	select * from student where sname like #{x}%
	 	
</select>

bind 元素

语法:文章来源地址https://www.toymoban.com/news/detail-786980.html

<bind name=“” value=“_parameter”>
</bind>
<!--
name:自定义变量的变量名
value:自定义变量的变量值
_parameter:传递进来的参数
-->

eg:
<bind name = “name1” value = '%' + _parameter+ '%' ></bind>

到了这里,关于mybatis之动态sql、if\choose\when\otherwise\trim\where\set\foreach\bind有案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mybatis使用xml中的if-else/choose

    最近需要使用 xml 文件来实现一些增删改查,此文对 其中的 if-else 加以说明 背景: 有一个引用类,假设叫 Student 现在我们查询条件也被封装成一个引用类,例如: 那么使用 xml 怎么来使用和接收呢? 首先肯定是在 mapper 里面有一个方法 然后在 xml 文件中写这个方法的具体实

    2024年04月23日
    浏览(38)
  • sql示例:case when作为where 条件

    CASE WHEN语句的结果可以作为WHERE条件和其他条件一起使用,可以根据具体的需求来灵活组合。下面分别给出多个CASE WHEN语句在不同位置的SQL示例: CASE WHEN语句在WHERE条件中作为条件之一 上述代码中,CASE WHEN语句在WHERE条件中作为一个条件,其中condition_1和condition_2表示需要满足

    2024年02月16日
    浏览(76)
  • Mybatis中where标签和if标签结合使用说明

    由于不小心将 and 或者 or 写在了语句后面,导致mybatis无法自主判别,这种问题在新上手的同学中很是常见。下面我们探讨一下,在哪些情况下Mybatis无法判断动态SQL语句中的 and 或者 or 。 select筛选出视图对象的参数,用于给前端返回页面参数使用。 以下代码格式是正确,我们

    2023年04月08日
    浏览(37)
  • 在Mybatis中如何在where-if的语句中判断数组或列表的长度是否为0?

    可以使用OGNL表达式来判断列表或数组的长度是否为0。OGNL是Object Graph Navigation Language的缩写。它是一种表达式语言,用于从对象图中进行导航和访问。在Mybatis中,OGNL可用于在动态SQL语句中引用变量和方法。 假设要查询一个列表,查询条件包括一个列表idList,如果该列表或数

    2024年02月14日
    浏览(57)
  • SQL中的单条件判断函数IF,和多条件判断CASE WHEN的用法

    在SQL中,条件判断函数IF用于根据指定的条件返回不同的值。 condition:要判断的条件。 value_if_true:如果条件为真,则返回的值。 value_if_false:如果条件为假,则返回的值。 假设有如下名为studensts的表,包含id、name和score字段: 我们想根据学生的分数判断是否及格,并返回相

    2024年02月11日
    浏览(86)
  • 【Spring】— 动态SQL :<if>元素

    在MyBatis中, if 元素是常用的判断语句,主要用于实现某些简单的条件选择。在实际应用中,我们可能会通过多个条件来精确地查询某个数据。 【示例8-1】下面通过一个具体的案例来演示元素的使用。 (1)创建一个名为chapter08的Web项目。 (2)将之前chapter06项目中的JAR包和

    2024年02月07日
    浏览(28)
  • mybatis trim标签使用详解

    mybatis的trim标签一般用于去除sql语句中多余的and,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。 以下是trim标签中涉及到的属性: prefix=添加前缀 suffix=添加后缀 prefix

    2024年02月06日
    浏览(45)
  • mybatis的<choose>标签使用

    记录 :418 场景 :使用MyBatis的choose/choose标签的when/when标签的test属性,对入参属性的值做非null(!=null)、非空(!=\\\'\\\')判断,或者与常量做相等(==)或者不等判断(!=)。 版本 :JDK 1.8,Spring Boot 2.6.3,mybatis-3.5.9。 1.基础知识 1.1MyBatis的标签 (1)查看MyBatis支持的标签 地址:http://mybatis.org/d

    2024年02月08日
    浏览(39)
  • mybtis动态SQL注解 脚本动态SQL\方法中构建SQL\SQL语句构造器

    分类 : 脚本动态SQL :XML配置方式的动态SQL,是用 script 的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置 方法中构建SQL :@SelectProvider 、@InsertProvider、@UpdateProvider、@DeleteProvider 这些方法的使用 SQL语句构造器 :实现动态 SQL 的内容 脚本动态SQL 在sql语句中加

    2024年01月21日
    浏览(52)
  • 使用动态sql时,if标签不起作用

    目录 场景: 问题分析: 问题解决: 简单讲一下应用场景 我拿到一个项目,完成后端数据处理,在进行可选条件查询时,使用动态sql  在mapper.xml中我先是这么写的  然后,就出现if标签失效的情况,关键是它有时候也会返回到前端数据,给我都搞蒙了 反复查看,加上网搜索

    2024年01月23日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包