当前位置: 首页 > news >正文

MyBatis:动态 SQL 标签

MyBatis

  • 动态 SQL 标签
    • if 标签
    • where 标签
    • trim 标签
    • choose 、when 、otherwise 标签
    • foreach 标签

在这里插入图片描述

动态 SQL 标签

MyBatis 动态 SQL 标签,是一组预定义的标签,用于构建动态的 SQL 语句,允许在 SQL 语句中使用条件、循环和迭代等逻辑。通过使用动态 SQL 标签,开发者可以根据不同的条件和参数生成不同的 SQL 语句,实现更加灵活的数据访问操作。但是,需要谨慎处理 SQL 注入问题,确保所有的输入都经过正确的验证和转义处理,以防止安全漏洞的产生。

常用的动态 SQL 标签

  • if 标签:根据条件判断是否包含 SQL 语句片段
  • where 标签:根据条件控制 SQL 语句的查询条件部分
  • trim 标签:根据条件去除或添加字符串前后的特定字符
  • choose 、when 、otherwise 标签:根据条件选择不同的 SQL 语句片段
  • foreach 标签:在 SQL 语句中迭代一个集合

简单示例:
首先,创建一张数据表 dynamic_sql_object
表结构如图:
在这里插入图片描述
表信息如图:
在这里插入图片描述

接着,创建与数据表一一映射的实体类 DynamicSqlObject

package cn.edu.MyBatisDemo.model;public class DynamicSqlObject {private int id;private String name;private String grade;private int age;private String phone;public DynamicSqlObject() {super();}public DynamicSqlObject(int id, String name, String grade, int age, String phone) {this.id = id;this.name = name;this.grade = grade;this.age = age;this.phone = phone;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "DynamicSqlObject{" +"id=" + id +", name='" + name + '\'' +", grade='" + grade + '\'' +", age=" + age +", phone='" + phone + '\'' +'}';}
}

然后,创建一个接口 DynamicSqlObjectMap ,声明获取指定用户信息的方法。同时,创建映射文件 DynamicSqlObjectMap.xml 实现接口方法

package cn.edu.MyBatisDemo.mapper;import cn.edu.MyBatisDemo.model.DynamicSqlObject;
import org.apache.ibatis.annotations.Param;public interface DynamicSqlObjectMap {//加上 @Param() 注解防止抛出异常---ReflectionException: There is no getter for property named 'xxx'public DynamicSqlObject getObject(@Param("name") String name,@Param("phone") String phone); // 获取指定用户信息
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 每个标签示例中再补充 -->
<mapper namespace="cn.edu.MyBatisDemo.mapper.DynamicSqlObjectMap"><select id="getObject" resultType="dynamicSqlObject" >SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object`</select>
</mapper>

最后,测试结果,对每个标签进行简单示例

if 标签

在上面的示例中,select 标签定义了一个名为 getObject 的查询语句,其结果类型为 DynamicSqlObject 。
在 SQL 语句中,首先可以使用 WHERE 1=1 来构建一个通用的条件,然后使用 if 标签根据不同的条件来添加额外的限制条件。在 if 标签中,使用 test 属性来判断条件是否满足,若满足则执行该标签内的 SQL 语句片段;若不满足则不执行。
在这里插入图片描述

结果如图:
传递的参数值为 {name: “曹操”, phone: null} ,则生成的 SQL 语句为

SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE 1=1 AND `name`= '曹操'

在这里插入图片描述

where 标签

在 where 标签中,可以根据不同的条件动态生成不同的 WHERE 子句,从而灵活地执行数据库查询操作。在 where 标签内使用 if 标签来添加条件语句。
在这里插入图片描述

结果如图:
传递的参数值为 {name: “曹操”, phone: “13625987401”} ,则生成的 SQL 语句为

SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `name`= '曹操' AND `phone`= '13625987401'

在这里插入图片描述

:where 标签只可以去掉第一个条件语句中前面的 AND 或 OR

trim 标签

在 trim 标签中,可以在动态 SQL 语句中去除前缀或后缀,也可以在 select 、update 或 insert 标签中使用。

trim 标签属性

  • prefix:添加前缀
  • prefixOverrides:去除前缀
  • suffix:添加后缀
  • suffixOverrides:去除后缀

在这里插入图片描述

结果如图:
传递的参数值为 {name: “曹操”, phone: “13625987401”} ,则生成的 SQL 语句为

SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `name`= '曹操' AND `phone`= '13625987401'

在这里插入图片描述

choose 、when 、otherwise 标签

choose、when、otherwise 标签是一组标签,配合使用。choose 标签包含多个 when 标签和一个 otherwise 标签。在 when 标签中,使用 test 属性来判断条件是否满足,若满足则执行该标签内的 SQL 语句片段;若没有任何条件满足,则 otherwise 标签内的 SQL 语句片段作为默认的语句片段执行。
在这里插入图片描述

结果如图:
传递的参数值为 {name: “曹操”, phone: “15489723601”} ,则生成的 SQL 语句为

SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `name`= '曹操'

在这里插入图片描述


条件选择:在 when、otherwise 标签中,当多个条件都满足时,只选择最前面的一条 SQL 语句片段执行(从上往下的顺序)
条件判断:在 if 标签中,当多个条件都满足时,所有满足条件的 SQL 语句片段都会执行

foreach 标签

foreach 标签适用于遍历集合、批量操作的情况。

foreach 标签属性

  • collection:指定的集合
  • item:指定集合的每一个值的迭代变量
  • separator:在生成的 SQL 语句中,每个元素之间的分隔符
  • open:在生成的 SQL 语句中,需要在 IN 子句或 BETWEEN 子句的前面添加的字符串
  • close:在生成的 SQL 语句中,需要在 IN 子句或 BETWEEN 子句的后面添加的字符串

foreach 标签示例中还需要再声明一个批量获取指定用户信息的方法。同时,在映射文件 DynamicSqlObjectMap.xml 中实现该接口方法
在这里插入图片描述

<select id="getObjectByIds" resultType="dynamicSqlObject" >SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `id` IN<foreach collection="ids" item="id" separator="," open="(" close=")" >#{id}</foreach>
</select>

结果如图:
传递的参数值为 {20230830,20230832} ,则生成的 SQL 语句为

SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `id` IN(20230830,20230832)

在这里插入图片描述

set 标签用在更新的操作上,在 SQL 语句中动态生成多个 SET 子句。在 set 标签内使用多个 if 标签来判断哪些属性需要更新或不做处理。
在这里插入图片描述

sql 标签用于定义可重用的 SQL 片段,方便在不同的地方复用。include 标签用于将另一个映射文件中定义的 SQL 片段引入到当前映射文件中。这两个标签配合使用,可以减少重复的 SQL 代码,提高代码的可维护性和可读性。
在这里插入图片描述

bind 标签用于动态地生成 SQL 语句的绑定变量。

相关文章:

  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • C语言数据结构-排序
  • flutter + firebase 云消息通知教程 (android-安卓、ios-苹果)
  • 【爬虫软件】孔夫子二手书采集
  • Java 中的内部类的定义
  • python异常之try/else分句
  • 基于比较的排序算法总结(java实现版)
  • 175.【2023年华为OD机试真题(C卷)】API集群负载统计(遍历和条件判断实现JavaPythonC++JS)
  • 【Docker】升级docker或者docker到docker-ce完全保留镜像和容器,不影响原容器使用方法
  • 论文笔记 | Nature 2023 FunSearch:利用大语言模型在数学科学领域探索新的发现
  • 使用yarn安装electron时手动选择版本
  • docker运行java程序的Dockerfile
  • Mybatis之增删改查
  • log4j2远程代码执行漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)
  • 什么是误差,什么是重构误差,误差与重构误差有什么区别?
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [译]前端离线指南(上)
  • 【RocksDB】TransactionDB源码分析
  • 0基础学习移动端适配
  • 2017届校招提前批面试回顾
  • Apache Zeppelin在Apache Trafodion上的可视化
  • idea + plantuml 画流程图
  • JS笔记四:作用域、变量(函数)提升
  • JS变量作用域
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Logstash 参考指南(目录)
  • sublime配置文件
  • text-decoration与color属性
  • Vue 动态创建 component
  • vue总结
  • 对超线程几个不同角度的解释
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 前端自动化解决方案
  • 容器服务kubernetes弹性伸缩高级用法
  • 山寨一个 Promise
  • 算法系列——算法入门之递归分而治之思想的实现
  • 为什么要用IPython/Jupyter?
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • MPAndroidChart 教程:Y轴 YAxis
  • 阿里云API、SDK和CLI应用实践方案
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #13 yum、编译安装与sed命令的使用
  • (04)odoo视图操作
  • (1) caustics\
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (六)软件测试分工
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)linux下的时间函数使用
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转)原始图像数据和PDF中的图像数据
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET开源快速、强大、免费的电子表格组件
  • //解决validator验证插件多个name相同只验证第一的问题
  • @EnableAsync和@Async开始异步任务支持