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

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

MySQL中VARCHAR和TEXT的区别小结

《MySQL中VARCHAR和TEXT的区别小结》MySQL中VARCHAR和TEXT用于存储字符串,VARCHAR可变长度存储在行内,适合短文本;TEXT存储在溢出页,适合大文本,下面就来具体的了解... 目录一、VARCHAR 和 TEXT 基本介绍1. VARCHAR2. TEXT二、VARCHAR