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

2024-01-14 03:28

本文主要是介绍mybatis之动态sql、if\choose\when\otherwise\trim\where\set\foreach\bind有案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mybatis之动态sql

  • 动态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 元素

语法:

<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有案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/603778

相关文章

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使