iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >java 批量插入数据
  • 209
分享到

java 批量插入数据

mybatismysql批量插入 2023-09-03 12:09:07 209人浏览 薄情痞子
摘要

批量插入数据,常见的使用mybatis foreach 插入的方式,原始的方式和批处理 1,常见的mybatis foreach xml insert into CODEINFO (CODE_TYPE, CODE, MEAN, STAT

批量插入数据,常见的使用mybatis foreach 插入的方式,原始的方式和批处理

1,常见的mybatis foreach

xml

insert into  CODEINFO (CODE_TYPE, CODE, MEAN, STATE, SORT_ID)values(#{item.codeType}, #{item.code}, #{item.remark},  #{item.state}, #{item.sortId})

mapper:

int insertBatch(@Param("records") List records);

对于数据量不是很大的,基本够用。如果同步数据特别慢,再考虑其它的方式。或者晚上凌晨再同步数据。

2,原始的方式

批量插入

public void insertBatach(){        Connection conn=null;        PreparedStatement ps=null;        try {            long start = System.currentTimeMillis();            conn = JDBCUtils.getConnection();            conn.setAutoCommit(false);            String sql="INSERT INTO CODEINFO (CODE_TYPE, CODE, MEAN,STATE, SORT_ID) VALUES (?, ?, ?, ?, ?)";            ps = conn.prepareStatement(sql);            for(int i=1;i<=20000;i++){                ps.setObject(1, "TEST_INSERT_BATCH");                ps.setObject(2, "0"+i);                ps.setObject(3, "name_"+i);                ps.setObject(4, "0SA");                ps.setObject(5, i);                //1.sql                ps.addBatch();                if(i%500==0){                    //2.执行batch                    ps.executeBatch();                    //3.清空batch                    ps.clearBatch();                }            }            //提交数据            conn.commit();            long end = System.currentTimeMillis();            System.out.println("批量插入花费的时间为:"+(end-start));        } catch (Exception e) {            e.printStackTrace();        } finally{            JDBCUtils.close(conn, ps);        }    }

数据库连接:

import java.io.IOException;import java.io.InputStream;import java.sql.*;import java.util.Properties;public class JDBCUtils {    private static String url;    private static String user;    private static String passWord;    private static  Connection conn = null;    //    静态代码块    static{                InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("sql.properties");        Properties p=new Properties();        try {            p.load(in);        } catch (IOException e) {            e.printStackTrace();        }//        读文件给变量赋值        String driver = p.getProperty("driver");        url = p.getProperty("url");        user = p.getProperty("user");        password = p.getProperty("password");        try {            Class.forName(driver);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }    //    构造获得数据库链接方法    public static Connection getConnection() {        try {            conn = DriverManager.getConnection(url, user, password);        } catch (SQLException e) {            e.printStackTrace();        }        return conn;    }    //    构造关闭流的方法    public static void close(Connection conn,Statement stat) {        if (stat != null) {            try {                stat.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (conn != null) {            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }    //    重载关闭流的方法    public static void close(Connection conn,Statement stat, ResultSet rs) {        if (rs != null) {            try {                rs.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (stat != null) {            try {                stat.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (conn != null) {            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

原始的方法写起来麻烦些。

3,批处理

MybatisGeneralBatchUtils 

import org.apache.ibatis.session.ExecutorType;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.transaction.support.TransactionSynchronizationManager;import java.util.List;import java.util.function.BiFunction;@Componentpublic class MybatisGeneralBatchUtils {    private static final Logger logger = LoggerFactory.getLogger(MybatisGeneralBatchUtils.class);        private static final int BATCH_SIZE = 1000;        public  int batchUpdateOrInsert(List data, Class mapperClass, BiFunction function)  {        int i = 1;        SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) SpringUtil.getBean("sqlSessionFactory");        SqlSession batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);        try {            U mapper = batchSqlSession.getMapper(mapperClass);            int size = data.size();            for (T element : data) {                function.apply(element, mapper);                if ((i % BATCH_SIZE == 0) || i == size) {                    batchSqlSession.flushStatements();                }                i++;            }            // 非事务环境下强制commit,事务情况下该commit相当于无效            batchSqlSession.commit(!TransactionSynchronizationManager.isSynchronizationActive());        } catch (Exception e) {            batchSqlSession.rollback();            logger.error("batchUpdateOrInsert", e);        } finally {            batchSqlSession.close();        }        return i - 1;    }}

SpringUtil 

import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;@Componentpublic class SpringUtil implements ApplicationContextAware {    private static ApplicationContext applicationContext;    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {         SpringUtil.applicationContext = applicationContext;    }    public static Object getBean(String name) {        return applicationContext.getBean(name);    }    public static  T getBean(Class clazz) {        return applicationContext.getBean(clazz);    }}

调用:

mapper:

int insertSelective(CodeInfo codeInfo);

xml:

insert into CODEINFOCODE_TYPE,CODE,MEAN,STATE,SORT_ID,#{codeType,jdbcType=VARCHAR},#{code,jdbcType=VARCHAR},#{mean,jdbcType=VARCHAR},#{state,jdbcType=VARCHAR},#{sortId,jdbcType=VARCHAR},

service:

    @Resource    private MybatisGeneralBatchUtils mybatisGeneralBatchUtils;    public int batchInsertData(List codeInfos){        return mybatisGeneralBatchUtils.batchUpdateOrInsert(codeInfos, CodeInfoMapper.class,                (item, codeInfoMapper) -> codeInfoMapper.insertSelective(item));    }

这个方法看起来比较通用,但是我自己测的话,速度反而比较慢。可能是因为模拟的字段和数据都比较少;后面有遇到数据量大的,再进行一个比对。

官网推荐的方法:

MyBatis文档中写批量插入的时候,是推荐使用另外一种方法 中 Batch Insert Support 标题里的内容

try(SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {        SimpleTableMapper mapper = session.getMapper(SimpleTableMapper.class);        List records = getRecordsToInsert(); // not shown        BatchInsert 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(RenderingStrategies.MYBATIS3);        batchInsert.insertStatements().forEach(mapper::insert);        session.commit();    }

总结

     如果数据量不大,能第一种就够了。如果数据内容多,字段又多,试试其它的方式,看下效率是否有更快。 同步数据,还是适合晚上的时候,用定时器去跑。

来源地址:https://blog.csdn.net/qq_35461948/article/details/130195282

您可能感兴趣的文档:

--结束END--

本文标题: java 批量插入数据

本文链接: https://www.lsjlt.com/news/392182.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java 批量插入数据
    批量插入数据,常见的使用mybatis foreach 插入的方式,原始的方式和批处理 1,常见的mybatis foreach xml insert into CODEINFO (CODE_TYPE, CODE, MEAN, STAT...
    99+
    2023-09-03
    mybatis mysql 批量插入
  • java实现批量插入数据
    日常工作或者学习中,可能会遇到批量插入数据的需求,一般情况下数据量少的时候,我们会直接调用批量接口插入数据即可,当数据量特别大时,可能由于数据库限制,插入的数据最多不能超过100条(假如限制100条)...
    99+
    2023-09-03
    java 数据库 oracle
  • SQL批量插入数据
    MS SQL Server数据库批量插入数据的sql语句总结:第一种:insert into tb_NameList(Name,InsertDate,UpdateDate)values('aa',GETDA...
    99+
    2024-04-02
  • C# MySQL 插入大批量数据
    一、定义DataTable的数据类型 private DataTable GetDataTableFromExternalSource(string tablename) { DataTable dat...
    99+
    2023-09-08
    mysql c# 数据库
  • SpringBootMybatis批量插入Oracle数据库数据
    目录前端数据数据表结构后端Controller:mapperxml前端数据 有如下需求,前端提交一个对象cabinData,保存到数据表中,对象结构如下:  {      "ship...
    99+
    2024-04-02
  • python批量插入数据到mysql
    使用python批量插入数据到mysql的三种方法 自动化单条insert # -*- coding:utf-8 -*-import timefrom pymysql import *# 装饰器,计算插入50000条数据需要的时间def t...
    99+
    2023-09-06
    mysql 数据库 sql
  • sqlite如何批量插入数据
    在SQLite中,可以使用INSERT INTO语句以及UNION ALL语法来批量插入数据。以下是一个示例代码: INSE...
    99+
    2024-04-10
    sqlite
  • MyBatis如何批量插入大量数据
    这篇文章将为大家详细讲解有关MyBatis如何批量插入大量数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBa...
    99+
    2023-06-22
  • Java实现百万级数据量向MySQL批量插入
    业务背景: 大数据向mysql表同步百万级数量,我们需要将大数据表里同步过来的数据分别向三张业务表做数据同步,最终将业务表的数据展示给前台进行相关业务操作。 数据量级 大数据表:700w数据量 三张业务表分别需要同步:23w、80w、680...
    99+
    2023-08-25
    mysql java mybatis
  • 使用java怎么向mysql数据库批量插入数据
    今天就跟大家聊聊有关使用java怎么向mysql数据库批量插入数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. An...
    99+
    2023-06-14
  • 数据库中怎么批量插入数据
    本文小编为大家详细介绍“数据库中怎么批量插入数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“数据库中怎么批量插入数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。批量插入批量插入使用 execute...
    99+
    2023-06-08
  • 大批量数据分批批量插入或更新(Mybatis+MySQL)
    大批量数据分批批量插入或更新 在MySQL数据库的前提下,插入或更新大批量数据。首先批量插入需要考虑到以下几个因素: 数据库一次可以承受多大或者多少条数据的插入批量插入是否会占用Mysql资源太久,影响系统整体使用性能代码中的集合是否会造成...
    99+
    2023-08-30
    mybatis mysql 数据库 java spring boot
  • MySQL中怎么批量插入数据
    本篇文章为大家展示了MySQL中怎么批量插入数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.创建测试表mysql> show create table ...
    99+
    2024-04-02
  • Mysql大数据批量插入方法
    MySQL是当前最流行的关系型数据库之一,大数据批量插入是MySQL中常用的操作之一。在处理大量数据时,如果一条一条地插入会极大地影响效率,因此批量插入是一个更好的选择,可以大大提高数据的处理速度。下面介绍几种MySQL大数据批量插入的方法...
    99+
    2023-09-14
    mysql 大数据 数据库
  • SQLServer 中怎样批量插入数据
    SQLServer 中怎样批量插入数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。运行下面的脚本,建立测试数据库和表值参数。、代码如下:...
    99+
    2024-04-02
  • SQL中怎么批量插入数据
    SQL中怎么批量插入数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.创建表。2.创建表值参数类型我们打开查询分析器,然后...
    99+
    2024-04-02
  • MyBatis中怎么批量插入数据
    在MyBatis中,可以使用foreach标签来实现批量插入数据。具体步骤如下: 创建一个Mapper接口,定义一个insertB...
    99+
    2024-03-07
    MyBatis
  • 【JDBC】PreparedStatement实现批量插入数据
    题目:【JDBC】PreparedStatement实现批量插入数据 前言: PreparedStatement除了解决Statement的拼串、sql注入问题之外,还可以实现以下操作 Prepare...
    99+
    2023-09-09
    数据库 java mysql
  • MyBatis批量插入大量数据(1w以上)
    问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBatis开始报错。项目使用技术:SpringBoot、MyBatis 批量插入碰到的问题...
    99+
    2024-04-02
  • MySql批量插入时如何不重复插入数据
    目录前言一、insert ignore into二、on duplicate key update三、replace into总结前言 Mysql插入不重复的数据,当大数据量的数据需...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作