一直都没有搞懂 这个问题,现在把它写下来
1: parametertype传入参数分为两种 ,第一种为java基本数据类型(一次传入一个基本类型的值,用#{参数值})。第二种为复杂数据类型(java实体类和Map)
java实体类和map可以传入多个值,之前我就不明白,怎么传入多个值,在#{}里面写什么内容。java实体类根据属性名字来判断传入的是哪个值 #{属性名}
Map根据keyname来判断传入的是哪个值#{map的keyname}
:2:如果想让传入的参数为collection怎么办,可以用mapper的foreach来解决问题,实现批量操作(批量操作核心就是一次传入多个数据然后进行相关操作,增删改查中掌握其中一个其他的也不成问题)
foreach是循环,用来读取传入的list参数。批量处理是parameterType的类型必须要注意。foreach标签中的collection属性表示传入的是什么集合类型。item表示的是集合中的一个量类似于
List<String>list;
for(String str:list){
……
}
item就相当于str的作用,用来遍历collection。index就是集合的索引。open表示标签以什么开始,close表示标签以什么结束。seprator表示元素之间的间隔。
foreach一共有三种类型,分别为List,[](array),Map三种。
foreach的第一篇用来将List和数组(array)。
下面表格是我总结的各个属性的用途和注意点。
下面是测试。
SQL
[sql] view plain copy drop table users if exists; create table users ( id int, name varchar(20) ); insert into users (id, name) values(1, 'User1'); insert into users (id, name) values(2, 'User2'); insert into users (id, name) values(3, 'User3'); insert into users (id, name) values(4, 'User4'); insert into users (id, name) values(5, 'User5'); insert into users (id, name) values(6, 'User6');User类
Mapper.xml
[html] view plain copy <select id="countByUserList" resultType="_int" parameterType="list"> select count(*) from users <where> id in <foreach item="item" collection="list" separator="," open="(" close=")" index=""> #{item.id, jdbcType=NUMERIC} </foreach> </where> </select> 测试代码: [java] view plain copy @Test public void shouldHandleComplexNullItem() { SqlSession sqlSession = sqlSessionFactory.openSession(); try { Mapper mapper = sqlSession.getMapper(Mapper.class); User user1 = new User(); user1.setId(2); user1.setName("User2"); List<User> users = new ArrayList<User>(); users.add(user1); users.add(null); int count = mapper.countByUserList(users); Assert.assertEquals(1, count); } finally { sqlSession.close(); } } 测试日志:DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter. DEBUG [main] - Opening JDBC Connection DEBUG [main] - Setting autocommit to false on JDBC Connection [org.hsqldb.jdbc.JDBCConnection@4b83b34e] DEBUG [main] - Resetting autocommit to true on JDBC Connection [org.hsqldb.jdbc.JDBCConnection@4b83b34e] DEBUG [main] - Closing JDBC Connection [org.hsqldb.jdbc.JDBCConnection@4b83b34e] DEBUG [main] - Opening JDBC Connection DEBUG [main] - Setting autocommit to false on JDBC Connection [org.hsqldb.jdbc.JDBCConnection@763d1932] DEBUG [main] - ==> Preparing: select count(*) from users WHERE id in ( ? , ? ) DEBUG [main] - ==> Parameters: 2(Integer), null DEBUG [main] - <== Total: 1 DEBUG [main] - Resetting autocommit to true on JDBC Connection [org.hsqldb.jdbc.JDBCConnection@763d1932] DEBUG [main] - Closing JDBC Connection [org.hsqldb.jdbc.JDBCConnection@763d1932]