优化MyBatis查询条件:从Boolean类型判断到<choose>标签的进化

这篇具有很好参考价值的文章主要介绍了优化MyBatis查询条件:从Boolean类型判断到<choose>标签的进化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求背景

作为一名Java CRUD Coder,日常开发中会遇到类似的需求:通过下拉列表选择“是”或“否”来对数据库中的数据进行筛选。如果此时前端的传参是boolean类型的truefalse,后端Mapper层的代码可能会遇到需要构造类似if (param.existFlag) and table.id not in (xxxx1,xxxx2)这样的条件查询,如果你们的ORM框架使用的是MyBatis/MyBatis Plus,请看下文内容。

MyBatis参数映射

错误写法

Java中在写判断条件时,可以使用:

if(existFlag) {
    //do something
}

在MyBatis的XML中,不可以使用类似的写法:

<if test="param.existFlag">
  AND id = 1
</if>

正确写法

<if test="param.existFlag != null and param.existFlag == true">
  AND id = 1
</if>

注意事项及优化

缺陷

当我们需要在SQL中需要根据true、false、null执行不同的逻辑时,尽管MyBatis支持上述写法,但这种写法难免不太容易理解。

<select id="selectUsersByFlag" resultType="User">
    SELECT * FROM users
    <where>
        <if test="existFlag != null and existFlag == true">
            AND id = 1
        </if>
        <if test="existFlag != null and existFlag == false">
            AND id = 2
        </if>
        <if test="existFlag == null">
            -- 处理字段为null的情况,此处略
        </if>
    </where>
</select>

既然true、false都需要判断,那么这种写法就相当于:

if (existFlag) {
    // do something 1
} else if (!existFalg){
    //do something 2
} else {
    //do something 3
}

当if条件变得更多时,代码的逻辑结构显然会变得更臃肿,不易理解。那么我们需要再优化一下。

优化

在Java中,当判断条件变多时,可以使用switch语句、策略模式等方案优化,那么在MyBatis中可以使用<choose>进行优化。

MyBatis中的<choose>标签用于在多个条件中选择第一个满足条件的子句。类似于Java中的switch语句,<choose>标签可以根据不同的条件选择执行不同的SQL子句,提高SQL语句的灵活性和可读性。

以上代码可以优化为:

<select id="selectUsersByFlag" resultType="User">
  SELECT * FROM users
  <where>
    <choose>
      <when test="existFlag != null and existFlag == true">
        AND id = 1
      </when>
      <when test="existFlag != null and existFlag == false">
        AND id = 2
      </when>
      <otherwise>
        and id = 3
      </otherwise>
    </choose>
  </where>
</select>

同样,也可以使用casewhen优化:

SELECT *
FROM users
WHERE
CASE
WHEN existFlag = true THEN id = 1
WHEN existFlag = false THEN id = 2
ELSE
END

写到最后的一点想法

作为一名程序员,我们的代码首先要保证功能可用,在功能可用的前提下,要保证代码质量可读性、安全、性能等。吾日三省吾身,多思考一下代码如何能写的更好,这要求我们需要不断探索代码的最佳实践。

保持持续学习的态度,每天优化一点点,一点点改进,从而写出更加优雅、高效和安全的代码。

后续内容文章持续更新中…

近期发布。


关于我

👋🏻你好,我是Debug.c。微信公众号:种棵代码技术树 的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。

🏆在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。

📞如果您对我感兴趣,请联系我。

若有收获,就点个赞吧,喜欢原图请私信我。

优化MyBatis查询条件:从Boolean类型判断到<choose>标签的进化,思考,MySQL,mybatis文章来源地址https://www.toymoban.com/news/detail-826744.html

到了这里,关于优化MyBatis查询条件:从Boolean类型判断到<choose>标签的进化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在Mybatis中写动态sql这些标签:if、where、set、trim、foreach、choose的作用是什么,怎么用?

    在 MyBatis 中,您可以使用动态 SQL 标签来构建灵活的 SQL 查询,以根据不同的条件生成不同的查询语句。以下是这些标签的作用和用法: 1. **`if` 标签:** 用于根据某个条件动态地包含或排除 SQL 片段,test:可以写条件。    示例用法:        ```xml    select id=\\\"getUserList\\\" param

    2024年02月11日
    浏览(47)
  • Mybatis mapper.xml 判断条件写法注意

    1.判断String是否为空 if test=\\\"stringParam != null and stringParam != \\\'\\\'\\\"/if 2.判断Integer是否大于0 判断等于  when test=\\\"item.mark == 1\\\"\\\" 3.判断List是否不为空 5.判断字符串是否等于特定字符(比如此处的user)

    2024年02月16日
    浏览(73)
  • mybatis <if>标签判断“0“不生效

    原if标签写法 这种情况不生效,原因是mybatis是用OGNL表达式来解析的,在OGNL的表达式中,\\\'0’会被解析成字符(而我传入的type却是string),java是强类型的,char 和 一个string 会导致不等,所以if标签中的sql不会被解析。  解决方法 参考地址:mybatis <if>标签判断不生效_通域的博客

    2024年02月10日
    浏览(35)
  • Mybatis-puls——条件查询的三种格式+条件查询null判定+查询投影

    在mybatis_plus的封装中的WrapperT接口参数就是用于封装查询条件   在测试类中启动如上一个简单的查询,然后控制台运行会输出一大堆无关日志,这里先把这些日志关闭 先新建一个XML配置文件   然后变成如下,这里configuration标签里面什么都没有配置就是取消所有日志文件了

    2024年01月18日
    浏览(36)
  • Mybatis Plus之DQL(条件查询方式、查询投影、查询条件设定、字段映射与表名映射)

    增删改查四个操作中,查询是非常重要的也是非常复杂的操作,这块需要我们重点学习下,这节我们主要学习的内容有: 条件查询方式 查询投影 查询条件设定 字段映射与表名映射 1.1 条件查询的类 MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的

    2024年02月05日
    浏览(58)
  • Mybatis1.4 多条件查询

    我们经常会遇到如上图所示的多条件查询,将多条件查询的结果展示在下方的数据列表中。而我们做这个功能需要分析最终的SQL语句应该是什么样,思考两个问题 条件表达式 如何连接 条件字段 企业名称 和 品牌名称 需要进行模糊查询,所以条件应该是: 简单的分析后,我

    2024年02月10日
    浏览(37)
  • MyBatis-Plus条件查询问题解决

    问题描述 系统中有用户注册的功能,但是会出现重复注册的现象,代码中有做过重复校验,但是没有生效。 问题解决 首先排查数据生成时间点不同,相差时间有长有短,不是用户同时多次点击的原因,应该是用户这边不同时间重复多次注册导致的,但是程序中防止重复校验

    2024年02月16日
    浏览(46)
  • MyBatis-Plus(三.Wrapper条件查询)

    Wrapper是Mybatis-plus中特有的 条件封装接口 也就是把 查询的条件 封装到Wrapper实现类中 它的各个实现类有什么作用呢, 我觉得直接 顾名思义 吧  QueryWrapper(删,查) 因为参数一般都从前端传来的数据中得到, 所以必须用条件封装的第一个参数确认它不为null UpdateWrapper(改) LambdaQuer

    2024年02月04日
    浏览(37)
  • WordPress主题开发 — 模版循环(条件判断、多个循环、新建查询和文章循环)

            循环是 WordPress 通过主题模板文件输出文章的默认机制 。在循环中,WordPress 遍历当前页面获取到的所有文章,然后使用主题中的模版标签将其格式化并输出。 我们可以用 WordPress 循环来做很多事情,例如: 在网站首页显示多个文章模块 在文章详情页面显示内容

    2024年02月13日
    浏览(50)
  • mysql判断查询条件是否包含某字符串的7种方式

    like 也就是模糊查询 如:select * from user where user_name \\\'%李%\\\' locate 判断是否包含某字符串 如:select * from user where locate(\\\'李\\\',user_name)0 position 判断是否包含某字符串 如:select * from user where position(\\\'李\\\' in user_name)0 instr 判断是否包含某字符串 如:select * from user where instr(user_name,\\\'李\\\'

    2024年02月16日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包