13 秒插入 30 万条数据,批量插入!
数据库表
CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',`username` varchar(64) DEFAULT NULL COMMENT '用户名称',`age` int(4) DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';
User实体
/*** <p>用户实体</p>** @Author Jacky*/
@Data
public class User {private int id;private String username;private int age;}
mapper接口
public interface UserMapper {/*** 批量插入用户* @param userList*/void batchInsertUser(@Param("list") List<User> userList);}
mapper.xml文件
<!-- 批量插入用户信息 -->
<insert id="batchInsertUser" parameterType="java.util.List">insert into t_user(username,age) values<foreach collection="list" item="item" index="index" separator=",">(#{item.username},#{item.age})</foreach>
</insert>
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--通过properties标签加载外部properties文件--><properties resource="jdbc.properties"></properties><!--自定义别名--><typeAliases><typeAlias type="com.zjq.domain.User" alias="user"></typeAlias></typeAliases><!--数据源环境--><environments default="developement"><environment id="developement"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--加载映射文件--><mappers><mapper resource="com/zjq/mapper/UserMapper.xml"></mapper></mappers></configuration>
/*** 分批次批量插入一* @throws IOException*/
@Test
public void testBatchInsertUser() throws IOException {InputStream resourceAsStream =Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession session = sqlSessionFactory.openSession();System.out.println("===== 开始插入数据 =====");long startTime = System.currentTimeMillis();int waitTime = 10;try {List<User> userList = new ArrayList<>();for (int i = 1; i <= 300000; i++) {User user = new User();user.setId(i);user.setUsername("共饮一杯无 " + i);user.setAge((int) (Math.random() * 100));userList.add(user);if (i % 1000 == 0) {session.insert("batchInsertUser", userList);// 每 1000 条数据提交一次事务session.commit();userList.clear();// 等待一段时间Thread.sleep(waitTime * 1000);}}// 最后插入剩余的数据if(!CollectionUtils.isEmpty(userList)) {session.insert("batchInsertUser", userList);session.commit();}long spendTime = System.currentTimeMillis()-startTime;System.out.println("成功插入 30 万条数据,耗时:"+spendTime+"毫秒");} catch (Exception e) {e.printStackTrace();} finally {session.close();}
}
/*** 分批次批量插入二* @throws IOException*/
@Test
public void testBatchInsertUser() throws IOException {InputStream resourceAsStream =Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession session = sqlSessionFactory.openSession();System.out.println("===== 开始插入数据 =====");long startTime = System.currentTimeMillis();int waitTime = 10;try {List<User> userList = new ArrayList<>();for (int i = 1; i <= 300000; i++) {User user = new User();user.setId(i);user.setUsername("共饮一杯无 " + i);user.setAge((int) (Math.random() * 100));userList.add(user);if (i % 1000 == 0) {session.insert("batchInsertUser", userList);// 每 1000 条数据提交一次事务session.commit();userList.clear();}}// 最后插入剩余的数据if(!CollectionUtils.isEmpty(userList)) {session.insert("batchInsertUser", userList);session.commit();}long spendTime = System.currentTimeMillis()-startTime;System.out.println("成功插入 30 万条数据,耗时:"+spendTime+"毫秒");} catch (Exception e) {e.printStackTrace();} finally {session.close();}
}
/*** JDBC分批次批量插入* @throws IOException*/
@Test
public void testJDBCBatchInsertUser() throws IOException {Connection connection = null;PreparedStatement preparedStatement = null;String databaseURL = "jdbc:mysql://localhost:3306/test";String user = "root";String password = "root";try {connection = DriverManager.getConnection(databaseURL, user, password);// 关闭自动提交事务,改为手动提交connection.setAutoCommit(false);System.out.println("===== 开始插入数据 =====");long startTime = System.currentTimeMillis();String sqlInsert = "INSERT INTO t_user ( username, age) VALUES ( ?, ?)";preparedStatement = connection.prepareStatement(sqlInsert);Random random = new Random();for (int i = 1; i <= 300000; i++) {preparedStatement.setString(1, "共饮一杯无 " + i);preparedStatement.setInt(2, random.nextInt(100));// 添加到批处理中preparedStatement.addBatch();if (i % 1000 == 0) {// 每1000条数据提交一次preparedStatement.executeBatch();connection.commit();System.out.println("成功插入第 "+ i+" 条数据");}}// 处理剩余的数据preparedStatement.executeBatch();connection.commit();long spendTime = System.currentTimeMillis()-startTime;System.out.println("成功插入 30 万条数据,耗时:"+spendTime+"毫秒");} catch (SQLException e) {System.out.println("Error: " + e.getMessage());} finally {if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}