美文网首页
数据库操作-批量

数据库操作-批量

作者: YDDMAX_Y | 来源:发表于2019-11-06 19:33 被阅读0次
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");

转化为:

INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2");

MySql Docs中也提到过这个trick,如果要优化插入速度时,可以将许多小型操作组合到一个大型操作中。理想情况下,这样可以在单个连接中一次性发送许多新行的数据,并将所有索引更新和一致性检查延迟到最后才进行。
但是下面的sql却有性能瓶颈,一般按经验来说,一次性插20~50行数量是比较合适的,时间消耗也能接受。

<insert id="batchInsert" parameterType="java.util.List">
   insert into USER (id, name) values
   <foreach collection="list" item="model" index="index" separator=","> 
      (#{model.id}, #{model.name})
   </foreach>
</insert>

批量插入大量的数据需要使用下面的batch模式。

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
    SimpleTableMapper mapper = session.getMapper(SimpleTableMapper.class);
    List<SimpleTableRecord> records = getRecordsToInsert(); // not shown
    BatchInsert<SimpleTableRecord> batchInsert = insert(records)
            .into(simpleTable)
            .map(id).toProperty("id")
            .map(firstName).toProperty("firstName")
            .map(lastName).toProperty("lastName")
            .map(birthDate).toProperty("birthDate")
            .map(employed).toProperty("employed")
            .map(occupation).toProperty("occupation")
            .build()
            .render(RenderingStrategy.MYBATIS3);
    batchInsert.insertStatements().stream().forEach(mapper::insert);
    session.commit();
} finally {
    session.close();
}

即基本思想是将 MyBatis session 的 executor type 设为 Batch ,然后多次执行插入语句。就类似于JDBC的下面语句一样。

Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=false&rewriteBatchedStatements=true","root","root");
connection.setAutoCommit(false);
PreparedStatement ps = connection.prepareStatement(
        "insert into tb_user (name) values(?)");
for (int i = 0; i < stuNum; i++) {
    ps.setString(1,name);
    ps.addBatch();
}
ps.executeBatch();
connection.commit();
connection.close();

相关文章

  • 数据库批量操作哪种方法更快?

    在工作中经常遇到批量新增数据到数据库的业务,我们都知道大数据量操作时,批量操作会带来性能的提升,但选择哪种批量操作...

  • mybatis 批量操作

    一些时候需要将一些数据批量的进行操作,比如:根据ids批量查询、更新、删除、将一个集合的数据插入数据库。简单的操作...

  • MongoDB与MySQL效率对比

    本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite()方法的使用。顺带与关系型数据库My...

  • RedisTemplate批量操作

    RedisTemplate批量添加操作教程,利用pipeline批量操作;multiSet()批量操作;for循环...

  • 数据库操作-批量

    转化为: 在MySql Docs中也提到过这个trick,如果要优化插入速度时,可以将许多小型操作组合到一个大型操...

  • DataFrame数据保存到mysql数据库中

    本篇文章主要基于python3.6与pandas实现以下数据库操作功能: 创建数据库 数据库创建表 数据库批量插入...

  • preparedstatement 与编译

    当批量查询及修改数据是,需要通过与编译方式对数据库进行操作,即通过perparedstatement对象进行操作。...

  • 六、Flutter之数据库

    Flutter中操作数据库可以通过sqflite来实现,支持事务和批量操作,支持在Android、iOS后台线程执...

  • mybatis-批量插入与更新

    批量操作只需要连接一次数据库,在mybatis中执行一次sql即可.相比逐条操作,频繁打开断开数据库连接,效率会提...

  • PY3 批量导入EXCEL到数据库脚本模板

    1、支持分批导入(可配置) 2、批量导入降低数据库操作 3、批量数据错误会自动重新生成导入数据最终只剩下错误数据,...

网友评论

      本文标题:数据库操作-批量

      本文链接:https://www.haomeiwen.com/subject/jfrpbctx.html