Java框架SSM学习——持久层Mybatis之动态SQL

2023-11-11

动态SQL

为什么要用动态SQL?
如果使用JDBC或者类似Hibernate等其他框架,很多时候需要去根据需要去拼接SQL语句,这是一个很麻烦的事情。因为在某些查询中,需要多个条件,在使用其他框架的时候,需要用大量的Java代码进行判断,可读性比较差。而Mybatis不一样,其中提供了对SQL语句动态的组装能力,使用XML的几个简单的元素就可以去实现动态拼接SQL语句。对条件的判断都放在了XML配置文件中,大大减少了代码量。但因为注解的配置功能受限,在此也不对注解中配置SQL作讲解。
if元素

此元素相当于Java代码中的if语句,与test属性联合一起使用,用个示例去描述即可理解:首先有一个表是User表,我根据User表的username去寻找user,那么如果使用者并没有填入username,那么我就不用username作为查询条件。这样的动态SQL如果是要用java代码去写,就要用到判断去if——else,而在此,我是这么写的:

<select id="findUserByUsernameOrNull" parameterType="String" resultType="com.demain.User">
	select * from user where 1=1
	<if test="username != null and username != ''">
		and username like concat('%' , #{
   username} , '%')
	<if>
</select>

非常的简单易懂,test属性中存放着判断条件,如果符合则将<if></if>里的语句拼接到前面的SQL语句中,如果不符合则不拼接。

choose / when / otherwise元素

这三个元素一般都在一起使用,所以我归为一类放在一起。如果在判断条件多于两个,即三个以上的时候,在Java代码中一般会使用到switch/case/default语句,但是在Mybatis中提供了这三个元素去支持此功能。示例:首先还是在刚刚的User表中查询用户,但是我不仅仅是用username,我还得用用户的address和备注note去查询,在给查询的页面中有三个选填条件:①username②address③note。
当username不为空时则使用username去模糊查询
当username为空,address不为空时,用address去模糊查询,
当前两个条件都为空是,则要求备注note不能为空

<select id="chooseWhenOtherwiseTest" parameterType="user" resultMap="userMap">
	select * from user where 1=1
	<choose>
		<when test="username != null and username != ''">
			and username like concat('%' , #{
   username
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java框架SSM学习——持久层Mybatis之动态SQL 的相关文章

  • 将音频从 PC 传输到智能手机?

    2016 年圣诞节 我和我爸爸想用灯光和灯光为我们的社区举办一场灯光秀music We have the lights set up but the music is a problem We don t want to put huge
  • Java 可以启动 Windows UAC 吗?

    正如标题所说 我想知道用 Java 编写的程序是否可能 并且只有java 以管理员权限重新启动自己 最好是 jar 以本机 Windows UAC 的方式显示 为了使其对用户更可信 我做了功课 发现可以使用来完成此操作C 和 Java 之间
  • Motorola Android 2.2 相机忽略 EXTRA_OUTPUT 参数

    我以编程方式打开相机来拍摄视频 我告诉相机使用如下代码将视频文件放置到指定位置 Intent intent new Intent MediaStore ACTION VIDEO CAPTURE File out new File sdcar
  • 在 Volley 中更新 UI 最有效的方法是什么

    最近我在 android 中使用 Volley 库 它工作得很好 但我想知道更新 UI 的最有效方法 我有一个包含所有 Volley 方法的 Utils 类 现在我传递了所有视图将作为参数更新 但我读到我可以在活动中实现侦听器 然后将它们作
  • JavaFX 多线程 - 连接线程不会更新 UI

    我正在尝试创建一个加载程序对话框 用户可以在其中知道程序正在加载所请求的内容并且程序正在按预期运行 但正因为如此 我需要join 解析器线程和之前继续主线程 这使得对话框空白 解析器任务 java public class ParserTa
  • 如何在 selenium webdriver 中将网络浏览器从 Firefox 更改为 Chrome/Opera/IE/Safari?

    如何将浏览器从 firefox 更改为在 selenium webdriver 中工作的 Chrome Opera IE 请指导步骤以及代码片段 如果您对上述任何浏览器有答案 请回复 我读了很多这方面的内容 但无法正确链接 首先 您需要将正
  • 如何统计List中某个元素出现的次数

    我有一个ArrayList Java的Collection类 如下 ArrayList
  • new Date() 和日历日期之间的区别

    在实践中 下面两个日期有什么区别 Date date new Date Date date Calendar getInstance getTime 我的理解是 new Date 是基于 UTC GMT 的日期 而日历的 getTime 基
  • Java,根据 WSDL 中的嵌入模式验证 XML

    我有一个 wsdl具有嵌入架构的文件 我想使用它来验证 XML 文件 字符串 wsdl文件 与验证的方式相同 xsd 该架构位于
  • CakePHP:无法访问 MySQL 数据库

    我是 CakePHP 的新手 刚刚完成配置过程 但很困惑为什么 Cake 无法访问我的 MySQL 数据库 Cake 信息页面显示我的 tmp 目录是可写的 FileEngine 正在用于缓存 不知道这意味着什么 并且我的数据库配置文件存在
  • 快速排序应用程序中这些交换代码行的目的是什么?

    我试图理解快速排序的实现或应用程序以找到第 k 个最小元素 这是我试图理解的代码 public int quicksort int a int start int end int k if start lt end int pivot pa
  • Java中对象类的继承

    当我读java书时 我遇到了 每个类都扩展类 Object 但是如果想要 B 类扩展 A 类 但是 B 类现在将具有多重继承 一个来自 Object 类 一个来自 A 类 如何解决冲突 谁能解释一下吗 它是多级继承 而不是多重 class
  • django在服务器上同步数据库时出错

    我有一个完整运行的区域设置 django 应用程序 但我在迁移到 site5 服务器时遇到了麻烦 当我启动 django 时syncdb命令 我所有模型的表都已创建 但是然后 我猜当它创建关系表时 我收到以下错误 mysql excepti
  • 从字符串中删除特定字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何从字符串中删除特定字符 我有一个 Arraylist 测试数组 String line testingarray get index
  • FirebaseAuth.getInstance().signOut() 不注销

    我尝试从 firebase 注销用户 但在关闭应用程序并再次打开后 用户仍然处于连接状态 我尝试从 firebase 定期注销用户 但没有解决问题 我想知道是什么导致了这个问题 logout setOnClickListener new V
  • 在实时计算机上更新(或替换)整个数据库表的最佳方法是什么?

    我每周都会收到一个数据源 我将对其进行解析并放入数据库中 数据每周不会有太大变化 但我应该定期更新数据库 除了每周更新外 数据是静态的 目前重建整个数据库不是问题 但最终该数据库将上线 人们可以在我重建数据库时查询该数据库 数据量并不小 几
  • 在 MySQL 查询中一起使用 DISTINCT 和 COUNT

    这样的事情可能吗 SELECT DISTINCT COUNT productId WHERE keyword keyword 我想要的是获取与关键字关联的唯一产品 ID 的数量 同一产品可能与一个关键字关联两次或多次 但我希望每个产品 ID
  • Django MySQL 创建表时出错

    我有一个类似的问题这张票 https code djangoproject com ticket 18256在 Django 论坛上提出 我该如何解决这个问题 我还扩展了一个用户模型 如下所示 class Profile models Mo
  • a.equals(a) 什么时候返回 false?

    我想知道在哪些情况下java中的变量不能相等 使用equals 方法 自身 我这里说的不是对象而是变量本身 只要代码编译并在调用 equals 时返回 false 到目前为止 我发现的唯一情况是 public class A public
  • Spring Boot 应用程序崩溃

    请告诉我哪里有问题 我尝试启动我的第一个在 Spring Boot 上开发的应用程序 我已经在 SpringMVC 上有了简单的 Web 项目 现在我喜欢在 BOOT 上构建它 这是错误输出 org springframework bean

随机推荐

  • Databend 设计概述

    Databend 是一个开源的 完全面向云架构的新式数仓 它提供快速的弹性扩展能力 并结合云的弹性 简单性和低成本 使 Data Cloud 构建变得更加容易 Databend 把数据存储在像 AWS S3 Azure Blob 这些云上的
  • JDBC连接数据库的几种方法与简单解析

    首先要知道jdbc 使用Java代码发送sql语句的技术就是jdbc技术 即jdbc是一个接口 用于不同的数据库 oracle mysql sqlserver 的操作 使用jdbc发送sql语句的前提 登录数据库服务器 连接数据库服务器 数
  • windows杀死进程命令

    有时候由于病毒或其他原因 启动了一系列的进程 并且有时杀了这个 又多了那个 这时候我们可以特定选择一种杀 很多人对windows杀死进程命令比较感兴趣 所以今天小编就为大家来详细讲一讲windows命令行关闭进程教程 感兴趣的用户一起来看看
  • LNK2001无法解析的外部符号 _vfprintf

    legacy stdio definitions lib
  • 感动了千千万万人们的西单女孩

    任月丽出生在河北涿州偏僻的农村 由于父母多病 自小由奶奶带大 为了减轻家庭负担 年仅16岁的她孤身一人来到北京 开始在一小餐馆打工 满1个月后老板没给工资 流浪街头时看到有地下歌手在卖唱 从小就喜欢唱歌的她萌生了也要唱歌的想法 遂与一流浪歌
  • 步步为营--深入研究react技术栈 系列一 (jsx、组件、数据流)

    相关技术博客 1 步步为营 深入研究react技术栈 系列一 jsx 组件 数据流 2 步步为营 深入研究react技术栈 系列二 事件 组件性能优化 更多系列文章持续更新中 一 React简介 React 是一个用于构建用户界面的 Jav
  • python出现indexerror,Python:IndexError:列表索引超出范围错误

    Updated look bottom I am stuck I get a IndexError list index out of range Error def makeInverseIndex strlist numStrList
  • 常用4线风扇接口定义

    4根线分别是GND VCC FG PWM 位置可能不同 FG是转速信号 用于CPU侦测转速 转速 频率 30 4极风扇 PWM通过方波占空比控制转速 PWM接地 最低转速 PWM不接最高转速 频率25KHZ 一般Duty 0 20 转速是相
  • 图灵赠书——程序员11月书单

    10月书讯中奖名单 wudalang gd 精通Git 第2版 chszs CCNA学习指南 路由和交换认证 第2版 sujun10 同构JavaScript应用开发 dongfeng9ge 学习JavaScript数据结构与算法 第2版
  • 目标检测基础

    什么是目标检测 简单来说就是 检测图片中物体所在的位置 本文只介绍用深度学习的方法进行目标检测 同过举出几个特性来帮助各位理解目标检测任务 同时建议学习目标检测应先具备物体人工智能算法基础和物体分类现实基础 特性1 Bounding Box
  • 解决华为手机不能用USB链接电脑的问题

    可能是由于USB空松动 所以总是安装不完驱动程序 USB调试开关自动关闭 导致安装不完驱动程序 手机的USB调试开关就关闭了 可以这样解决 以下为花粉俱乐部转载 我们经常这样的事情 打开USB调试之后 本来用得好好的 点了下USB连接选项
  • VS 静态库lib如何依赖动态库dll

    一般来说 vs可以提供正常的依赖输入窗口用于依赖动态库 但是当工程设置生成静态库之后 VS默认不支持给静态库增加依赖动态库 链接器选项没有了 此时只能够把静态库所依赖的动态库也改成静态库 这样这个静态库才能被正常编译 否则编译的时候会报错
  • golang并发编程基础

    go并发编程 1waitgroup WaitGroup就是等待所有的goroutine全部执行完毕 add方式和Down方法要配套使用 package main import fmt sync func main var wq sync W
  • 【STM32技巧】HX711称重芯片详细说明

    概述 HX711 模块 A 通道带有 128 倍信号增益 可以将 5mV 的电压放大 128 倍 然后采样输 出 24bit AD 转换的值 单片机通过指定时序将 24bit 数据读出 如何计算传感器供电电压 HX711 可以在产生 VAV
  • PAT_B_1094 谷歌的招聘 (20 分)【测试点3,5】

    本题要求你编程解决一个更通用的问题 从任一给定的长度为 L 的数字中 找出最早出现的 K 位连续数字所组成的素数 输入格式 输入在第一行给出 2 个正整数 分别是 L 不超过 1000 的正整数 为数字长度 和 K 小于 10 的正整数 接
  • [HarekazeCTF2019]encode_and_encode

    HarekazeCTF2019 encode and encode 打开环境 得到源码
  • python+postgresql+psycopg2实现自动化数据库生成(数据库迁移)

    python pgsql psycopg2实现一键数据库生成 1 tips Navcat转储sql文件 存在主键自增 加入下面代码 CREATE SEQUENCE IF NOT EXISTS t 表名 id seq START 1000 手
  • FastDfs在NET下的使用

    FastDfs是一个开源的轻量级分布式文件系统 其原理可以查看http blog chinaunix net uid 20196318 id 4058561 html 然后部署安装部分可参考http blog csdn net poecha
  • codeblocks安装常见问题和版本区别

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 目前codeblocks有4个版本8 02 10 05 12 11 13 12 之前一直在用10 05的版本 很好用的 后来在做gtk是出现版本不匹配问题 就换了13 12
  • Java框架SSM学习——持久层Mybatis之动态SQL

    动态SQL 为什么要用动态SQL 如果使用JDBC或者类似Hibernate等其他框架 很多时候需要去根据需要去拼接SQL语句 这是一个很麻烦的事情 因为在某些查询中 需要多个条件 在使用其他框架的时候 需要用大量的Java代码进行判断 可