通过阅读本文你可以更好的理解两个知识点:

1.#{}与${}在实际项目中的使用,避免在项目中使用不当造成不可预知的Bug;

2.MySQL中in里面如果是字符串的话,为什么只取第一个对应的数据,eg: in (“5,6,7”);

------------------------------------------------------------------------------------------------------------

快过年了,项目决定年后上线,在修Bug阶段,在Bug解决后开始当水手划水了,然后复习了下MyBatis的动态SQL的知识,无意中看到一个大佬写的代码,发现和我们平常写的方式有点不同,觉得这样写会产生问题,于是乎开启了思考。正常情况下,我们在用in的时候,参数都用List或者一个Vo对象(里面有一个List),然后用foreach的方式循环取值,但是这个大佬居然in里面是String类型的参数,这样写能查出值吗?

通常的写法:

注:stockInBands是vo对象中的一个List类型的属性。

质疑大佬的写法:

这个String类型的orgIds取值过程如下:

使用了StringUtils.join()的方法将List转为逗号隔开的String类型,我开始了思考,这样的话最后这个String不是变成了类似(“5,6,7”)这样的格式吗?MySQL中in(“5,6,7”)这样的格式可以查出来吗?然后我就开始在数据库中写SQL语句尝试,发现了一个奇怪的现象,这样的格式可以查出来,但是永远只能查出第一条数据,在例子中就是id为5对应的数据,后面的6,7为啥查不出来?

表数据如下:

发现这五条SQL都能查出数据,但是前三条SQL能查出3条数据,而后两条SQL都只能查询出id为5对应的数据。

我开始百度查阅相关知识点,发现在MySQL中in里面如果是字符串的话,会自动使用类似CAST('5,6,7' AS INT)方法转化成int类型,对于数字开头的字符串来说,转为数字的结果就是截取前面的数字部分(本例中第一个逗号前的数据),对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了,如下图实例。

这个疑惑解决后,我想了下难道这个大佬写的真有问题,只是他和测试没发现问题吗?我又仔细看了下代码后发现这个大佬写的SQL里面用的是$而不是#,难道用$就能查询正常吗?然后我开始复习#{}与${}的区别,发现果然如此,这个大佬因为用的是$,${} 解析之后是什么就是什么,他不会当做字符串处理。假设传入参数是”Smith”会解析成:order by Smith或者in (Smith),所以并没有出现我发现的那种只会查出第一个id为5对应数据的问题。原来只是因为自己知识浅薄,造成的误解。

如过您想深入了解#{}与${}的相关知识,请查阅我博客中java基础分类中的--#{}和${}的区别是什么?  一文,谢谢。

MySQL中in('5,6,7')只取第一个id为5对应的数据的思考的更多相关文章

  1. 转:深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里, (不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQL ...

  2. 深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用 ContentProvider时可以使用子查询),主要方法是用SQL ...

  3. mysql中删除重复记录,只保留一条

    表结构如下: mysql> desc test1; +--------------+------------------+------+-----+---------+------------- ...

  4. mysql中的多行查询结果合并成一个

    SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND md.mimetype_id= 5 ...

  5. 写一个python 爬虫爬取百度电影并存入mysql中

    目标是利用python爬取百度搜索的电影 在类型 地区 年代各个标签下 电影的名字 评分 和图片连接 以及 电影连接 首先我们先在mysql中建表 create table liubo4( id in ...

  6. MySql 中游标,事务,终止存储过程方法总结

    最近在项目开发中,有段逻辑处理,需要在网站,app,后台分别运行,这样给后期的维护带来了很大的不方便,容易遗漏app端或者后台,所以讲java代码转换成存储过程,把逻辑处理写在了mysql端,其中遇到 ...

  7. MySQL学习笔记:floor、round —— 取整

    在MySQL中做数值处理,需要取整或者四舍五入. floor:函数只返回整数部分,小数部分舍弃: round:函数四舍五入: END 2018-05-29 11:31:22

  8. 在MySQL中实现Rank高级排名函数【转】

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

  9. 在MySQL中实现Rank高级排名函数

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

随机推荐

  1. 3、pytorch实现最基础的MLP网络

    %matplotlib inline import numpy as np import torch from torch import nn import matplotlib.pyplot as ...

  2. sklearn决策树应用及可视化

    from sklearn import datasets from sklearn.tree import DecisionTreeClassifier 1.载入iris数据集(from sklear ...

  3. sqli-labs less13-20(各种post型头部注入)

    less-13 POST型双查询注入 less-14 POST型双查询注入 less-15 POST型布尔注入 less-16 POST型布尔注入 less-17 POST型报错注入(updatexm ...

  4. sqlplus、lsnrctl命令工具不可用(libclntsh.so.11.1)

    原因: libclntsh.so.11.1文件丢失了 解决方法: 在其他机器把这个文件拷贝到目标库安装目录底下的lib目录即可

  5. mysql难题收录

    1.计算相邻两行的年龄的差距 表中的数据如下 select (s.age-(select age from stu where id - s.id = 1)) from stu as s; selec ...

  6. 记一次HBase的NotServingRegionException问题

    1. 问题 在hbase测试集群上,访问一些hbase表,均报类似下面的错误:region不可用 Wed Oct 28 14:00:56 CST 2020, RpcRetryingCaller{glo ...

  7. Python制作塔防小游戏

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块.

  8. JDK、JRE、JVM,是什么关系?

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

  9. 【整理】互联网服务端技术体系:高性能之并发(Java)

    分而合之,并行不悖. 综述入口见:"互联网应用服务端的常用技术思想与机制纲要" 引子 并发,就是在同一时间段内有多个任务同时进行着.这些任务或者互不影响互不干扰,或者共同协作来完成 ...

  10. CentOS7 实战源码部署nginx网站服务器

    简介:实战演练nginx网站服务器的搭建 nginx 简介: Nginx是一款高性能的 HTTP 和反向代理服务器   Nginx的优点: 1.高并发量:根据官方给出的数据,能够支持高达 50,000 ...