关于Mybatis中SQL的一些小坑

直接一直用原生JDBC最烦的一点就是各种getset对象的值,Mybatis这点最好全都映射了不需要写那种重复的玩意。

mybatis的值基本都是#{XX}防止sql注入,不过这玩意在用IN写sql的时候有个小坑要注意比如:

SELECT  id,orderid,sku,sizecode,width,height,quantity,remark,smalladdress FROM
        orderdetail WHERE orderid IN (#{deliveryid}) ORDER BY orderid asc这里只会查出来一条数据已经值编译后其实是WHERE orderid IN (‘#{deliveryid}’)如果是数据1,3,5会变成‘1,3,5’和本身的想法完全不一样了查出来会漏数据所以这里应该改成${deliveryid}不过这样会有被注入的风险,所以再前面把数据处理好。

还有一种写法SELECT id,orderid,sku,sizecode,width,height,quantity,remark,smalladdress FROM orderdetail WHERE orderid IN(SELECT id FROM neworder WHERE deliveryid=#{deliveryid})

这样因为是一个整体的SQL而且第一个查询出来是数组而不是字符串mysql会自己帮你转数据一切正常,但是如果第一个查出来是字符串那也是会漏数据的也就是‘1,3,5’这种情况

这种可以用FIND_IN_SET(字段,值)来解决不过性能很差非必要不使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值