select...in在mybatis里使用(巨坑!!)

情景:最近遇到了一个bug:在这里插入图片描述
在DAO层里的这个sql语句,传入的参数没问题,在mysql里面查询也查询到了数据,为什么在dao层执行的时候查到数据不完整甚至没有呢?

主要原因:
Mybatis 在 处理#{}时,#{}传入参数是以字符串传 入 , 会将SQL 中的#{}替 换 为 ? 号 , 调 用 PreparedStatement 的 set 方法来赋值。
Mybatis 在 处理${}时是原值传入 ,就 是把{} 替换 成变量的 值,相当于 JDBC 中的 Statement 编译变量替换 后 ; #{} 对应的变量自动加上单引号 ‘’ ; 变量替换后, ${} 对应 的变量不会加上单引号 ‘’。
也就是说,如果按#{}的话,传入的参数classIds为"210901,210900,210899,210898,210897",再加上单引号,我们只能使用到第一个参数!也就是变成了select in 210901,而不是select in 210901,210900...

关于#{},${}:
where name in ('Jana','Tom');

我们可以在sql中直接写 name in ('Jana','Tom') 或者 name in (${names}) (备注:String names = " ‘Jana’, ‘Tom’ ";
(使用$时会引起sql注入安全问题)
但是我们无法在sql中直接写 name in (#{names});
会报参数个数错误,因为’Jana’,'Tom’会被解析成两个传参
String[] names={"Jana","Tom"};

解决方式
一, 使用${}
不过有注入风险
二,在select注解中。利用<foreach></foreach>标签来遍历数组中的元素,在放入in()中。这个时候,我们传入的参数需要是List形式,而不是String。
要在@Select注解里面使用in查询需要有特定的语法和规则,有点类似XML的写法

@Select({"<script>"," select "," ah.id homeworkId, ah.homeworkTitle, ah.homeworkType, ah.grade, ah.createTime "," from hw_activityhomework_tab ah "," inner join hw_classhomework_tab ch on ah.id = ch.acthomeworkid "," where ch.classId in "," <foreach collection='classIds' item='classId' open='(' separator=',' close=')'> "," #{classId} "," </foreach> "," and ah.homeworkType in "," <foreach collection='typeStrs' item='typeStr' open='(' separator=',' close=')'> "," #{typeStr} "," </foreach> "," group by ah.id "," order by ah.homeworkType desc, ah.createTime desc "," </script>"})List<HomeworkAndScoreDTO> getOcHomeworkAndScore(@Param("classIds") String[] classIds, @Param("typeStrs")String[] typeStrs);
  • 要有<script>标签
  • open='(' separator=','中,‘(’ 和 separator中间要有空格,否则会报错
    三,在xml中写(参考下面的图)
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/633445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 基本定时器反转LED

引脚是什么为什么要初始化引脚&#xff1f; 在嵌入式系统中&#xff0c;引脚是微控制器或微处理器上的物理引脚&#xff0c;用于连接外部设备、传感器或其他芯片。每个引脚都有特定的功能和用途&#xff0c;例如输入、输出、模拟输入、电源供应等。STM32F103C8T6引脚图&#xf…

2018年认证杯SPSSPRO杯数学建模B题(第二阶段)动态模糊图像全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 动态模糊图像复原 B题 动态模糊图像 原题再现&#xff1a; 人眼由于存在视觉暂留效应&#xff0c;所以看运动的物体时&#xff0c;看到的每一帧画面都包含了一段时间内 (大约 1/24 秒) 的运动过程&#xff0c;所以这帧画面事实上是模糊的。对…

C++入门学习(一)写一个helloworld

1、头文件 #include <iostream> using namespace std; 任何程序都需要这两句的&#xff0c;写上就好。 2、主文件 int main() {cout<<"Hello World!"<<endl;return 0; } 由于是int型数据&#xff0c;所以要返回一个值&#xff0c;即return0。…

JVM:垃圾回收机制(GC)

垃圾判断&#xff1a; 引用计数算法&#xff1a; 在对象中添加一个引用计数器&#xff0c;当每有一个地方引用它时&#xff0c;计数器值加一。当引用失效时&#xff0c;计数器值就减一。当一个对象的计数器为零时&#xff0c;表示该对象没有被任何其他对象引用&#xff0c;因此…

【动态规划】【数学】【C++算法】18赛车

作者推荐 视频算法专题 本文涉及知识点 动态规划 数学 LeetCode818赛车 你的赛车可以从位置 0 开始&#xff0c;并且速度为 1 &#xff0c;在一条无限长的数轴上行驶。赛车也可以向负方向行驶。赛车可以按照由加速指令 ‘A’ 和倒车指令 ‘R’ 组成的指令序列自动行驶。 当…

mycat实现mysql读写分离

一. mycat集群HaproxyKeepalived mycat集群HaproxyKeepalivedmysql1主2从 环境规划 centos7.9 1主2从&#xff0c;读写分离 名称ip端口mysql-master192.168.1.2203306mysql-slave1192.168.1.2213306mysql-slave2192.168.1.2223306mycat-1192.168.1.2218066mycat-2192.168.1.…

Redis集群搭建

为什么要有集群 之前我们已经讲了主从的概念&#xff0c;一主可以多从&#xff0c;如果同时的访问量过大(1000w),主服务肯定就会挂掉&#xff0c;数据服务就挂掉了或者发生自然灾难 大公司都会有很多的服务器(华东地区、华南地区、华中地区、华北地区、西北地区、西南地区、东…

Android Studio读写低频RFID T5557卡源码

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?id675212889085&spma1z10.5-c.w4002-21818769070.13.21166f89nKgnJ7 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xml…

【Docker】实战多阶段构建 Laravel 镜像

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 本节适用于 PHP 开发者阅读。Laravel 基于 8.x 版本&#xff0c;各个版本的文件结构可能会有差异&#xff0c;请根据实际自行修改。 准备 新…

webpack面试题学习

说说你对webpack的理解&#xff1f;解决了什么问题&#xff1f; 说说webpack的构建流程? 说说webpack中常见的Loader&#xff1f;解决了什么问题&#xff1f; 说说webpack中常见的Plugin&#xff1f;解决了什么问题&#xff1f; 说说Loader和Plugin的区别&#xff1f;编写Load…

leetcode 013二维区域和检索---矩阵不可变

给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的左上角为 (row1, col1) &#xff0c;右下角为 (row2, col2) 。 实现 NumMatrix 类&#xff1a; NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进…

Failed to connect to github.com

链接github超时 hosts文件夹下加上

Python使用HTTP代理实现网络请求的自动化

随着网络技术的发展&#xff0c;网络请求成为了许多应用的重要组成部分。然而&#xff0c;手动发送网络请求不仅效率低下&#xff0c;而且容易出错。为了解决这个问题&#xff0c;我们可以使用Python来实现网络请求的自动化。而HTTP代理可以帮助我们更好地控制和管理这些请求。…

【小笔记】时序数据分类算法最新小结

2024.1.15 最近基于时序数据训练分类算法&#xff0c;对其进行了一番了解&#xff0c;主要围绕以下几点&#xff1a; 时序数据算法有哪些细分类&#xff1f;时序数据分类算法经典模型&#xff1f;当下时序分类算法模型强baseline&#xff1f;有没有现成的工具&#xff1f; 1…

二、VTK 最简单的示例代码-创建圆柱体

今天来使用VS2019 CMake 项目 测试VTK 9.0.0 的环境是否配置好 来测试一段简单的代码 // 1.cpp: 定义应用程序的入口点。 //#include <vtkActor.h> #include <vtkCamera.h> #include <vtkCylinderSource.h> #include <vtkNamedColors.h> #include &l…

【FPGA Modsim】序列检测

实验题目&#xff1a; 序列检测器设计 实验目的&#xff1a; 掌握应用数字逻辑设计集成开发环境进行序列检测器设计的方法&#xff1b;掌握时序逻辑电路设计的过程。 实验内容&#xff1a; 1、设计一个序列检测器…

Talk|香港中文大学高瑞元:MagicDrive - 基于3D几何控制的自动驾驶街景数据生成

本期为TechBeat人工智能社区第565期线上Talk。 北京时间1月18日(周四)20:00&#xff0c;香港中文大学博士生—高瑞元的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “MagicDrive - 基于3D几何控制的自动驾驶街景数据生成”&#xff0c;介绍了他的…

湛江涡轮壳工件实物扫描三维测绘广州抄数公司造型stl转面3d打印

湛江涡轮壳上门实物三维扫描及抄数打印案例&#xff08;CASAIM中科广电&#xff09;&#xff1a; 涡轮壳三维扫描及逆向设计技术是一种基于计算机辅助设计&#xff08;CAD&#xff09;和逆向工程&#xff08;RE&#xff09;的方法&#xff0c;用于对涡轮壳进行精确的三维测量和…

基于小波多普勒变换的回波信号检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1小波变换基础 4.2 多普勒效应与多普勒变换 4.3 小波多普勒变换 4.4 回波信号检测 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %回波…

解决打开 json 文件中文乱码的问题

如下图&#xff0c;pycharm 打开是下面的样子 右下角的编码尝试了好久&#xff0c;依然打不开 用代码打开就成功了 import jsonwith open(./Mydata/garbage_classification.json,encodingutf8,moder) as f:data json.load(f) print(data)控制台结果&#xff1a;