zoukankan      html  css  js  c++  java
  • MyBatis参数传入集合之foreach动态sql

    MyBatis参数传入集合之foreach动态sql

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况: 

    1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
    2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
    3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key  

    文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割

    查询完一个文章后可以把tags字段构造为一个List<String> 然后利用这个集合作为条件来查询

    <select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
      select * from t_news n where 
      <foreach collection="listTag" index="index" item="tag" open="("
        separator="," close=")">
       #{tag} in n.tags
      </foreach>
     

    看。 foreach 生成的效果是集合 转化为下面的

     select * from t_news n where ( ? in n.tags , ? in n.tags )


    foreach元素的属性主要有 item,index,collection,open,separator,close。

    item表示集合中每一个元素进行迭代时的别名.

    index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.

    open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符.

    close表示以什么结束.

    <select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
      select * from t_news n where 
      <foreach collection="listTag" index="index" item="tag" open=""
        separator="or" close="">
       #{tag} in n.tags
      </foreach>
     </select>
    所以 去除左右括号 和 把,改成 or 进行 。 就可以转化为这种形式。
    select * from t_news n where ? in n.tags or ? in n.tags   这样可以用List<String> 来查。

    但是查不到数据
    需要使用如下方式:
    <select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
      select * from t_news n where 
      <foreach collection="listTag" index="index" item="tag" open=""
        separator="or" close="">
        n.tags like  '%'||#{tag}||'%'
      </foreach>
     <lect>

    生成的SQL为

    select * from t_news n where n.tags like ? or n.tags like ?    

    foreach : 用的更多的地方为: 根据Id批量删除    /    判断什么 in 集合中(此时需要生成(**,***,)的形式)

  • 相关阅读:
    Python该怎么学?
    Python招聘需求
    最短路合集
    最小生成树prim算法
    最小生成树kruskal算法
    React-redux原理探索
    Redux原理探索
    头条前端面试题汇总,会持续更新
    阿里前面面试题(最全),持续更新中
    ASP.Net MVC3/4中Model验证错误信息的本地化
  • 原文地址:https://www.cnblogs.com/handsome1013/p/5266065.html
Copyright © 2011-2022 走看看