admin 管理员组

文章数量: 887030


2024年1月9日发(作者:查找函数vlookup)

1. foreach 实现in集合

假设有这样1个需求:根据传入的用户id集合查询出所有符合条件的用户,此时我们需要使用到Sql中的IN,如 id in (1,1001)。

首先,我们在接口SysUserMapper中添加如下方法:

/**

* 根据用户id集合查询用户

*

* @param idList

* @return

*/

List selectByIdList(List idList);

然后在对应的中添加如下代码:

最后,在SysUserMapperTest测试类中添加如下测试方法:

@Test

public void testSelectByIdList() {

SqlSession sqlSession = getSqlSession();

try {

SysUserMapper sysUserMapper =

per();

List idList = new ArrayList();

(1L);

(1001L);

List userList =

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 selectByIdList(@Param("idList") List idList);

item="id" index="i">

#{id}

如果参数是一个数组参数,collection可以设置为默认值array,看了上面的源码,应该不难理解。

/**

* 根据用户id数组查询用户

*

* @param idArray

* @return

*/

List selectByIdArray(Long[] idArray);

虽然使用默认值,代码也可以正常运行,但还是推荐使用@Param来指定参数的名字,如下所示:

List selectByIdArray(@Param("idArray")Long[] idArray);

item="id" index="i">

#{id}

2. foreach 实现批量插入

假设有这样1个需求:将传入的用户集合批量写入数据库。

首先,我们在接口SysUserMapper中添加如下方法:

/**

* 批量插入用户信息

*

* @param userList

* @return

*/

int insertList(List userList);

然后在对应的中添加如下代码:

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 sysUserList = new ArrayList();

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 map);

然后在对应的中添加如下代码:

UPDATE sys_user

SET

separator=",">

${key} = #{val}

WHERE id = #{id}

最后,在SysUserMapperTest测试类中添加如下测试方法:

@Test

public void testUpdateByMap() {

SqlSession sqlSession = getSqlSession();

try {

SysUserMapper sysUserMapper =

per();

Map map = new HashMap();

("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 map);

UPDATE sys_user

SET

separator=",">

${key} = #{val}

WHERE id = #{}


本文标签: 用户 参数 添加 集合 循环