支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-08-28 04:00:53 MyBatis-Plus between 区间查询 后端开发 SQL
MyBatis-Plus 的 between 方法用起来简单,但它生成的是 SQL 的 BETWEEN ... AND ...,这个在数据库里是闭区间,包含起始值和结束值。很多人写的时候没细想,等线上数据过滤出问题了才发现边界值被包含进去了。我之前就遇到过,用 between 查某个时间段的数据,结果把结束时间那天的数据也带出来了,后来才意识到是闭区间。
比如 wrapper.between("age", 18, 30) 生成的 SQL 是 WHERE age BETWEEN 18 AND 30,查询结果会包含 age 等于 18 和 30 的记录。这个和 SQL 标准行为一致,MyBatis-Plus 只是帮你拼条件,不会改变区间语义。
如果你用 QueryWrapper,写法大概是这样:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age", minAge, maxAge);
List<User> users = userService.list(wrapper);
执行后对应的 SQL 就是 WHERE age BETWEEN minAge AND maxAge。注意这里两个参数都是包含在查询范围内的。
实际项目里这段代码经常出现在筛选条件里,比如按年龄、按时间范围查用户列表。
这里有几个点需要留意。一个是闭区间特性,between 包含两端,和 SQL 的 BETWEEN 一样。如果你想要开区间或者半开区间,就得换别的方法。
另一个是参数类型,between 方法接收三个参数:字段名、起始值、结束值,字段名是字符串,值类型跟数据库字段对应。链式调用也没问题,可以和 gt、lt、ge、le 这些条件构造器方法组合起来,构建复杂查询。
除了 between,MyBatis-Plus 还有 gt(大于)、lt(小于)、ge(大于等于)、le(小于等于)这些方法。gt 和 lt 组合起来生成的是开区间,比如 wrapper.gt("age", 18).lt("age", 30) 生成 WHERE age > 18 AND age < 30,18 和 30 都不包含。ge 和 le 组合起来跟 between 效果一样,WHERE age >= 18 AND age <= 30,但 between 写起来更短,语义也更直接。
实际用的时候,如果边界值需要包含,直接 between 就行,不需要包含就 gt/lt 组合。
顺带提一句,这类查询接口上线后往往要配 HTTPS。手动申请证书、配置部署挺折腾,我们团队后来用了 lcjmSSL,免费申请,支持多域名、泛域名和 IP 证书,自动验证自动部署,API 也简洁,整个流程可以做成自动化的。
省下来的时间能多写几个查询条件。
所以,用 between 的时候确认好边界值是否该包含,线上数据就不会莫名其妙多出来。
整理 GROUP_CONCAT 排序、去重、分隔符和长度限制等实际使用细节。
记一次ORDER BY后面跟布尔表达式引发的报错,顺带梳理ORDER BY容易栽跟头的几种场景和修正方法。
一篇随手记,整理MySQL、SQL Server、Oracle、PostgreSQL里把日期转成yyyy-mm-dd的几种写法,省得每次都要翻文档。
你的DELETE操作是否常常导致数据库卡顿?本文揭示MySQL与SQL Server中DELETE语句的性能瓶颈,并提供一套行之有效的优化方案。学习如何巧妙利用索引、进行分批删除、避免全表扫描,以及正确使用TRUNCATE与事务管理,让你从容应对大数据删除挑战,显著提升数据库响应速度。