注意
mybatis批量更新 需要在数据库链接url后面带一个参数 &allowMultiQueries=true
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
User对象
@Data
@Builder
public class User {
private Integer id;
private String userName;
private String passWord;
private String realName;
}
@Repository
public interface UserMapper {
//这使用@Param注解 html中就不要在使用parameterType指定传入参数类型,mybatis会自动推到参数类型
int updateMap(@Param("userMap") Map<Integer,User> userMap);
}
<update id="updateMap">
<foreach collection="userMap" item="value" index="key" separator=";">
update user set
userName = #{value.userName},
passWord = #{value.passWord},
realName = #{value.realName}
where id = #{key}
</foreach>
注意collection="userMap.entrySet()"和 collection="userMap"这样写法都可以
test
@SpringBootTest
public class UserMapperTest {
@Test
public void updateMapTest() {
@Autowired
UserMapper userMapper;
List<User> userList = userMapper.findAll();
userList.forEach(u->{
u.setUserName(u.getUserName()+"11");
u.setPassWord(u.getPassWord()+22);
u.setRealName(u.getRealName()+33);
});
Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(u->u.getId(),u->u));
System.out.println("userMap:"+userMap);
int result = userMapper.updateMap(userMap);
System.out.println("result:"+result);
}
}