MyBatis 学习(六)之动态 SQL

目录

1 动态 SQL 介绍

2 if 标签

3 where 标签

4 set 标签

5 trim 标签

6 choose、when、otherwise 标签

7 foreach 标签

8 bind 标签


1 动态 SQL 介绍

        动态 SQL 是 MyBatis 强大特性之一,极大的简化我们拼装 SQL 的操作。MyBatis 的动态 SQL 是基于 OGNL 的( Object Graph Navigation Language ,对象图导航语言),它是一种强大的表达式语言,通过它可以非常方便的来操作对象属性, 类似于 EL,SpEL 等的表达式。动态 SQL 主要有以下几类:

  • if 标签用于条件判断,根据条件是否满足来决定是否包含某个元素。
  • where 标签用于生成 WHERE 子句,并会自动去掉(忽略)第一个条件的 and 或 or 关键字,避免语法错误
  • set 标签:用于生成 SET 子句,进行更新操作,可以自动处理最后一个条件结尾的逗号
  • trim 标签用于去除或添加前缀和后缀
  • choose、when、otherwise 标签类似于 Java 中的 switch、case、default 语句,根据不同的条件选择执行不同的 SQL 片段
  • foreach 标签用于遍历集合,常用于 IN 语句中的参数列表生成
  • bind 标签用于在 OGNL 表达式之外创建一个变量,并将其绑定到当前的上下文中,以便在后续的表达式中使用

2 if 标签

if 标签,根据条件是否满足来决定是否包含某个元素,判断条件写在 if 标签的 test 属性中

<resultMap id="employeeMap" type="com.dao.Employee"><id property="empId" column="employee_id"/><result property="empName" column="employee_name"/><result property="empAge" column="employee_age"/><result property="empSex" column="employee_sex"/><result property="empEmail" column="employee_email"/><result property="empAddress" column="employee_address"/>
</resultMap><select id="getEmpIf" parameterType="com.dao.Employee" resultMap="employeeMap">select * from employee where<if test="empName != null and empName != ''">employee_name=#{empName}</if>
</select>

上述代码如果 if 标签的条件不符合,则查询语句为 select * from employee where,会报错

3 where 标签

where 标签,用于生成 WHERE 子句,并会自动去掉(忽略)第一个条件的 and 或 or 关键字,避免语法错误。

<select id="getEmpWhereIf" parameterType="com.dao.Employee" resultMap="employeeMap">select * from employee<where><if test="empName != null and empName !=''">and employee_name=#{empName}</if></where>
</select>

通过 where 标签查询,不会出现 SQL 语句多余 where 的情况

set 标签

set 标签,用于生成 SET 子句,进行更新操作,可以自动处理最后一个条件结尾的逗号

<update id="UpdateEmployee" parameterType="com.dao.Employee">update employee<set><if test="empName != null and empName !=''">employee_name=#{empName},</if></set>where employee_id=#{empId}
</update>

测试代码需要提交事务,sqlSession.commit(); 否则不会更新数据库

trim 标签

trim 标签,用于去除或添加前缀和后缀,以下是 trim 标签的属性:

  • prefix:表示在 trim 标签内的 sql 语句加上前缀
  • suffix:表示在 trim 标签内的 sql 语句加上后缀
  • prefixOverrides:表示去除第一个前缀
  • suffixOverrides:表示去除最后一个后缀
<select id="getEmpWhereIf" parameterType="com.dao.Employee" resultMap="employeeMap">select * from employee<!-- 添加前缀 where,移除 and 或 or --><trim prefix="where" prefixOverrides="and | or"><if test="empName != null">and employee_name=#{empName}</if></trim>
</select>

6 choose、when、otherwise 标签

choose、when、otherwise 标签,类似于 Java 中的 switch 语句,根据不同的条件选择执行不同的 SQL 片段

<select id="selectEmployeeByChoose" resultType="com.dao.Employee" parameterMap="employeeMap">select * from employee<where><choose><when test="empName!= null and empName!=''">employee_name=#{empName}</when><when test="empAddress!= null and empAddress!=''">and employee_address=#{empAddress}</when><otherwise>and employee_age=#{empAge}</otherwise></choose></where>
</select>

7 foreach 标签

foreach 标签,用于遍历集合,常用于 IN 语句中的参数列表生成。foreach 标签有以下几个属性:

  • collection:表示要遍历的集合元素,注意不要写 #{}。
  • item:表示每次遍历时生成的对象名(当传入 Map 对象或 Map.Entry 对象的集合时,index  是键,item 是值)
  • index:表示在迭代过程中,每次迭代到的位置
  • open:表示开始遍历时要拼接的字符串
  • close:表示结束遍历时要拼接的字符串
  • sperator:表示在每次遍历时,两个对象之间的连接字符串
在 Mapper.xml SQL 映射文件
<select id="selectEmployeeByListId" resultMap="employeeMap">select * from employee<where><!-- where employee_id in (?,?,?,?)-->
<!--        <foreach collection="ids" item="id" open="employee_id in (" close=")" separator=",">-->
<!--            #{id}-->
<!--        </foreach>--><!-- where employee_id=? or employee_id=?... --><foreach collection="ids" item="id" separator="or">employee_id=#{id}</foreach></where>
</select>在 Mapper.java 接口
List<Employee> selectEmployeeByListId(@Param("ids") List<Integer> ids);在 Test 测试类
@Test
public void testSelectByListid() {List<Integer> ids = new ArrayList<>();ids.add(1);ids.add(2);ids.add(4);ids.add(5);List<Employee> employees = mapper.selectEmployeeByListId(ids);for (Employee employee : employees) {System.out.println(employee);}
}

8 bind 标签

bind 标签,用于在 OGNL 表达式之外创建一个变量,并将其绑定到当前的上下文中,以便在后续的表达式中使用。

<!-- 查询姓马的员工 -->
<select id="selectEmployeeByName" parameterType="com.dao.Employee" resultMap="employeeMap"><bind name="pattern" value="'%' + empName + '%'"/>select * from employee where employee_name like #{pattern}
</select>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505761.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络编程(IP、端口、协议、UDP、TCP)【详解】

目录 1.什么是网络编程&#xff1f; 2.基本的通信架构 3.网络通信三要素 4.UDP通信-快速入门 5.UDP通信-多发多收 6.TCP通信-快速入门 7.TCP通信-多发多收 8.TCP通信-同时接收多个客户端 9.TCP通信-综合案例 1.什么是网络编程&#xff1f; 网络编程是可以让设…

【Vue3】PostCss 适配

px 固定的单位&#xff0c;不会进行自适应。rem r root font-size16px 1rem16px&#xff0c;但是需要手动进行单位的换算vw vh 相对于视口的尺寸&#xff0c;不同于百分比&#xff08;相对于父元素的尺寸&#xff09;375屏幕 1vw 3.75px 利用插件进行 px&#xff08;设计稿&…

SpringCloudAlibaba介绍

Spring Cloud Alibaba Spring Cloud Alibaba 是什么&#xff1f;微服务全景图核心特色 大家好&#xff0c;我叫阿明。下面我会为大家准备Spring Cloud Alibaba系列知识体系&#xff0c;结合实战输出案列&#xff0c;让大家一眼就能明白得技术原理&#xff0c;应用于各公司得各…

Github项目推荐-LightMirrors

项目地址 https://github.com/NoCLin/LightMirrors 项目简述 “LightMirrors是一个开源的缓存镜像站服务&#xff0c;用于加速软件包下载和镜像拉取。目前支持DockerHub、PyPI、PyTorch、NPM等镜像缓存服务。 当前项目仍处于早期阶段。”–来自项目说明。 也就是说&#xff…

如何解决线程安全问题(synchronized、原子性、产生线程不安全的原因,锁的特性,加锁的方式等等干货)

文章目录 &#x1f490;线程不安全的示例&#x1f490;锁的特性&#x1f490;产生线程不安全的原因&#xff1a;&#x1f490;加锁的三种方式 &#x1f490;线程不安全的示例 对于线程安全问题&#xff0c;这里用一个例子进行讲解&#x1f447;&#xff1a; 我现在定义一个变…

CTFHUB 命令执行

命令执行 原理&#xff1a; 在编写程序的时候&#xff0c;当碰到要执行系统命令来获取一些信息时&#xff0c;就要调用外部命令的函数&#xff0c;比如php中的exec()、system()等&#xff0c;如果这些函数的参数是由用户所提供的&#xff0c;那么恶意用户就可能通过构造命令拼…

MogaNet实战:使用MogaNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文&#xff1a;https://arxiv.org/pdf/2211.03295.pdf 作者多阶博弈论交互这一全新视角探索了现代卷积神经网络的表示能力。这种交互反映了不同尺度上下文中变量间的相互作用效…

微信小程序云开发教程——墨刀原型工具入门(编辑页面)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

Django 管网项目 三

Django 官网文档 ​​Writing your first Django app, part 2 | Django documentation | Django 本文内容涉及创建视图 View&#xff0c;路由&#xff0c;和模版。并对内容进行渲染。 创建视图 在我们的投票应用中&#xff0c;我们需要下列几个视图&#xff1a; 问题索引页—…

阶跃信号与冲击信号

奇异信号&#xff1a;信号与系统分析中&#xff0c;经常遇到函数本身有不连续点&#xff08;跳变电&#xff09;或其导函数与积分有不连续点的情况&#xff0c;这类函数称为奇异函数或奇异信号&#xff0c;也称之为突变信号。以下为一些常见奇异函数。 奇异信号 单位斜变信号 …

ABAP - SALV教程07 斑马纹显示和SALV标题

SALV设置斑马纹和标题 METHOD set_layout.DATA: lo_display TYPE REF TO cl_salv_display_settings. * 取得显示对象lo_display co_alv->get_display_settings( ).* 设置ZEBRA显示lo_display->set_striped_pattern( X ). * 设置Titlelo_display->set_list_he…

Linux网络字节序/IP地址转换

网络字节序&#xff1a; 大&#xff08;高&#xff09;端字节序&#xff08;网络字节序&#xff09;&#xff1a;低位地址存放高位数据&#xff0c;高位地址存放低位数据 小&#xff08;低&#xff09;端字节序&#xff08;主机字节序&#xff09;&#xff1a;低位地址存放低…