MyBatis批量操作DML
发布日期:2021-05-07 13:38:28 浏览次数:20 分类:精选文章

本文共 2073 字,大约阅读时间需要 6 分钟。

Hibernate批量插入数据的最佳实践

在Hibernate应用中,批量插入数据是提升性能的重要优化手段。以下是关于批量操作的几种常见方法及其优缺点分析。

一、使用SessionFactory.openSession(ExecutorType.BATCH)的推荐做法

推荐使用sessionFactory.openSession(ExecutorType.BATCH)来实现批量操作,这种方式适用于大多数数据库。其核心优势在于:

  • 预编译SQL一次:只需要编写一次插入语句,后续只需设置参数值即可。
  • 简化管理:无需手动执行多次DML语句,降低代码复杂度。

示例代码

public static void addBatchStudents() throws IOException {
String resource = "conf.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFactory.openSession(ExecutorType.BATCH);
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
Student stu = new Student((int)(Math.random()*9000) +1000, "abc", 44, "xx");
studentMapper.addStudent(stu);
}
long end = System.currentTimeMillis();
System.out.println(end - start);
session.commit();
session.close();
}

二、不推荐的批量插入方式:拼接SQL

对于某些特定数据库(如Oracle),直接拼接SQL可能更高效。以下是几种常见方法:

  • 使用存储过程或函数

    • 优点:存储过程能够显著提升性能,尤其适用于复杂查询。
    • 示例
      -- 存储函数示例
      create or replace function add_student(p_stuno number, p_stuname varchar) return number as
      begin
      insert into student values(p_stuno, p_stuname);
      return 1;
      end;
  • 批量插入多行数据

    • 适用于:MySQL等支持多行插入的数据库。
    • 示例
      insert into student(stuno, stuname) values(100, 'zsx'), (200, 'lsx'), (200, 'lsx'), (200, 'lsx');
  • 使用数据库工具

    • 适用于:需要快速批量处理的场景,如Oracle的SQL Loader或数据库迁移工具。
  • 三、数据库常见处理方式

    • Oracle

      -- 示例:批量插入数据
      insert into student(stuno, stuname)
      select stu_no, stu_name from student_old;
    • MySQL

      -- 示例:批量插入数据
      insert into student(stuno, stuname) values(100, 'zsx'), (200, 'lsx'), (200, 'lsx'), (200, 'lsx');

    四、注意事项

  • 数据库连接设置

    • 确保mysql.url正确配置,尤其是在使用多条数据源时。
    • 对于MySQL,建议设置allowMultiQueries=true以支持批量插入。
  • 性能优化

    • 合理设置批量处理的大小,避免一次性插入过多数据导致内存不足。
    • 对于复杂的批量任务,建议分批次处理,减少数据库压力。
  • 事务管理

    • 使用session.commit()手动提交事务,确保数据的持久性。
    • 避免在批量操作中使用自动提交模式,以防数据不一致。
  • 五、总结

    批量插入数据是一种高效的数据库操作方式,适用于需要快速处理大量数据的场景。在Hibernate应用中,推荐使用ExecutorType.BATCH模式,既能实现快速批量操作,又能保持代码的简洁性。对于特定数据库(如Oracle、MySQL),可以根据实际需求选择合适的批量插入方式。

    上一篇:MyBatis分页插件PageHelper
    下一篇:MyBatis插件开发基础

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月10日 04时50分12秒