admin 管理员组文章数量: 887030
2024年1月9日发(作者:查找函数vlookup)
1. foreach 实现in集合
假设有这样1个需求:根据传入的用户id集合查询出所有符合条件的用户,此时我们需要使用到Sql中的IN,如 id in (1,1001)。
首先,我们在接口SysUserMapper中添加如下方法:
/**
* 根据用户id集合查询用户
*
* @param idList
* @return
*/
List
然后在对应的中添加如下代码:
最后,在SysUserMapperTest测试类中添加如下测试方法:
@Test
public void testSelectByIdList() {
SqlSession sqlSession = getSqlSession();
try {
SysUserMapper sysUserMapper =
per();
List
(1L);
(1001L);
List
ByIdList(idList);
Equals(2, ());
} finally {
();
}
}
运行测试代码,测试通过,输出日志如下:
DEBUG [main] - ==> Preparing: SELECT id, user_name, user_password,
user_email, create_time FROM sys_user WHERE id IN ( ? , ? )
DEBUG [main] - ==> Parameters: 1(Long), 1001(Long)
TRACE [main] - <== Columns: id, user_name, user_password, user_email,
create_time
TRACE[main]-<==Row:1,admin,123456,****************,2019-06-27 18:21:07.0
TRACE[main]-<==Row:1001,test,123456,***************,2019-06-27 18:21:07.0
DEBUG [main] - <== Total: 2
通过日志会发现,foreach元素中的内容最终生成的Sql语句为(1,1001)。
foreach包含属性讲解:
•
•
•
•
•
•
open:整个循环内容开头的字符串。
close:整个循环内容结尾的字符串。
separator:每次循环的分隔符。
item:从迭代对象中取出的每一个值。
index:如果参数为集合或者数组,该值为当前索引值,如果参数为Map类型时,该值为Map的key。
collection:要迭代循环的属性名。
也许有人会好奇,为什么collection的值是list?该值该如何设置呢?
上面的例子中只有一个集合参数,我们把collection属性的值设置为了list,其实也可以写成collection,为什么呢?让我们看下DefaultSqlSession中的默认处理逻辑:
private Object wrapCollection(Object object) {
Map map;
if (object instanceof Collection) {
map = new Map();
("collection", object);
if (object instanceof List) {
("list", object);
}
return map;
} else if (object != null && ss().isArray()) {
map = new Map();
("array", object);
return map;
} else {
return object;
}
}
虽然使用默认值,代码也可以正常运行,但还是推荐使用@Param来指定参数的名字,如下所示:
List
item="id" index="i"> #{id}
如果参数是一个数组参数,collection可以设置为默认值array,看了上面的源码,应该不难理解。
/**
* 根据用户id数组查询用户
*
* @param idArray
* @return
*/
List
虽然使用默认值,代码也可以正常运行,但还是推荐使用@Param来指定参数的名字,如下所示:
List
item="id" index="i"> #{id}
2. foreach 实现批量插入
假设有这样1个需求:将传入的用户集合批量写入数据库。
首先,我们在接口SysUserMapper中添加如下方法:
/**
* 批量插入用户信息
*
* @param userList
* @return
*/
int insertList(List
然后在对应的中添加如下代码:
INSERT INTO sys_user(user_name, user_password, user_email,
user_info, head_img, create_time)
VALUES
(#{me},#{ssword},#{ail},#{fo},#{g,jdbcType=BLOB},#{Time,jdbcType=TIMESTAMP})
最后,在SysUserMapperTest测试类中添加如下测试方法:
@Test
public void testInsertList() {
SqlSession sqlSession = getSqlSession();
try {
SysUserMapper sysUserMapper =
per();
List
for (int i = 0; i < 2; i++) {
SysUser sysUser = new SysUser();
rName("test" + i);
rPassword("123456");
rEmail("***************");
(sysUser);
}
int result = List(sysUserList);
for (SysUser sysUser : sysUserList) {
n(());
}
Equals(2, result);
} finally {
();
}
}
运行测试代码,测试通过,输出日志如下:
DEBUG [main] - ==> Preparing: INSERT INTO sys_user(user_name,
user_password, user_email, user_info, head_img, create_time) VALUES
(?,?,?,?,?,?) , (?,?,?,?,?,?)
DEBUG [main] - ==> Parameters: test0(String), 123456(String),
***************(String),null,null,null,test1(String),123456(String),***************(String),null,null,nullDEBUG [main] - <== Updates: 2
1035
1036
3. foreach 实现动态update
假设有这样1个需求:根据传入的Map参数更新用户信息。
首先,我们在接口SysUserMapper中添加如下方法:
/**
* 通过Map更新列
*
* @param map
* @return
*/
int updateByMap(Map
然后在对应的中添加如下代码:
UPDATE sys_user
SET
separator=","> ${key} = #{val}
WHERE id = #{id}
最后,在SysUserMapperTest测试类中添加如下测试方法:
@Test
public void testUpdateByMap() {
SqlSession sqlSession = getSqlSession();
try {
SysUserMapper sysUserMapper =
per();
Map
("id", 1L);
("user_email","***************"); ("user_password", "12345678");
Equals(1, ByMap(map));
SysUser sysUser = ById(1L);
Equals("***************",rEmail());
Equals("12345678", rPassword());
} finally {
();
}
}
运行测试代码,测试通过,输出日志如下:
DEBUG [main] - ==> Preparing: UPDATE sys_user SET user_email = ? ,
user_password = ? , id = ? WHERE id = ?
DEBUG[main]-==>Parameters:***************(String),12345678(String), 1(Long), 1(Long)
DEBUG [main] - <== Updates: 1
DEBUG [main] - ==> Preparing: SELECT id, user_name, user_password,
user_email, create_time FROM sys_user WHERE id = ?
DEBUG [main] - ==> Parameters: 1(Long)
TRACE [main] - <== Columns: id, user_name, user_password, user_email,
create_time
TRACE[main]-<==Row:1,admin,12345678,***************,2019-06-27 18:21:07.0
DEBUG [main] - <== Total: 1
上面示例中,collection使用的是默认值_parameter,也可以使用@Param指定参数名字,如下所示:
int updateByMap(@Param("userMap") Map
UPDATE sys_user
SET
separator=","> ${key} = #{val}
WHERE id = #{}
版权声明:本文标题:update foreach用法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1704789899h462324.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论