springdata && mybatis中IN关键字的传值
最近在开发一个可用优惠券列表的功能,主要就是可使用拍卖列表;可使用商品列表;大体的过程就是通过优惠券id确定一个string类型的拍卖ids或者商品ids,那获取这个之后我们的思想则是通过IN()关键字来查询对应的拍卖信息或者商品信息,select * from XX where sale_id IN(XX,XX,XX);通过这种语句会很方便的查询到想要的结果。
在springdata框架的前提下,自己第一种尝试方式则是通过一种最简单的IN(?)的方式想要实现自己的目的,但是想法很单纯,未达到自己想要的效果,本来查询了4个id到IN里边,但是出来的结果却只有一条记录,那到底该怎么解决呢?除了最简单的方式,还可以考虑拼接的方式,在springdata中,“?”只识别一个参数,如果在IN中加入一个参数的话,纵然是一个,但实际上是4个或者更多个,所以仅仅一个问号是解决不了问题的,很专一的“?”,值得学习。考虑拼接的方式,目的则是通过将ids进行拆分,形成多个“?”,达到目的。部分代码如下:
StringBuilder stringBuilder=new StringBuilder(SORE_SALE_ID);
List<Object> params = new ArrayList<>();
//整合数组
String[] uidArr = itemIds.split(",");
//拼接
for (String userId:uidArr){
params.add(userId);
stringBuilder.append("?");
stringBuilder.append(",");
}
//去掉最后一个逗号
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
stringBuilder.append(")");
//拼接剩余SQL
stringBuilder.append(" and (bid_status=2 or bid_status=3) order by bid_status desc,start_time desc");
return jdbcTemplateFactory.getJdbcTemplate(0).query(stringBuilder.toString(), params.toArray(), new RowMapper<String>() {
@Override
public String mapRow(ResultSet resultSet, int i) throws SQLException {
String userId = "" + resultSet.getLong("sale_id");
return userId;
}
});
通过拼接的解决办法,拍卖列表就完美解决了。但是随之而来的学习的机会又来了,查询商品列表不再是springdata框架,改成了mybatis了,当然思路已经有了,不管是什么框架都是换汤不换药。在mybatis中,那么该如何实现想要的目标需求呢?在springdata中有Springbuilder来拼接,当然在mybatis中可以通过foreach来实现对其传值的拆分。SQL语句如下(参数为):
<select id="queryCouponCommodity" parameterType="java.util.Map" resultMap="commodityDetailResultMap">
SELECT
commodity_id,
commodity_name,
tag_pic,
cover,
price
FROM
bk_commodity
WHERE
commodity_id IN
<foreach collection="commodityIds" item="paramItem" open="(" separator="," close=")">
#{paramItem}
</foreach>
AND yn = 1 order by modify_time desc
</select>
foreach补充:
foreach一共有三种类型,我们使用的则是Map,还有List,<>(array)。
属性 描述
item 循环体中的具体对象,支持属性的点路径访问。如item.id。注:在list和数组中是指其中的对象, 而在map中则指value值。
collection collection值为接收的对象值,就是传入进来的对象的名称
separator 元素之间的分隔符,例如在in()的时候,separator=”,”会自动在元素中间用“,”隔开,避免手动输入逗号而导致sql错误。
open foreach代码的开始符号,一般与close合用。常用在in(),values()时,参数可选。
close foreach代码的结束符号,一般与open合用。常用在in(),values()时,参数可选。
index 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。
对于foreach只是做一个简短的了解。在实践中进去前行。