mybatis动态SQL--传入参数为集合,数组类型

当接口方法的传入类型为List 或数组Array 时,我们该如何操作


/**
     * 
     * 1.单个的参数Mybatis不会做特殊处理
     *     #{这里随便写什么都可以}    它都能把这里面的值取到
     * 2.传入对象POJO(普通的java类)..
     *      #{对象的属性名称}
     * 3.多个参数。Mybatis会做特殊处理。会把传入的参数自动封装成Map类型
     *      Map 的key值就是从param1...paramN ..
     *      map.put("param1",name)
     *      map.put("param2,id")
     *      @param("name") 可以使用这个注解 来自定义Map封装数据的key值。
     * 4.直接传入Map
     * 
     * 5.Collection(集合)类型(List,Set) ,数组。
     *      Mybatis也会做特殊处理。。
     *      如果是List或者Set  封装到map中 
     *      如果是数组
     *      map.put("array",你传入的数组)
     */ 

先学习当传入参数是List

/Mybatis02/src/com/chen/dao/GoodsDao2.java

//批量操作  (返回影响了几条数据的一个int 数字)
    public Integer deleteByList(List<GoodsInfo> list);

然后把表映射ML文件 写好具体实现
/Mybatis02/config/mappers/GoodsInfoMapper.xml

    <delete id="deleteByList">
        delete from goods where id in
        <foreach collection="list" open="(" separator="," close=")" item="haha">
            #{haha}
        </foreach>
        
    </delete>

现在我去数据库表goods里新插入3条数据
1175089-20171006103952833-374682979.png


public class Start2 {

    public static void main(String[] args) throws IOException {
        
        String resource = "mybatis-conf.xml";
        InputStream  inputStream = Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //true表示自动提交。否则需要使用commit方法才会提交。默认是false
        SqlSession session = sqlSessionFactory.openSession();
        
        //拿到接口的代理对象
        GoodsDao2 dao=session.getMapper(GoodsDao2.class);
        //拿到了dao这个对象接下来就可以创建sql语句了;(直接调用接口方法)
        
         List list =new ArrayList();
         list.add("73"); //准备删除id为73的数据
         list.add("75"); //准备删除id为75的数据
         int x= dao.deleteByList(list); //这个方法有个int返回值,会告诉你已影响了多少条数据
         System.out.println(x);
       
        //如果上面不设置自动提交表单,那么就需要commit方法
        session.commit();
    }

}

点击运行

1175089-20171006105559318-2035385291.png

表示,影响了2条数据(既 删除了2条数据)
现在查看下数据库表 发现
1175089-20171006105713380-549759402.png

表里 id=73 和id=75 的数据 已经被删除了

成功

现在学习当传入参数是Array

/Mybatis02/src/com/chen/dao/GoodsDao2.java

//(一般都是根据  id来删除数据 ,我的数据是varchar类型,对应的是string类型的数组
    public Integer deleteByArray(String[] str );

然后老套路第二步,在表映射XML文件里写好具体实现

/Mybatis02/config/mappers/GoodsInfoMapper.xml

<delete id="deleteByArray">
    delete from goods where id in
    <foreach collection="array" open="(" separator="," close=")" item="haha">
            #{haha}
    </foreach>
        
    </delete>

老套路第三步,主入口类设置具体 传入值
/Mybatis02/src/test/Start2.java


public class Start2 {

    public static void main(String[] args) throws IOException {
        
        String resource = "mybatis-conf.xml";
        InputStream  inputStream = Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //true表示自动提交。否则需要使用commit方法才会提交。默认是false
        SqlSession session = sqlSessionFactory.openSession();
        
        //拿到接口的代理对象
        GoodsDao2 dao=session.getMapper(GoodsDao2.class);
        //拿到了dao这个对象接下来就可以创建sql语句了;(直接调用接口方法)
    
    
        String[] strs={"101","102","103"};
             int x= dao.deleteByArray(strs); //这个方法有个int返回值,会告诉你已影响了多少条数据
             System.out.println(x);
       
        //如果上面不设置自动提交表单,那么就需要commit方法
        session.commit();
    }

}

我现在在数据库表goods里新插入3条数据,它们都id我设为101,102,103看看等下能不能把他们删除
1175089-20171006110813318-1127217780.png

点击运行
1175089-20171006110940943-1500889366.png

输出结果3,表面已经影响了3条数据,那么是不是数据库相关信息已经被删了呢,现在看下数据库
1175089-20171006111146568-566108917.png

成功

转载于:https://www.cnblogs.com/czy16/p/7631246.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中,如果要传递集合、列表、数组或Map等数据结构作为参数,我们可以使用以下方式进行配置和传参: 1. 传递集合或列表参数: 在传递集合或列表参数时,我们可以在SQL语句中使用foreach循环遍历每个参数。例如,我们有一个查询语句如下: ``` SELECT * FROM user WHERE id IN (1, 2, 3); ``` 如果我们想要通过集合参数传递id列表,我们的Mapper文件可以这样写: ``` <select id="getUserByIdList" resultType="User"> SELECT * FROM user WHERE id IN <foreach item="id" index="index" collection="idList" open="(" separator="," close=")"> #{id} </foreach> </select> ``` 其中,我们通过collection指定了传入的idList集合参数,在foreach标签中遍历idList,将每一个id都解析为#{id}参数。这样,就能够动态地构建查询条件,得到期望的查询结果。 2. 传递数组参数: 在传递数组参数时,我们可以通过Java中的数组语法直接传入参数值,例如: ``` <select id="getUserByIds" resultType="User"> SELECT * FROM user WHERE id IN <foreach item="id" index="index" collection="array" open="(" separator="," close=")"> #{id} </foreach> </select> ``` 在此例中,我们通过collection指定了传入的array数组参数,与遍历集合方法类似。 3. 传递Map参数: 如果要传递一个Map作为参数,我们可以为Map中的每个键值对设置一个key和value属性,以便在SQL中使用。例如: ``` <select id="getUserByMap" resultType="User"> SELECT * FROM user WHERE age = #{age} AND <if test="name!=null">name = #{name}</if> AND <if test="email!=null">email = #{email}</if> </select> ``` 在这个例子中,我们通过age、name、email三个键来传递参数值,同时使用if条件语句来根据不同的参数情况动态地构建SQL查询语句。 综上所述,不同的参数类型MyBatis中的传递方式有所不同,但可以通过MyBatis内置的标签,如foreach、if等,来方便地处理动态SQL查询条件的构建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值