美文网首页
使用foreach动态生成sql的问题

使用foreach动态生成sql的问题

作者: 48892085f47c | 来源:发表于2016-09-01 11:04 被阅读0次

    使用mybatis可以动态生成sql,当使用foreach动态生成sql尝尝会遇到如下问题:
    先贴代码;

    // dao层java代码
    List<Post> selectPostIn(List<Long> ids);
    
    // xml配置文件代码
    <select id="selectPostIn" resultType="Post" parameterType="list">
                SELECT * FROM POST P WHERE ID in 
    <foreach item="item" index="index" 
                 collection="list" open="(" separator="," close=")"> 
               #{item} 
    </foreach>
    </select>
    

    当list为空时,生成的sql如下:

    SELECT * FROM POST P WHERE ID in;
    

    执行后报错,原因是in后面没有id的数组;

    解决方案1:

    针对输入的list做非空判断,只有list!=null && list.size()>0 才执行daoList<Post> selectPostIn(List<Long> ids);,避免sql报错;

    解决方案2:

    讲xml文件中的parameterType更改为map,即parameterType="map",dao层参数也改为map,具体代码如下:

    param.put("ids",List<Long> ids);
    // dao层java代码
    List<Post> selectPostIn(Map<String, Object> param);
    
    // xml配置文件代码
    <select id="selectPostIn" resultType="Post" parameterType="map">
                SELECT * FROM POST P WHERE  1=1
    <if test="ids != null">
            and ID in 
            <foreach item="item" index="index" 
            collection="ids" open="(" separator="," close=")"> 
            #{item} 
    </foreach>
    </if>
    </select>
    

    xml文件取出param参数key=ids的值,xml对ids的值做非null判断,当ids存在是sql语句为SELECT * FROM POST P WHERE 1=1 and ID in (1,2,3);当ids为null时,sql语句为```
    SELECT * FROM POST P WHERE 1=1;

    
    END;
    本文为作者原创,如需转载请注明地址[使用foreach动态生成sql的问题](http://www.jianshu.com/p/5f27f0991e90);
    如果本文对你有所帮忙,请点个赞,您的支持是我写作的最大动力;

    相关文章

      网友评论

          本文标题:使用foreach动态生成sql的问题

          本文链接:https://www.haomeiwen.com/subject/ktvcettx.html