MyBatis中批量插入和批量更新的实现方法详解
作者:shenzhenNBA
在编程中应用程序和DB操作的第一步就是需要进行网络连接,这就是我们在程序需要设置数据源配置的原因,网络连接即网络通信是有一定耗时的,少量的DB操作问题不大,但是如果有大批量数据同时需要频繁地进行DB操作,这个时候网络通信耗时对应用运行的影响就显示出来了,如果一个一个的进行DB操作肯定比较耗时,这个时候就需要考虑批量操作,也就是一次执行多个DB操作,分多批次进行,这样就减少和DB链接的网络通信时间,那怎么进行批量操作呢?下面简单介绍在Java中使用MyBatis进行DB批量操作,步骤如下:
1,假设有MySQL库的用户信息表结构如下:
create table user ( id bigint auto_increment comment '记录唯一ID', user_code varchar(50) COLLATE utf8mb4_unicode_ci default '' not null comment '用户编码', user_name varchar(50) COLLATE utf8mb4_unicode_ci default '' not null comment '用户姓名', age int(12) default 18 null comment '年龄', salary int(12) default 0 null comment '工资', email varchar(100) default '' null comment '邮箱', primary key (id), unique key 'uk_user_code' (user_code) ) ENGINE=InnoDB auto_increment=1 CHARSET=utf8 COMMENT='用户信息表';
2,用户信息对应的Java Bean定义
public class User { private Long id; private String userCode; private String userName; private Integer age; private String email; private Integer salary; //...getter/setter省略... }
3,批量操作需要知道原理,底层是以SQL语句为基础的,原始SQL批量插入语句,例如:
insert into user (user_code, user_name, age) values ('zhangsan','张三',18),('lisi','李四',20), ('wangwu','王五',30),('laoliu','老六',36)
4,批量操作需要知道原理,底层是以SQL语句为基础的,原始SQL批量更新语句,例如:
按要求批量更新,zhangsan, lisi, wangwu 这三个员工,
邮箱:zhangsan=zhangsan01@163.com,lisi=lisi03@163.com,wangwu=wangwu06@163.com
工资:21岁以下姓李的员工工资加200,21岁以上姓王的员工工资加400,
对应批量更新SQL如下:
update user set email = case when user_code = 'zhangsan' then 'zhangsan01@163.com' when user_code = 'lisi' then 'lisi03@163.com' when user_code = 'wangwu' then 'wangwu06@163.com' end, salary = case when age < 21 and user_name like '李%' then salary+200 when age > 21 and user_name like '王%' then salary+400 end where user_code in ('zhangsan','lisi','wangwu')
5,mapper定义操作DB持久化的接口
@Mapper public interface UserMapper { /**批量插入用户数据*/ int batchInsertUser(@Param("userList") List<User> userList) /**批量更新用户数据*/ int batchUpdateUser(@Param("userList") List<User> userList) }
6,mybatis中xml配置文件对应的定义
<!-- 其它省略 --> <!-- 批量插入数据 --> <insert id="batchInsertUser" parameterType="java.util.List"> insert into user (user_code, user_name, age) values <foreach collection="userList" item="user" index="index" separator=","> (#{user.userCode}, #{user.userName}, #{user.age}) </foreach> </insert> <!-- 批量更新数据 --> <update id="batchUpdateUser"> upate user <trim prefix="set" suffixOverrides=","> <trim prefix="email = case" suffix="end,"> <foreach collection="userList" item="user" index="index"> when user_code = #{user.userCode} then #{user.email} </foreach> </trim> <trim prefix="salary = case" suffix="end,"> <![CDATA[ when age < 21 and user_name like '李%' then salary+200 ]]> <![CDATA[ when age > 21 and user_name like '王%' then salary+400 ]]> </trim> </trim> where user_code in ( <foreach collection="userList" item="user" index="index" separator=","> #{user.userCode} </foreach> ) </update>
7,业务接口UserServicve定义
public interface UserServicve { /**批量数据插入*/ int batchInsertUser(List<User> userList); /**批量数据更新*/ int batchUpdateUser(List<User> userList); }
8,业务接口UserServicve实现
public class UserServicveImpl implements UserServicve { @Autowired private UserMapper userMapper; /**批量数据插入*/ @Overwrite public int batchInsertUser(List<User> userList) { if (CollectionUtil.isEmpty(userList)) { return 0; } return userMapper.batchInsertUser(userList); } /**批量数据插入*/ @Overwrite public int batchUpdateUser(List<User> userList) { if (CollectionUtil.isEmpty(userList)) { return 0; } return userMapper.batchUpdateUser(userList); } }
批量在需要频繁的大数据量操作DB的地方经常用到,批量对DB进行操作可以减少应用和DB的网络连接耗时,可以很大提高应用的响应效率
到此这篇关于MyBatis中批量插入和批量更新的实现方法详解的文章就介绍到这了,更多相关MyBatis批量插入和批量更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!