Java批量数据入库实现

作为一名经验丰富的开发者,我将帮助你了解如何实现Java批量数据入库。在本文中,我将向你展示整个流程,并提供每个步骤所需的代码和注释,以帮助你更好地理解。

流程概述

在实现Java批量数据入库之前,我们需要明确以下几个步骤:

  1. 准备数据库连接和表结构
  2. 读取数据源
  3. 批量处理数据
  4. 执行入库操作

现在让我们一步一步来实现这些步骤。

准备数据库连接和表结构

首先,我们需要准备数据库连接和表结构。你可以使用Java中的JDBC(Java Database Connectivity)来建立数据库连接并创建表。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class DatabaseUtils {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase";
    private static final String DB_USER = "username";
    private static final String DB_PASSWORD = "password";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
    }

    public static void createTable() throws SQLException {
        Connection connection = getConnection();
        Statement statement = connection.createStatement();
        String sql = "CREATE TABLE IF NOT EXISTS mytable (id INT PRIMARY KEY, name VARCHAR(50))";
        statement.execute(sql);
        statement.close();
        connection.close();
    }
}

上述代码示例中,我们使用了MySQL数据库,并创建了一个名为mytable的表,该表包含idname两个字段。

读取数据源

在准备好数据库连接和表结构后,我们需要读取数据源。这里假设数据源是一个CSV文件。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DataReader {
    private static final String CSV_FILE_PATH = "data.csv";

    public static void main(String[] args) {
        try {
            // 创建表
            DatabaseUtils.createTable();
            
            // 读取CSV文件
            BufferedReader reader = new BufferedReader(new FileReader(CSV_FILE_PATH));
            String line;
            while ((line = reader.readLine()) != null) {
                // 处理每一行数据并插入数据库
                processData(line);
            }
            reader.close();
        } catch (IOException | SQLException e) {
            e.printStackTrace();
        }
    }

    public static void processData(String data) throws SQLException {
        Connection connection = DatabaseUtils.getConnection();
        String sql = "INSERT INTO mytable (id, name) VALUES (?, ?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        
        // 解析CSV数据并绑定参数
        String[] attributes = data.split(",");
        statement.setInt(1, Integer.parseInt(attributes[0]));
        statement.setString(2, attributes[1]);
        
        // 执行插入操作
        statement.executeUpdate();
        
        statement.close();
        connection.close();
    }
}

在上述代码示例中,我们读取名为data.csv的CSV文件,并将每行数据传递给processData方法进行处理和插入操作。

批量处理数据

为了提高效率,我们可以批量处理数据,而不是每次插入一条数据。这将减少与数据库的交互次数,提高整体性能。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DataReader {
    private static final String CSV_FILE_PATH = "data.csv";
    private static final int BATCH_SIZE = 100; // 批量插入的大小

    public static void main(String[] args) {
        try {
            // 创建表
            DatabaseUtils.createTable();

            // 读取CSV文件
            BufferedReader reader = new BufferedReader(new FileReader(CSV_FILE_PATH));
            String line;
            int count = 0;
            Connection connection = DatabaseUtils.getConnection();
            String sql = "INSERT INTO mytable (id, name) VALUES (?, ?)";
            PreparedStatement statement = connection.prepareStatement(sql);

            while ((line = reader.readLine()) != null) {
                // 处理每一行数据并添加到批处理中
                processData(line, statement);
                count++;

                if (count % BATCH_SIZE == 0) {
                    // 批处理
                    statement.executeBatch();
                }
            }

            // 最后一次批处理
            statement.executeBatch();

            reader.close();
            statement.close();
            connection.close();
        } catch (IOException | SQLException e) {
            e