MyBatis批量插入的五种方式
- MyBatis利用For循环批量插入
- MyBatis的手动批量提交
- MyBatis以集合方式批量新增(推荐)
- MyBatis-Plus提供的SaveBatch方法
- MyBatis-Plus提供的InsertBatchSomeColumn方法(推荐)
文章目录
- 1.项目准备
- 1.1 pom文件
- 1.2 yml文件
- 1.3 User类
- 2.MyBatis利用For循环批量插入
- 3.MyBatis的手动批量提交
- 4.MyBatis以集合方式批量新增(推荐)
- 5.MyBatis-Plus提供的SaveBatch方法
- 6.MyBatis-Plus提供的InsertBatchSomeColumn方法(推荐)
1.项目准备
1.1 pom文件
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency><!--Mybatis依赖-->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version>
</dependency><!--Mybatis-Plus依赖-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
1.2 yml文件
server:port: 8080spring:datasource:username: mysql用户名password: mysql密码url: jdbc:mysql://localhost:3306/数据库名字?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapping/*.xml
1.3 User类
@Data
public class User {private int id;private String username;private String password;
}
2.MyBatis利用For循环批量插入
@Service
public class UserService {@Resourceprivate UserMapper userMapper;public void InsertUsers(){long start = System.currentTimeMillis();for(int i = 0 ;i < 10000; i++) {User user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userMapper.insertUsers(user);}long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}}
@Mapper
public interface UserMapper {Integer insertUsers(User user);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ithuang.demo.mapper.UserMapper"><insert id="insertUsers">INSERT INTO user (username, password)VALUES(#{username}, #{password})</insert>
</mapper>
一万条数据总耗时:26348ms
3.MyBatis的手动批量提交
@Service
public class UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate SqlSessionTemplate sqlSessionTemplate;public void InsertUsers(){//关闭自动提交SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);UserMapper userMapper = sqlSession.getMapper(UserMapper.class);long start = System.currentTimeMillis();for(int i = 0 ;i < 10000; i++) {User user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userMapper.insertUsers(user);}sqlSession.commit();long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}}
一万条数据总耗时:24516ms
4.MyBatis以集合方式批量新增(推荐)
@Service
public class UserService {@Resourceprivate UserMapper userMapper;public void InsertUsers(){long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();User user;for(int i = 0 ;i < 10000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userList.add(user);}userMapper.insertUsers(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}}
@Mapper
public interface UserMapper {Integer insertUsers(List<User> userList);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ithuang.demo.mapper.UserMapper"><insert id="insertUsers">INSERT INTO user (username, password)VALUES<foreach collection ="userList" item="user" separator =",">(#{user.username}, #{user.password})</foreach></insert>
</mapper>
一万条数据总耗时:521ms
5.MyBatis-Plus提供的SaveBatch方法
@Service
public class UserService extends ServiceImpl<UserMapper, User> implements IService<User> {public void InsertUsers(){long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();User user;for(int i = 0 ;i < 10000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userList.add(user);}saveBatch(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}
}
@Mapper
public interface UserMapper extends BaseMapper<User> {}
一万条数据总耗时:24674ms
6.MyBatis-Plus提供的InsertBatchSomeColumn方法(推荐)
public class EasySqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {// 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));return methodList;}}
@Configuration
public class MybatisPlusConfig {@Beanpublic EasySqlInjector sqlInjector() {return new EasySqlInjector();}
}
public class UserService{@Resourceprivate UserMapper userMapper;public void InsertUsers(){long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();User user;for(int i = 0 ;i < 10000; i++) {user = new User();user.setUsername("name" + i);user.setPassword("password" + i);userList.add(user);}userMapper.insertBatchSomeColumn(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );}
}
public interface EasyBaseMapper<T> extends BaseMapper<T> {/*** 批量插入 仅适用于mysql** @param entityList 实体列表* @return 影响行数*/Integer insertBatchSomeColumn(Collection<T> entityList);
}
@Mapper
public interface UserMapper<T> extends EasyBaseMapper<User> {}
一万条数据总耗时:575ms
MyBatis批量插入的五种方式相关推荐
- mybatis 批量插入的两种方式
2019独角兽企业重金招聘Python工程师标准>>> 一.mybiats foreach标签 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.fore ...
- jdbc批量插入的4种方式【百万条数据插入只需几秒】
mysql数据库准备 #打开数据库test01; use test01; #创建表a,表a包含int型的id列.可变长度型的name[长度20个字符] create table a (id INT,N ...
- 【MyBatis】关于MyBatis批量更新的几种方式
1. Java代码循环执行sql,逐条更新 这种方式就是将需要更新的数据,循环调用update方法去更新数据,实现代码如下: public void test() {// 需要更新的集合List< ...
- 实战演练 | 批量插入的三种方式
最近,我写了一个 node.js 脚本,每天要循环访问数百万个文件,并将其内容插入 MySQL 数据库.该脚本不是一次处理一条记录,而是将文件内容存储在内存中,然后每 1000 个文件运行一次 INS ...
- mybatis中批量插入的两种方式(高效插入)
MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...
- 后端技术:MyBatis 批量插入的 3 种写法
运行环境: 数据库使用的是sqlserver,JDK版本1.8,运行在SpringBoot环境下,对比3种可用的方式: 反复执行单条插入语句 xml拼接sql 批处理执行 先说结论:少量插入请使用反复 ...
- MyBatis 批量插入数据的 3 种方法
批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...
- MyBatis批量插入(sqlserver BULK INSERT)
MyBatis批量插入: 1. foreach方式 2.sqlsession + sqlsession.flushStatements方式: // SqlSession sqlSessi ...
- SSM整合之Mybatis笔记( MyBatis获取参数值的两种方式(重要))(P020—P025)
P20 MyBatis获取参数值的两种方式(重要) 一.什么叫做获取取参数值的两种方式 以后在我们开发是方向B/S系统,然后我们现在要做的任务通过浏览器/页面/视图 收集用户输入的一些数据,然后把这些 ...
最新文章
- 求助!!让我郁闷纠结恨的状况!!!
- bilibili Saber 实时计算平台架构与实践【Apache Flink 替换 Spark Stream的架构与实践】
- 【算法设计与分析】10 差消法化简高阶递推方程
- c++ 协程_用yield实现协程
- (19)Xilinx PCIE中断理论(学无止境)
- 算法导论 练习12.1
- 【无线通信】基于matlab无线传感网络WSN仿真【含Matlab源码 1237期】
- 迅捷pdf虚拟打印机怎么安装使用
- python100例详解-python案例讲解
- 华为手机 图标消失_华为手机桌面图标不见了怎么办
- webpack 基础学习
- labview压装设备最终代码,基于QMH框架和Machine框架有机结合
- 阅兵方阵 蓝桥杯 第九届JavaA
- Number theory 1_2, To prove there is no rational solution of equation: x^2+y^2=7
- UVA12307 Smallest Enclosing Rectangle 题解
- SqlServer数据库性能优化详解
- 一款简易低成本智能割草机的制作——硬件篇
- addon游戏_我的世界多人addon地图
- 【bat】 创建一个文件的快捷方式
- c语言中1 lt lt 10什么意思,卡西欧lt1和lt3是什么意思
热门文章
- java用swing日历标记节日,java基于swing实现日历
- C·cJSON库函数--cJSON_GetObjectItem
- putty 报错no supported authentication methods available (server sent:publickey...)
- MeEdu开源网校系统-手动安装教程(完整版)
- linux开放端口的两种方法
- vector<int> v 与 vector<int> v(n) 的区别
- 二维图形平移变换c语言程序,[转载]计算机图形学Opengl实现二维图形的平移、旋转、缩放复合变换...
- opencv频域滤波 C++实现陷波滤波器
- 绿色荧光标记麦胚凝集素(FITC-WGA)
- Linux--增加用户、添加用户组