Mybatis中where 1=1 浅析

这篇具有很好参考价值的文章主要介绍了Mybatis中where 1=1 浅析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在一些集成mybatis的工程中经常看到where1=1 的代码,也有同事问我,这样写有什么用,下面对其进行简单的分析记录一下。

1、场景

看下面这样一段xml中的代码

<select id="queryBook" parameterType="com.platform.entity.Book" resultType="java.lang.Integer">
 select count(id) from t_book t where 1=1
<if test="title !=null and title !='' ">
 AND title = #{title} 
</if> 
<if test="author !=null and author !='' ">
 AND author = #{author}
</if> 
</select>

上面的代码很简单,就是查询符合条件的总条数,在mybatis中常用到if标签判断where子句后的条件,为防止首字段为空导致sql报错。没错 ,当遇到多个查询条件,使用where 1=1 可以很方便的解决我们条件为空的问题,那么这么写有什么问题吗 ?
有人说会不会导致索引失效,那么下面来实测一下,会不会不走索引。

2、测试

title字段 已经加上索引,我们通过EXPLAIN看下

EXPLAIN SELECT * FROM t_book WHERE  title = '且在人间';
EXPLAIN SELECT * FROM t_book WHERE 1=1 AND title = '且在人间';

Mybatis中where 1=1 浅析,Mybatis,mybatis

对比上面两条sql的执行结果会发现,结果一样,possible_keys(可能使用的索引) 和 key(实际使用的索引)都使用到了title字段的索引进行检索 。

3、分析

where 1=1也会走索引,不影响查询效率,写的sql指令会被mysql进行解析优化成自己的处理指令,在这个过程中1=1这类无意义的条件将会被优化。
使用explain sql进行校对,发现确实where1=1这类条件会被mysql的优化器所优化掉。
那么我们在mybatis当中可以改变一下写法,因为毕竟mysql优化器也是需要时间的,虽然是走了索引,但是当数据量很大时,还是会有影响的,所以我们建议代码这样写,使用where标签代替where 1=1:文章来源地址https://www.toymoban.com/news/detail-622013.html

<select id="queryBook" parameterType="com.ths.platform.entity.Book" resultType="java.lang.Integer">
 select count(*) from t_book t
<where>
<if test="title !=null and title !='' ">
 title = #{title} 
</if>
<if test="author !=null and author !='' "> 
 AND author = #{author}
</if>
</where> 
</select>

到了这里,关于Mybatis中where 1=1 浅析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • mybatis之动态sql、if\choose\when\otherwise\trim\where\set\foreach\bind有案例

    定义 :根据不同条件拼接SQLy语句,实现对数据库更准的操作。 实现方式 :映射器配置文件或者注解 常用动态SQL元素 : if元素 :判断语句,但条件分支判断 choose元素 :when、otherwise;多条件分支判断,等同于Java中的switch trim元素 :where,set;辅助元素,用于处理一些SQL拼接

    2024年02月02日
    浏览(38)
  • 【MyBatis 学习一】认识MyBatis && 第一个MyBatis查询

    目录 一、认识MyBatis 1、MyBatis是什么? 2、为什么要学习MyBatis? 二、配置MyBatis环境 1、建库与建表 2、创建新项目  3、xml文件配置 (1)配置数据库连接 (2)配置 MyBatis 中的 XML 路径 三、测试:第一个MyBatis查询 1、用户实体类User:和数据库属性对应 2、添加mapper接口 3、添加

    2024年02月15日
    浏览(52)
  • 认识 MyBatis + MyBatis如何使用 (MyBatis操作数据库)

    本篇介绍了什么是MyBatis,MyBatis的前期配置,MyBatis操作数据库的两种方式:.xml文件 / 注释,使用MyBatis的一些注意,如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 MyBatis(ORM: 对象关系映射框架): 一个持久层框架,也是一个工具实现程序与数据库交互,

    2024年02月14日
    浏览(58)
  • Mybatis | 初识Mybatis

    作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习! 该文章 参考学习教材 为: 《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著 文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和

    2024年02月21日
    浏览(42)
  • 【Mybatis】Mybatis架构简介

    MyBatis 分为三层架构,分别是基础支撑层、核心处理层和接口层,如下图所示: typeAliase 标签的别名机制,由基础支撑层中的类型转换模块实现的; JDBC 类型与 Java 类型之间的相互转换,绑定实参、映射 ResultSet 场景中都有所体现: 在 SQL 模板绑定用户传入实参的场景中,类型

    2024年02月15日
    浏览(39)
  • MyBatis——MyBatis插件原理

    本博文主要介绍MyBatis插件机原理,帮助大家更好的理解和学习MyBatis。 MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包括: Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 拦截执行器的

    2024年02月10日
    浏览(44)
  • 【MyBatis八股】MyBatis面试题

    Mybatis是一个 半 ORM(对象关系映射)框架 ,它内部封装了JDBC,加载驱动、创建连接、创建 statement 等繁杂的过程,开发者开发时只需要关注如何编写 SQL 语句,可以严格控制 SQL 执行性能,灵活度高。 作为一个半 ORM 框架,MyBatis 可以使用 XML 或注解 来配置和映射原生信息,将

    2024年02月12日
    浏览(37)
  • MyBatis第六讲:MyBatis缓存

    MyBatis 提供了一级缓存和二级缓存的支持。默认情况下,MyBatis 只开启一级缓存。 8、1MyBatis一级缓存 一级缓存是基于MyBatis自带的 HashMap 本地缓存,作用范围为 SqlSession 域内。当刷新或者关闭之后,该 SqlSession 中所有的缓存就会被清空。 在参数和 SQL 完全一样的情况下,我们使

    2024年02月11日
    浏览(49)
  • Mybatis学习笔记1 Mybatis入门

    差不多根据mybatis中文文档:创建第一个mybatismaven项目,将它跑起来 入门_MyBatis中文网 新建库 建表 创建项目 重启之后 配置下Maven与encoding  成习惯了 新建模块 注意:这个GroupId和ArtifactId  version是之后,你用Maven install时候后存放的包路径和包名 目录结构:虽然换了JDK17但是编译器版

    2024年02月07日
    浏览(38)
  • Mybatis学习|第一个Mybatis程序

    在pom.xml中导入本次测试用到的三个依赖,mysql驱动、mybatis依赖、以及单元测试junit依赖  将这个 空的maven项目当成一个父项目,再创建一个空的maven子项目用来测试 这个代码可在mybatis官方文档找到,对应红色部分需要自己将信息补充完整,也就是之前jdbc连接数据库的那些东

    2024年02月11日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包