JAVA高效批量插入数据到数据库demo

1、批量插入数据到sqlserver数据库:10000条数数据平均耗时1800ms

public static void main(String[] args) {

        PreparedStatement ps;

        Connection con = getConnection();

        String sql = "insert into t_s_log (ID,broswer,logcontent,loglevel,note, operatetime,operatetype,userid,username,realname) values(?,?,?,?,?,?,?,?,?,?)";

        try {

            ps = con.prepareStatement(sql);

            List<TSLog> logList = getList();

            for (TSLog log : logList) {

                ps.setString(1, log.getId());

                ps.setString(2, log.getBroswer());

                ps.setString(3, log.getLogcontent());

                ps.setShort(4, log.getLoglevel());

                ps.setString(5, log.getNote());

                ps.setDate(6, new java.sql.Date(log.getOperatetime().getTime()));

                ps.setShort(7, log.getOperatetype());

                ps.setString(8, log.getUserid());

                ps.setString(9, log.getUsername());

                ps.setString(10, log.getRealname());

                ps.addBatch();

            }

            long a = System.currentTimeMillis();

            ps.executeBatch();

            System.out.println("插入 " + logList.size() + " 条数据耗时 " + (System.currentTimeMillis() - a) + " 毫秒");

            con.commit();

            ps.clearBatch();

            ps.close();

        } catch (SQLException throwables) {

            throwables.printStackTrace();

        }

    }

    public static List<TSLog> getList() {

        List<TSLog> logList = new ArrayList<>();

        for (int i = 0; i < 10000; i++) {

            TSLog log = new TSLog();

            log.setId(UUID.randomUUID().toString().replaceAll("-", ""));

            log.setBroswer("Chrome");

            log.setLogcontent("测试");

            log.setLoglevel((short) 1);

            log.setNote("测试");

            log.setOperatetime(new Date());

            log.setOperatetype((short) 1);

            log.setUserid("402885af6745c5ae016745dfdb590014");

            log.setUsername("admin");

            log.setRealname("admin");

            logList.add(log);

        }

        return logList;

    }

    public static Connection getConnection() {

        String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

        String dbURL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=xxx";

        String userName = "xxx";

        String userPwd = "xxx";

        try {

            Class.forName(driverName);

            System.out.println("加载SQLServer驱动类成功!");

        } catch (ClassNotFoundException a) {

            System.out.println("加载SQLServer驱动失败!");

            a.printStackTrace();

        }

        Connection dbcon = null;

        try {

            dbcon = DriverManager.getConnection(dbURL, userName, userPwd);

            System.out.println("数据库连接成功!");

        } catch (SQLException e) {

            System.out.println("数据库连接失败!");

            e.printStackTrace();

        }

        return dbcon;

    }

2、批量插入数据到mysql数据库:10000条数数据平均耗时700ms

jdbc:mysql://127.0.0.1:3306/xxx&allowMultiQueries=true&rewriteBatchedStatements=true

public List<Object[]> initJDBCDemos() {

        List<Object[]> demos = new ArrayList<>();

        for (int i = 0; i < 10000; i++) {

            Object[] demo = new Object[11];

            demo[0] = i + "" + new Date();

            demo[1] = i + "name";

            demo[2] = i + "keyWord";

            demo[3] = new Date();

            demo[4] = BigDecimal.ONE;

            demo[5] = 1d;

            demo[6] = "1";

            demo[7] = 10;

            demo[8] = new Date();

            demo[9] = "fad@qq.com";

            demo[10] = "fad@qq.com";

            demos.add(demo);

        }

        return demos;

    }

    // jdbc批量插入

    @Test

    public void testJdbcInsert100000BatchSave() {

        List<Object[]> jeecgDemoList = initJDBCDemos();

        DruidDataSource dataSource = DynamicDBUtil.getDbSourceByDbKey("qyt-dd-sys");

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        long a = System.currentTimeMillis();

        String sql = "INSERT INTO  `demo`(  `id`, `name`,\n" +

                "\t\t`key_word`,\n" +

                "\t\t`punch_time`,\n" +

                "\t\t `salary_money`,\n" +

                "\t\t `bonus_money`,\n" +

                "\t\t `sex`, `age`, `birthday`,\n" +

                "\t\t  `email`, `content`)\n" +

                "\t\tVALUES (?,?,?,?,?,?,?,?,?,?,?)";

        jdbcTemplate.batchUpdate(sql, jeecgDemoList);

        System.out.println("处理" + jeecgDemoList.size() + "条数据耗时:" + (System.currentTimeMillis() - a) + "毫秒");

    }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
高效批量插入数据的方法有多种。一种方法是使用批处理语句,这样可以减少与数据库的通信次数,提高插入的效率。另一种方法是使用数据库批量插入功能,比如Oracle的批量插入语句。下面是两种方法的具体步骤: 1. 使用批处理语句: - 将要插入的数据分批处理,每次处理一定数量的数据,比如每次处理2000条数据。这样可以减少与数据库的通信次数。 - 构建插入语句,可以使用循环来生成多条插入语句,或者使用批量插入工具类,如MyBatis的BatchExecutor。 - 执行批处理语句,将数据批量插入数据库。 2. 使用数据库批量插入功能: - 根据数据库的支持情况,使用相应的批量插入语句。例如,Oracle可以使用INSERT ALL INTO...SELECT语句进行批量插入。 - 将要插入的数据构建成一个临时表或使用SELECT语句查询出来。 - 构建批量插入语句,将临时表或查询结果作为插入的源数据。 - 执行批量插入语句,将数据批量插入数据库。 总的来说,通过减少与数据库的通信次数和使用数据库批量插入功能,可以提高批量插入数据的效率。然而,具体的实现方法还取决于所使用的数据库和开发工具。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Oracle高效批量插入数据](https://blog.csdn.net/weixin_31787335/article/details/116315523)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [JAVA高效批量插入数据数据库demo](https://blog.csdn.net/qq_32292169/article/details/124801524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乱世 - 巨星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值