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>
</d</span>elete>
现在我去数据库表 goods 里新插入 3 条数据
public class Start2 {
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException {
<span class="hljs-type">String</span> <span class="hljs-variable">resource</span> <span class="hljs-operator">=</span> <span class="hljs-string">"mybatis-conf.xml"</span>;
<span class="hljs-type">InputStream</span> <span class="hljs-variable">inputStream</span> <span class="hljs-operator">=</span> Resources.getResourceAsStream(resource);
<span class="hljs-comment">//创建SqlSessionFactory</span>
<span class="hljs-type">SqlSessionFactory</span> <span class="hljs-variable">sqlSessionFactory</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">SqlSessionFactoryBuilder</span>().build(inputStream);
<span class="hljs-comment">//true表示自动提交。否则需要使用commit方法才会提交。默认是false</span>
<span class="hljs-type">SqlSession</span> <span class="hljs-variable">session</span> <span class="hljs-operator">=</span> sqlSessionFactory.openSession();
<span class="hljs-comment">//拿到接口的代理对象</span>
GoodsDao2 dao=session.getMapper(GoodsDao2.class);
<span class="hljs-comment">//拿到了dao这个对象接下来就可以创建sql语句了;(直接调用接口方法)</span>
<span class="hljs-type">List</span> <span class="hljs-variable">list</span> <span class="hljs-operator">=</span><span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span>();
list.add(<span class="hljs-string">"73"</span>); <span class="hljs-comment">//准备删除id为73的数据</span>
list.add(<span class="hljs-string">"75"</span>); <span class="hljs-comment">//准备删除id为75的数据</span>
<span class="hljs-type">int</span> x= dao.deleteByList(list); <span class="hljs-comment">//这个方法有个int返回值,会告诉你已影响了多少条数据</span>
System.out.println(x);
<span class="hljs-comment">//如果上面不设置自动提交表单,那么就需要commit方法</span>
session.commit();
}
}
点击运行
表示,影响了 2 条数据(既 删除了 2 条数据)
现在查看下数据库表 发现
表里 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>
</d</span>elete>
老套路第三步, 主入口类设置具体 传入值
/Mybatis02/src/test/Start2.java
public class Start2 {
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException {
<span class="hljs-type">String</span> <span class="hljs-variable">resource</span> <span class="hljs-operator">=</span> <span class="hljs-string">"mybatis-conf.xml"</span>;
<span class="hljs-type">InputStream</span> <span class="hljs-variable">inputStream</span> <span class="hljs-operator">=</span> Resources.getResourceAsStream(resource);
<span class="hljs-comment">//创建SqlSessionFactory</span>
<span class="hljs-type">SqlSessionFactory</span> <span class="hljs-variable">sqlSessionFactory</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">SqlSessionFactoryBuilder</span>().build(inputStream);
<span class="hljs-comment">//true表示自动提交。否则需要使用commit方法才会提交。默认是false</span>
<span class="hljs-type">SqlSession</span> <span class="hljs-variable">session</span> <span class="hljs-operator">=</span> sqlSessionFactory.openSession();
<span class="hljs-comment">//拿到接口的代理对象</span>
GoodsDao2 dao=session.getMapper(GoodsDao2.class);
<span class="hljs-comment">//拿到了dao这个对象接下来就可以创建sql语句了;(直接调用接口方法)</span>
String[] strs={<span class="hljs-string">"101"</span>,<span class="hljs-string">"102"</span>,<span class="hljs-string">"103"</span>};
<span class="hljs-type">int</span> x= dao.deleteByArray(strs); <span class="hljs-comment">//这个方法有个int返回值,会告诉你已影响了多少条数据</span>
System.out.println(x);
<span class="hljs-comment">//如果上面不设置自动提交表单,那么就需要commit方法</span>
session.commit();
}
}
我现在在数据库表 goods 里新插入 3 条数据,它们都 id 我设为 101,102,103 看看等下能不能把他们删除
点击运行
输出结果 3,表面已经影响了 3 条数据,那么是不是数据库相关信息已经被删了呢,现在看下数据库