From《MyBatis从入门到精通》

一、foreach实现in集合

  1.映射文件中添加的代码:

    <!--
        4.4 foreach用法
            SQL语句有时会使用IN关键字,例如id in {1,2,3}。可以使用id in #{ids}方式直接
            获取值,但是这种写法不能防止SQL注入,想避免SQL注入就需要用#{}的方式,这时就需要
            配合使用foreach标签来满足需求。

            foreach可以对数组,map或实现了Iterable接口(如List、Set)的对象进行遍历。数组
            在处理时会转换成List对象,因此foreach遍历的对象可以分为两大类:Iterable类型
            和Map类型。
    -->

    <!--
        4.4.1 foreach实现in集合
            需求:
                根据传入的用户id集合查询所有符合条件的用户。
    -->
    <select id="selectByIdList" resultType="tk.mybatis.simple.model.SysUser">
        select id,
          user_name userName,
          user_password userPassword,
          user_email userEmail,
          user_info userInfo,
          head_img headImg,
          create_time createTime
        from sys_user
        where  id in
        <!--
            <foreach>包含以下属性:
                collection:必填,值为要迭代循环的集合类型。这个属性值的情况有很多
                item:变量名,值为从迭代对象中取出的每一个值
                index:索引的属性名,在集合数组情况下值为当前索引值;当迭代对象是map时,这个值为map的key
                open:整个循环内容的开头字符串
                close:整个循环内容的结尾字符串
                separator:每次循环的分隔符
        -->
        <foreach collection="list" open="(" close=")" separator=","
                 item="id" index="i">
            #{id}
        </foreach>

        <!--
            collection的属性要如何设置?来看看MyBatis是如何处理这种类型的参数的:
                1.只有一个数组参数或集合参数:
                    当参数类型为集合类型的时候,默认会转换成Map类型,并添加一个key为collection的值
                    如果参数类型是List类型,那么就继续添加一个key为list的值,这样,当collection="list"
                    时,就能得到这个集合,并对它进行循环处理。

                    当参数类型为数组类型的时候,也会转换成Map类型,默认的key为array。当采用如下方法使用
                    数组参数时,就需要把foreach便签中的collection属性值设置为array
                        List<SysUser> selectByList(Long[] idArray);

                    上面是数组或集合类型的参数默认的名字。推荐使用@Param来指定参数的名字,这时collection
                    就设置为通过@Param注解指定的名字。

                2.有多个参数:
                    有多个参数时,需要用@Param注解给每个参数指定一个名字~~~

                3.参数是Map类型:
                    使用map和使用@Param注解方式类似,将collection指定为Map中的key即可。
                    如果要循环所传入的Map,推荐使用@Param注解指定名字,此时可将collection
                    设置为指定的名字,如果不想指定名字,就使用默认值_parameter
                        ——我选择用@Param指定名字。。。

                4.参数是一个对象:
                    这种情况下指定对象的属性名即可。当使用对象内层嵌套的对象时,使用属性.属性
                    (集合和数组可以使用下标取值)的方式可以指定深层的属性值。
        -->
    </select>

  

  2.接口类中添加的方法:

    List<SysUser> selectByIdList(List<Long> idList);

  3.测试代码

    @Test
    public void testSelectByIdList(){
        SqlSession sqlSession = getSqlSession();
        try{
            UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
            List<Long> idList = new ArrayList<Long>();
            idList.add(1L);
            idList.add(1001L);

            List<SysUser> userList = userMapper.selectByIdList(idList);
            Assert.assertEquals(2,userList.size());
        }finally {
            sqlSession.close();
        }
    }

二、foreach实现批量插入

  1.映射文件中添加的代码:

    <!--
        4.4.2 foreach实现批量插入

            可以开启批量新增回写主键值的功能
    -->
    <insert id="insertList">
        insert into sys_user(
        user_name,user_password,user_email,
        user_info,head_img,create_time)
        values
        <foreach collection="list" item="user" separator=",">
            (
            #{user.userName},#{user.userPassword},#{user.userEmail},
            #{user.userInfo},#{user.headImg,jdbcType=BLOB},
            #{user.createTime,jdbcType=TIMESTAMP}
            )
        </foreach>
    </insert>

  

  2.接口类中添加的方法:

    int insertList(List<SysUser> userList);

  3.测试代码:

    @Test
    public void testInsertList() {
        SqlSession sqlSession = getSqlSession();
        try{
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<SysUser> userList = new ArrayList<SysUser>();
            for (int i = 0; i < 2; i++) {
                SysUser user = new SysUser();
                user.setUserName("test"+i);
                user.setUserPassword("123456");
                user.setUserEmail("test@mybatis.tk");
                userList.add(user);
            }
            int result = userMapper.insertList(userList);
            Assert.assertEquals(2,result);
        }finally {
            sqlSession.rollback();
            sqlSession.close();
        }
    }

三、foreach实现动态UPDATE

  1.映射文件中添加的代码:

    <!--
        4.4.3 foreach实现动态UPDATE
            当参数是Map类型的时候,foreach标签的index属性值对应的不是索引值,而是Map中
            的key,利用这个key可以实现动态UPDATE。
    -->
    <update id="updateByMap">
        update sys_user
        set
        <foreach collection="_parameter" item="val" index="key" separator=",">
            ${key}=#{val}
        </foreach>
        where id=#{id}
    </update>

  2.接口类中添加的方法:

    int updateByMap(Map<String,Object> map);

  3.测试代码:

    @Test
    public void testUpdateByMap(){
        SqlSession sqlSession = getSqlSession();
        try{
            UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("id",1L);
            map.put("user_email","test@mybatis.tk");
            map.put("user_password","1234456");

            userMapper.updateByMap(map);
            SysUser user = userMapper.selectById(1L);
            Assert.assertEquals("test@mybatis.tk",user.getUserEmail());
        }
        finally {
            sqlSession.rollback();
            sqlSession.close();
        }
    }

MyBatis foreach标签的用法的更多相关文章

  1. Mybatis foreach标签含义

    背景 考虑以下场景: InfoTable(信息表): Name Gender Age Score 张三 男 21 90 李四 女 20 87 王五 男 22 92 赵六 女 19 94 孙七 女 23 ...

  2. mybatis <forEach>标签的使用

    MyBatis<forEach>标签的使用 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis.当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中,用名 ...

  3. MyBatis从入门到精通(八):MyBatis动态Sql之foreach标签的用法

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用foreach ...

  4. MyBatis foreach标签遍历数组

    有时候开发中需要根据多个ID去查询,可以将ID封装为List或者数组然后使用MyBatis中的foreach标签构建in条件. 这里我将ID封装为String[]作为参数. <select id ...

  5. mybatis foreach标签

    一.批量插入数据 示例:添加订单商品表 1.模型层的相应代码 /** * 添加订单商品表 * @param ordergoods * @return */ public boolean addOrde ...

  6. MyBatis bind标签的用法

    From<MyBatis从入门到精通> <!-- 4.5 bind用法 bind标签可以使用OGNL表达式创建一个变量并将其绑定到上下文中. 需求: concat函数连接字符串,在M ...

  7. MyBatis select标签的用法

    From<MyBatis从入门到精通> 第一步,在接口中添加方法: public interface UserMapper { SysUser selectById(Long id); } ...

  8. mybatis foreach where test用法

    <select id="selectAny" resultType="user" parameterType="user"> s ...

  9. mybatis foreach标签的解释 与常用之处

    情景:查询数据库中文章的相关文章   文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割 查询完一个文章后可以把tags字段构造为一个List<String> 然后利用这 ...

随机推荐

  1. extjs grid 复选框选择事件

    开发中需求是统计选择的行数,所以要监控checkbox的选择事件包括表头的全选事件 遇到的问题就不赘述了 方案是监控grid的复选框和行加载时绑定事件 baseView: DBEN.controls. ...

  2. ring3层一种占用文件的方法(DuplicateHandle以后,把占用文件的句柄丢给系统进程,导致被占用)

    前段时间,一个测试工程师问我关于怎样长时间的占用一个文件,而使别的程序无法再访问这个文件,想起以前很多病毒木马经常劫持hosts文件不放,除非你找到占用文件的程序,并强行结束掉,否则怎么也访问不了ho ...

  3. 说说IEnumerable和yield

    IEnumerable数据类型是我比较喜欢的数据类型,特别是其强类型IEnumerable<T>更获得Linq的支持使得代码看起来更加优雅.整洁. 编写返回值为IEnumerable(或I ...

  4. Android开发环境搭建(原创)

    1,我的环境: win8 64位 2,软件安装: 1) jdk-7u40-windows-i586.exe 下载合适的版本,我下载的是 jdk7u40 32位 for windows 安装JDK,配置 ...

  5. 解决socket.error: [Errno 98] Address already in use问题

    如果python中socket 绑定的地址正在使用,往往会出现错误, 在linux下: 则会显示“ socket.error: [Errno 98] Address already in use” 在 ...

  6. 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)

    一.概述 面向过程:根据业务逻辑从上到下写代码 函数式:将具有一些功能的代码封装到函数中,需要的时候调用即可 面向对象:对函数进行分类和封装,让开发更方便,更快捷 Java和C#只支持面型对象编程,, ...

  7. Java 函数传入参数后,究竟发生了什么?java函数传参数原理解析

    JAVA函数在传入参数A时,会在函数作用周期内生成一个与参数相同类型的局部变量B. B与A指向同一块内存区域,并且具有相同的名字如param. 在函数内所有对param的操作都是对B的操作.对B进行赋 ...

  8. SYN591型 多功能数字面板表

       SYN591型 多功能数字面板表 多功能数字面板表数字面板表使用说明视频链接: http://www.syn029.com/h-pd-248-0_310_44_-1.html 请将此链接复制到浏 ...

  9. Spring与IoC

    控制反转(IOC,Inversion of Control),是一个概念,是一种思想. 指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理.控制反转就是对对象控制权的转移 ...

  10. Spring_two

    Spring_two 基于注解的IOC配置 准备工作(参考上一篇) ); 接口的实现类AccountDaoImpl.java修改 /** * 账户的持久层实现类 */ @Repository(&quo ...