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只是做一个简短的了解。在实践中进去前行。

posted on 2017-06-01 15:15  huohuoL  阅读(225)  评论(0编辑  收藏  举报

导航