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

简化mybatis @Select IN条件的编写

最近从JPA切换到Mybatis,使用无XML配置,@Select注解直接写到interface上,发现IN条件的编写相当麻烦。

一般得写成这样:

@Select({"<script>","SELECT *", "FROM blog","WHERE id IN", "<foreach item='item' index='index' collection='list'","open='(' separator=',' close=')'>","#{item}","</foreach>","</script>"}) 
List<Blog> selectBlogs(@Param("list") int[] ids);

写的看起来很别扭,原来JPA+Hibernate写HQL就不用额外处理。想着找一下解决方案,一搜确实也有人有同样的痛点。

原来我写的是这样的:

    @Select("select distinct(USER_ID) from SYS_LOGIN_LOG " +"where USER_ID IN (#{userIds}) " +"and TENANT_ID = #{tenantId} " +"and CREATE_TIME between #{startTime} and #{endTime}")List<Long> selectInTimeRange(@Param("userIds") long[] userIds, @Param("tenantId") long tenantId,@Param("startTime") Date startTime, @Param("endTime") Date endTime);

发现解析失败,google了一下,通过增加一个语法处理器就解决了。

在Mapper基类添加这样的处理器

public interface CcBaseMapper<T> extends BaseMapper<T> {/*** 解决mybatis in条件写得难看的问题*/class InConditionDriver extends XMLLanguageDriverimplements LanguageDriver {private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)");public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) {Matcher matcher = inPattern.matcher(script);if (matcher.find()) {script = matcher.replaceAll("(<foreach collection=\"$1\" item=\"__item\" separator=\",\" >#{__item}</foreach>)");}script = "<script>" + script + "</script>";return super.createSqlSource(configuration, script, parameterType);}}

然后添加这个处理器即可:

    @Lang(InConditionDriver.class)@Select("select distinct(USER_ID) from SYS_LOGIN_LOG " +"where USER_ID IN (#{userIds}) " +"and TENANT_ID = #{tenantId} " +"and CREATE_TIME between #{startTime} and #{endTime}")List<Long> selectInTimeRange(@Param("userIds") long[] userIds, @Param("tenantId") long tenantId,@Param("startTime") Date startTime, @Param("endTime") Date endTime);

这样就不报错了。搞掂

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android monkey命令和monkey脚本详解
  • vim gcc
  • 【MQTT协议与IoT通信】MQTT协议的使用和管理
  • 追问试面试系列:开篇
  • HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(九)
  • 【React】useState:状态管理的基石
  • 【BUG】已解决:ERROR: No matching distribution found for PIL
  • 《GPT-4o mini:开启开发与创新的新纪元》
  • Python酷库之旅-第三方库Pandas(050)
  • 数据传输安全--SSL VPN
  • 音视频入门基础:PCM专题(3)——使用Audacity工具分析PCM音频文件
  • 微信小程序 async-validator 表单验证 第三方包
  • MySQL第一阶段:多表查询、事务
  • 系留无人机在技术上有哪些优势或创新点
  • 华为高教校园网络解决方案 方案规划
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • C语言笔记(第一章:C语言编程)
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6 ...操作符
  • ES6系统学习----从Apollo Client看解构赋值
  • exports和module.exports
  • HTTP 简介
  • Lsb图片隐写
  • node学习系列之简单文件上传
  • React-redux的原理以及使用
  • 阿里研究院入选中国企业智库系统影响力榜
  • 安装python包到指定虚拟环境
  • 前端性能优化--懒加载和预加载
  • 数据仓库的几种建模方法
  • kubernetes资源对象--ingress
  • Mac 上flink的安装与启动
  • 积累各种好的链接
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #### go map 底层结构 ####
  • #QT(TCP网络编程-服务端)
  • (02)Unity使用在线AI大模型(调用Python)
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (js)循环条件满足时终止循环
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (排序详解之 堆排序)
  • (十七)Flink 容错机制
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET CLR Hosting 简介
  • .net core Redis 使用有序集合实现延迟队列