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

Mybatis学习(下)

目录

1. 动态sql的应用

1.2

1.2

1.3  、 、 标签

1.4


1. 动态sql的应用

使用Mybatis框架时, 对于sql数据的操作量比较大的时候, 看着会觉得很乱, 可能写着写着就乱了, 或者说回过头来发现sql语句写错了, 很麻烦, 所以动态sql就可以让我们用Java代码, 替换部分sql语句

1.2 <if>

<select id="findUserByNameAndAge" resultType="User">SELECT * FROM usersWHERE 1 = 1<if test="name != null and name != ''">AND name = #{name}</if><if test="age != null">AND age = #{age}</if>
</select>

当 name 不为空字符串且不为 null 时,会在 SQL 语句中添加 AND name = #{name};当 age 不为 null 时,会添加 AND age = #{age}

所以当第一个if语句成立时, 完整的sql语句是这样的:

SELECT * FROM users
    WHERE 1 = 1 AND name = #{name}

 当两个if语句都成立时, 完整的sql语句是这样的:

SELECT * FROM users
    WHERE 1 = 1 AND name = #{name} AND age = #{age}

 那么为什么要加一个 1 = 1 并且每一个if语句后面要加一个AND吗?思考一下

如果两个if语句同时成立,那么个一个if语句就不需要AND,第二个if语句需要AND连接, 如果个if语句不成立,第二个if语句成立呢, 那就意味着不需要AND, 这就与前者相矛盾

既然如此, 当sql语句涉及到多个判断条件时, 可以在where后面, 加一个永远正确的判断, 这样就可以很好的解决矛盾

1.2 <where>

既然前面说到了if语句和where关键词有冲突, 那么当然会有一个where语句解决冲突, where语句会自动处理第一个AND,OR, 这很好的解决了前面的问题, 使得代码完全和不使用动态sql一致.

<select id="findUserByNameAndAge" resultType="User">SELECT * FROM users<where><if test="name != null and name != ''">name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>

可以看到, 第一个判断语句没有了AND, 并且省去了1=1 恒正确式

1.3 <choose>、<when>、<otherwise> 标签

这三个标签组合使用,类似于 Java 中的 switch - case - default 语句,会从多个条件中选择一个满足的条件执行。

<select id="findUserByCondition" resultType="User">SELECT * FROM usersWHERE 1 = 1<choose><when test="name != null and name != ''">AND name = #{name}</when><when test="age != null">AND age = #{age}</when><otherwise>AND status = 'active'</otherwise></choose>
</select>

otherwise可以当作default,  这些标签了解即可,尽量用简单的方式表达

无论是大厂还是小厂,都力求简洁, 完美主义不可取, 在你看来花了很多时间完善的一些业务的bug, 觉得甲方的功能, 页面不好看, 就自己改, 在别人看来就是无用功, 而且还会影响项目进度

1.4 <set>

<set> 标签用于动态更新 SQL 语句中的 SET 子句,会自动处理多余的逗号

<update id="updateUser" parameterType="User">UPDATE users<set><if test="name != null and name != ''">name = #{name},</if><if test="age != null">age = #{age}</if></set>WHERE id = #{id}
</update>

如果 <if> 标签中的条件都不满足,<set> 标签不会添加 SET 关键字;如果有条件满足,<set> 标签会自动添加 SET 关键字,并去掉最后一个条件后的逗号。

 这些都是常用的标签, 简单的sql语句可以直接写, 切记不要把简单复杂化

http://www.xdnf.cn/news/3824.html

相关文章:

  • LabVIEW开发风量智能监测系统
  • 【杂谈】-探索 NVIDIA Dynamo 的高性能架构
  • 牛客周赛90 C题- Tk的构造数组 题解
  • STM32智能垃圾桶:四种控制模式实战开发
  • 58认知干货:创业经验分享及企业形式的汇总
  • 【AI面试准备】逻辑思维、严谨性、总结能力、沟通协作、适应力与目标导向
  • 文件一键解密软件工具(支持pdf、word、excel、ppt、rar、zip格式文件)
  • 链接文件及功能安全:英飞凌官方文档摘录 - Tasking链接文件
  • 开上“Python跑的车”——自动驾驶数据可视化的落地之道
  • 使用python写多文件#inlcude
  • Spring AI Advisors API:AI交互的灵活增强利器
  • ES6入门---第三单元 模块三:async、await
  • 网络:TCP三次握手、四次挥手
  • 介词:连接名词与句子其他成分的桥梁
  • 互联网大厂Java面试:从基础到实战
  • 【漫话机器学习系列】239.训练错误率(Training Error Rate)
  • vulkanscenegraph显示倾斜模型(6.4)-多线程下的记录与提交
  • Dalvik虚拟机和ART虚拟机
  • ART 下 Dex 加载流程源码分析 和 通用脱壳点
  • 【ArcGIS微课1000例】0145:如何按照自定义形状裁剪数据框?
  • 学习黑客Linux权限
  • 【中间件】brpc_基础_用户态线程中断
  • LeetCode每日一题5.4
  • 架构思维:利用全量缓存架构构建毫秒级的读服务
  • 2001-2023年 上市公司-企业广告支出数据-社科数据
  • 使用宝塔面板、青龙面板实现定时推送功能
  • 【数据结构】稀疏矩阵的快速转置
  • 单细胞测序数据分析试验设计赏析(二)
  • Android 输入控件事件使用示例
  • 信息系统监理师第二版教材模拟题第一组(含解析)