jdk8stream+mybatis动态sql代替mybatis foreach in 查询
今天研究jdk8stream的时候发现Collectors.joining这个函数可以用来拼接id,替换mybatis提供的foreach标签实现in查询,老实讲写sql的时候每次弄那个foreach挺烦的,有时候已经拿到了sql拼接字符还要拆成数组扔到sql里面,深感处理数据还是java代码更方便,于是就想着用这种方式偷懒:但跑完出来的数据却只有一条:搜索了下发现了用#{} 会被解析成...
今天研究jdk8stream的时候发现Collectors.joining这个函数可以用来拼接id:
ids.stream().collect(Collectors.joining()) ,将集合元素直接拼成一个字符串;
ids.stream().collect(Collectors.joining(",")) ,将集合元素以’,‘拼起来;
ids.stream().collect(Collectors.joining(",","(",")")) ,将集合元素以’,'拼成字符串并在两端加上对应字符;
这种方式可以替换mybatis提供的foreach标签实现in查询,老实讲写sql的时候每次弄那个foreach挺烦的,有时候已经拿到了sql拼接字符还要拆成数组扔到sql里面,深感处理数据还是java代码更方便,于是就想着用这种方式偷懒:
但跑完出来的数据却只有一条:
搜索了下发现了用#{} 会被解析成:
select… id in (‘1,2’) ,而且能查出来数据且只能查到第一条,使用#{}只会被解析成一个参数占位符,但这个sql为什么能查出来还没搞懂,一脸懵逼的博主又去做了个科学实验,然后更懵逼了,溜了溜了
如果用${},参数会被完整的拼到sql里面(但这种有sql注入的风险),解析出来的sql就是我想要的:
select… id IN (1,2)
所以修改之后的代码就是:
查到的数据也是正确的:
第一次发文,有不对之处欢迎各位老哥指正
参考:
https://blog.csdn.net/qq_34371461/article/details/78784816
更多推荐
所有评论(0)