先说说我遇到的问题吧:

表student有如下数据,

我想查出来stu_id in (1,2,3)的数据

mybatis代码如下:

1
2
3
<SELECT id="queryMediaSourceInfo" parameterType="map" resultMap="BaseResultMap">
SELECT * FROM  t_student WHERE stu_id IN (#{platformType})
</SELECT>

参数为1,2,3

则结果却只查询出了stu_id为1的学员信息。。

解决方案:将代码改为

1
2
3
<SELECT id="queryMediaSourceInfo" parameterType="map" resultMap="BaseResultMap">
SELECT * FROM  t_student WHERE stu_id IN (${platformType})
</SELECT>

  将#{} 改为${}..

原因就是#{}与${}的区别:

#{}编译玩自动加双引号“” 也就是变成in (“1,2,3”)

${} 编译完是这样的  in (1,2,3) 也就是说你传入的是什么就显示什么。。。

好了问题解决了。。。

所以这个问题很隐蔽,不知道这两个区别就不容易找错,,,,郁闷了。。。

下面是我找的区别:供以后参考

http://blog.csdn.net/u013552450/article/details/72528498

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
  
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
  
3. #方式能够很大程度防止sql注入。
  
4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.
  
6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

mybatis本身的说明:

String SubstitutionBy default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:ORDER BY ${columnName}
Here MyBatis won't modify or escape the string.

NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and thereforeyou should either disallow user input in these fields, or always perform your own escapes and checks.

从上文可以看出:

1. 使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值,执行sql类似下面的:

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);

这样做的好处是:更安全,更迅速,通常也是首选做法。

而且#{}格式的sql能够预编译,能再内存中保存sql语法,不用重新组装sql语法。

2. 不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

此时MyBatis 不会修改或转义字符串。

这种方式类似于:

Statement st = conn.createStatement();ResultSet rs = st.executeQuery(sql);

MYBATIS 根据IN条件查询时,数据只查第一个的问题(字符串被截断......)相关推荐

  1. mybatis按datetime条件查询,参数为时间戳时

    mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...

  2. 详述 Elasticsearch 通过范围条件查询索引数据的方法

    文章目录 情景 查询方法 通过命令实现范围查询 通过 API 实现范围查询 情景 在使用 Elasticsearch 的时候,我们可能会遇到需要以范围为条件查询索引数据的需求.有两种方法可以实现我们的 ...

  3. 关于Mybatis中的条件查询。createCriteria example里面的条件

    之前用Mybatis框架反向的实体,还有实体里面的Example,之前只是知道Example里面放的是条件查询的方法,可是一直不知道怎么用,到今天才开始知道怎么简单的用. 在我们前台查询的时候会有许多 ...

  4. java批量执行查询sql语句_详解MyBatis直接执行SQL查询及数据批量插入

    一.直接执行SQL查询: 1.mappers文件节选 ${paramSQL} 2.DAO类节选 public interface SomeDAO{ List getInstanceModel(@Par ...

  5. SQl语句查询重复数据 只显示其中一条

    SQL查询重复数据,只显示其中一条 有重复数据主要有以下几种情况: 1.存在两条完全相同的纪录 这是最简单的一种情况,用关键字distinct就可以去掉 example: select distinc ...

  6. 【.Net】C# 将Access中时间段条件查询的数据添加到ListView中

    一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集合中添加表头中的文字. 二.利用代码给ListView添加 ...

  7. mongodb java 多条件查询_MongoDB_Java连接mongo 使用Java多条件查询mongo数据

    在mongo shell中的查询语句是这样的.. db.user.find({"age":{"$gt":5,"$lt":14}})我们用Ja ...

  8. json数据条件查询,json数据sql查询中文乱码

    json 解析  分页  条件查询 从数据库中查询出来的json数据乱码可以使用 json_extract(json字段,'$') json字段 这个是json数据的条件查询 <sql id=& ...

  9. MyBatis+Vue实现条件查询

    利用MyBatis <if test>,实现简单表格的条件查询 数据库构建字段: 前端查询项: 初始查询,first_name,last_name,create_time 1.Dao层 @ ...

最新文章

  1. 2016 多校赛3 A 水 B 期望,规律 C 各种博弈 J 物理题,积分 K 暴力,水
  2. css揭秘之linear-gradient
  3. 数组与指针的艺术--深入探索c/c++数组与指针的奥秘
  4. elementui的upload组件怎么获取上传的文本流、_抖音feed流直播间引流你还不会玩?实操讲解...
  5. python学习turtle(龟图标状态)
  6. python多进程间通信_Python 多进程编程之 进程间的通信(Queue)
  7. SQLServer2008数据库还原失败 恢复失败
  8. matlab butter 低通,matlab butter 用法
  9. tas5707php,TAS5707PHP
  10. 惊喜!轻松将word转换成pdf文档
  11. SAP中会计凭证红蓝冲相关分析测试笔记续(手工反记账红冲)
  12. 网站可行性报告范文_嵩县写可行性研究报告项目报告范文
  13. 漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?
  14. 任何一个正整数都可以用2的幂次方表示:137=2^7+2^3+2^0
  15. DameWare无法进行远程连接的处理方法
  16. win8,win10简捷快速重装系统
  17. Hash 浅谈哈希算法
  18. 服务器机箱 改造 桌面,自制电脑机箱后续 自制蓝牙音箱 桌面光污染改造 近期工程预告...
  19. 【笔记】Armv8-A 内存管理
  20. Ubuntu中安装ClamAV防病毒软件

热门文章

  1. 2017/9/26Codeforces E题
  2. cocos2d-x初探学习笔记(20)--物理引擎box2d(2)
  3. 网狐棋牌(三) 调度引擎初步分析
  4. 高可用系统设计 | 分布式限流策略:计数器算法、漏桶算法、令牌桶算法
  5. QUIC报文格式详解
  6. 阿里技术:万级规模K8s如何管理?
  7. 每秒10W次高并发订单业务,你怎么实现?
  8. Go服务迁到K8s后老抽风重启? 记一次完整的线上问题解决过程
  9. LiveVideoStackCon 2021北京站 9月再次启航!
  10. CRI陆宵吴:夯实底层,音视频技术未来不远