zoukankan      html  css  js  c++  java
  • mybatis处理集合、循环、数组和in等语句的使用

    http://www.suyunyou.com/aid5.html参考
    mybatis处理集合、循环、数组和in等语句的使用

    经过测试,批量操作数组时,总是提示出错,java.util.Array 找不到  可能要携程ArrayList就行了,但是我插入的数据 是String [] ids=str.split(",");这种形式的,不能用ArrayList吧,反正这个没成功,后来我又把str转换成 List,才可以用collection=list来批量操作。 List a=ArraYlsit.asList(str);


    在使用foreach的时候最容易出错的就是collection属性,该属性是必须指定的,在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

    1.     如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

    2.     如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

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

        我采用mybatis直接将数组当作参数传入总是出现错误,说找不到参数,也按照上述的条件一一尝试结果还是不行,我想可能出现这个问题的原因是mybatis的版本问题。后来采用传入一个实体,在实体里面定义数组的方法。然后操作,这样就不出错了。此方法虽为下册,但也可以应付一些关键问题。

    下面看看代码把!

    实体bean:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package com.huaat.weibo.vo;
     
    import java.io.Serializable;
     
    /**
     * 我的微博实体
     * <a href="http://my.oschina.net/arthor" target="_blank" rel="nofollow">@author</a> jing.yue
     * @version 2012/07/17 1.0.0
     */
    public class MyWeibo implements Serializable {
     
        private static final long serialVersionUID = 754681127580984228L;
     
        private String[] fileNames;
        private String[] fileUrls;
     
        public String[] getFileNames() {
            return fileNames;
        }
        public void setFileNames(String[] fileNames) {
            this.fileNames = fileNames;
        }
        public String[] getFileUrls() {
            return fileUrls;
        }
        public void setFileUrls(String[] fileUrls) {
            this.fileUrls = fileUrls;
        }
     
    }
    下面为mybatis的配置文件[myWeibo为实体]:
    ?
    1
    2
    3
    4
    5
    6
    7
    <!-- 删除微博 -->
        <delete id="delMyWeibo" parameterType="myWeibo">
            delete from my_weibo where weibo_id in
            <foreach item="item" index="index" collection="fileUrls" open="(" separator="," close=")">
                #{item}
            </foreach>
        </delete>

    解释下foreach的参数:

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

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

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

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

    close表示以什么结束.

    至于调用这个方法的代码:

    ?
    1
    2
    3
    4
    5
        /**
     * 删除微博
     * @param myWeibo
     */
    public abstract void delMyWeibo(MyWeibo myWeibo);

    这样就解决这个问题了~

    原文来自:http://www.suyunyou.com/aid5.html



    在Mybatis的xml配置中使用集合,主要是用到了foreach动态语句。

    foreach的参数:
    foreach元素的属性主要有 item,index,collection,open,separator,close。
    item表示集合中每一个元素进行迭代时的别名.
    index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.
    open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符.
    close表示以什么结束。


    1. Mybatis生成select * from table where id in(1,2,...,n)语句的查询

    我们一般的做法是在方法的参数处指定传入的参数名称,在xml中使用的时候,集合的名称要和方法的Param的名称一致,这样便于阅读和理解,然后是在对应的xml文件中使用foreach循环。

    java代码如下:

    public abstract List<Model> findByIds(@Param("ids")List<Integer> ids);

    对应的xml代码如下:

    select * from table
    <where>
        id in <foreach collection="ids" item="item" index="index" 
    open="(" separator="," close=")">#{item}</foreach>
    </where>

    2.Mybatis保存多条记录

    我们同样是通过foreach的方法来实现,这里我们巧妙的利用了sql的语法规则用Mybatis的foreach动态语句来处理。

    java代码:

    public abstract void saves(@Param("tables")List<Model> tables);

    xml代码:

    insert into table(name,addtime) values
    <foreach collection="tables" item="item" index="index" separator=",">  
        (#{item.name},#{item.addtime})
    </foreach>

    以上方法Mybatis会帮我们进行sql注入拦截,Mybatis如果采用#{xxx}的形式设置参数,Mybatis会进行sql注入的过滤。如果采用的是${xxx},Mybatis不会进行sql注入过滤,而是直接将参入的内容输出为sql语句。

  • 相关阅读:
    循环的注意点
    c语言实践输出某个区间中不是3的倍数的偶数
    while循环for循环优缺点和应用
    while 和do while循环的区别
    多重if else和switch case的区别
    if else的执行流程
    多个if和一个ifelse的区别
    对两个变量排序,从小到大输出
    【译】第四篇 Integration Services:增量加载-Updating Rows
    【译】第三篇 Integration Services:增量加载-Adding Rows
  • 原文地址:https://www.cnblogs.com/yeemi/p/7470155.html
Copyright © 2011-2022 走看看