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

Mybatis 注意传递多种参数,不一定都有参数值,用xml如何写出查询语句

Mybatis 注意传递多种参数,不一定都有参数值,用xml如何写出查询语句

有一张User表,传递name和age参数,通过mybatis的xml格式编写查询name=like“%张%”,或者age=18的学生信息,但是注意传递name和age参数,不一定都有参数值,用xml如何写出查询语句

如果希望在 nameage 都有值的情况下,实现 name 包含给定字符串 age 等于指定值的查询,可以将 AND 改为 OR,并在判断条件时加上逻辑处理。以下是改写的 XML 查询:

<select id="selectStudentByNameOrAge" resultType="User">SELECT * FROM UserWHERE 1=1<if test="name != null and name != ''">AND (name LIKE CONCAT('%', #{name}, '%')</if><if test="age != null"><if test="name != null and name != ''">OR age = #{age})</if><if test="name == null or name == ''">AND age = #{age}</if></if>
</select>

解释

  1. WHERE 1=1 起到占位作用,简化 SQL 条件的拼接。

  2. <if test="name != null and name != ''">:判断 name 是否有值。如果有,则拼接 AND (name LIKE CONCAT('%', #{name}, '%')

  3. <if test="age != null">:判断 age 是否有值。

    是否有值。

    • 如果 agename 都有值,则拼接 OR age = #{age}),实现 nameage 的条件。
    • 如果只有 age 有值(name 为空),则拼接 AND age = #{age}

这样实现后,如果 nameage 都有值,会查询满足 name 包含指定字符串 age 等于指定值的用户。

或者

<select id="selectStudentByNameOrAge" resultType="User">SELECT * FROM UserWHERE 1=1<if test="name != null and name != ''">AND (name LIKE CONCAT('%', #{name}, '%')</if><if test="age != null"><if test="name != null and name != ''">OR</if>age = #{age})</if><if test="name == null or name == ''"><if test="age != null">AND age = #{age}</if></if>
</select>

解释:

  1. 使用 OR 逻辑:如果 nameage 都有值,则 nameage 的条件会被括在一起,实现 (name LIKE '%张%' OR age = 18) 的逻辑。
  2. 分支控制:
    • 如果 name 有值,先添加 name LIKE 条件;
    • 如果 age 也有值,在 name 后面添加 OR age = #{age};
    • 如果只有 age 有值,而 name 没有值,则直接在外面添加 age = #{age} 条件
http://www.lryc.cn/news/473516.html

相关文章:

  • 【Windows】Redis 部署
  • 【经典】Vue中this指向问题??
  • Oracle数据泵(expdp)导入导出数据
  • 得物App 3D球鞋博物馆亮相两博会,打造沉浸式消费新体验
  • 深度学习中的迁移学习
  • 【深入浅出】深入浅出Bert(附面试题)
  • Docker-安装
  • 《盼归》
  • 第十九章 Vue组件之data函数
  • 【jvm】什么时候对象进入老年代
  • Vue.nextTick 使用指南:数据更新与 DOM 同步利器
  • 第三百零一节 Lucene教程 - Lucene索引文件
  • 动态规划 01背包(算法)
  • 使用常数指针作为函数参数
  • wps宏代码学习
  • libavdevice.so.58: cannot open shared object file: No such file ordirectory踩坑
  • Rust:Vec<u8> 与 [u8] 之间的转换
  • Leetcode 课程表
  • Java面试经典 150 题.P55. 跳跃游戏(009)
  • 登录的时候密码使用crypto-js加密解密
  • LLM大模型部署实战指南:部署简化流程
  • 24年10月Google Play政策更新通知
  • 玄机-应急响应- Linux入侵排查
  • 数据驱动业务中的BDS对账班牛返款表集成方案
  • 【Kubernetes实战】三、资源组件Namespace、Pod、Label、Deployment、Service概述。
  • 去中心化的模型训练
  • Arthas调试线上代码技巧
  • QT访问数据库:应用提示Driver not loaded
  • 支持ANC的头戴式蓝牙耳机,更有小金标认证,QCY H3 Pro体验
  • net framework 3.5组件更新失败错误代码0x80072f8f怎样解决