专业的JAVA编程教程与资源

网站首页 > java教程 正文

一文读懂Java中PreparedStatement对各种数据类型的批处理操作

temp10 2024-11-03 15:11:36 java教程 12 ℃ 0 评论
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

class DataItem {
    private int integerField;
    private String stringField;
    private double doubleField;
    private Date dateField;
    private BigDecimal bigDecimalField;

    public DataItem(int integerField, String stringField, double doubleField, Date dateField, BigDecimal bigDecimalField) {
        this.integerField = integerField;
        this.stringField = stringField;
        this.doubleField = doubleField;
        this.dateField = dateField;
        this.bigDecimalField = bigDecimalField;
    }

    public int getIntegerField() {
        return integerField;
    }

    public String getStringField() {
        return stringField;
    }

    public double getDoubleField() {
        return doubleField;
    }

    public Date getDateField() {
        return dateField;
    }

    public BigDecimal getBigDecimalField() {
        return bigDecimalField;
    }
}

public class BatchProcessingWithVariousDataTypes {
    public static void main(String[] args) {
        List<DataItem> dataList = new ArrayList<>();
        dataList.add(new DataItem(1, "Item1", 3.14, new Date(System.currentTimeMillis()), new BigDecimal("10.5")));
        dataList.add(new DataItem(2, "Item2", 2.718, new Date(System.currentTimeMillis() + 86400000), null));
        dataList.add(new DataItem(3, "Item3", 1.618, new Date(System.currentTimeMillis() + 172800000), new BigDecimal("15.8")));

        try {
            // 假设你的数据库连接信息
            String url = "jdbc:mysql://localhost:3306/mydb";
            String username = "your_username";
            String password = "your_password";
            Connection connection = DriverManager.getConnection(url, username, password);
            connection.setAutoCommit(false);

            String sql = "INSERT INTO data_table (integer_column, string_column, double_column, date_column, big_decimal_column) VALUES (?,?,?,?,?)";
            PreparedStatement pstm = connection.prepareStatement(sql);

            for (DataItem data : dataList) {
                pstm.setInt(1, data.getIntegerField());
                if (data.getStringField() == null) {
                    pstm.setNull(2, java.sql.Types.VARCHAR);
                } else {
                    pstm.setString(2, data.getStringField());
                }
                pstm.setDouble(3, data.getDoubleField());
                if (data.getDateField() == null) {
                    pstm.setNull(4, java.sql.Types.DATE);
                } else {
                    pstm.setDate(4, data.getDateField());
                }
                if (data.getBigDecimalField() == null) {
                    pstm.setNull(5, java.sql.Types.DECIMAL);
                } else {
                    pstm.setBigDecimal(5, data.getBigDecimalField());
                }
                pstm.addBatch();
            }

            int[] updateCounts = pstm.executeBatch();
            connection.commit();

            pstm.close();
            connection.close();

            for (int count : updateCounts) {
                System.out.println("Affected rows: " + count);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

以下是对上述代码的详细文字说明:

一、整体功能概述

一文读懂Java中PreparedStatement对各种数据类型的批处理操作

这段 Java 代码的主要功能是使用批处理的方式将包含多种数据类型(整数、字符串、双精度浮点数、日期和BigDecimal)的对象列表插入到数据库中。同时,它还处理了各个数据类型可能为null的情况,在插入数据时将null值转换为数据库中的相应空值表示。

二、主要类和对象

  1. DataItem类:这个类定义了一个数据项,包含五个字段:整数类型的integerField、字符串类型的stringField、双精度浮点数类型的doubleField、日期类型的dateField和BigDecimal类型的bigDecimalField。构造函数用于初始化这些字段,并且提供了相应的 getter 方法来获取各个字段的值。
  2. BatchProcessingWithVariousDataTypes类:这个类包含了程序的主要执行逻辑。

三、主要方法执行流程

  1. 创建数据项列表:在main方法中,首先创建了一个List<DataItem>类型的列表dataList。向列表中添加了三个DataItem对象,每个对象包含不同的值,其中第二个对象的bigDecimalField被设置为null,以模拟可能出现的空值情况。
  2. 建立数据库连接:指定数据库连接的 URL(jdbc:mysql://localhost:3306/mydb)、用户名(your_username)和密码(your_password)。使用DriverManager.getConnection方法建立与数据库的连接。设置连接的自动提交为false,以便在批处理结束后手动提交事务。
  3. 准备 SQL 语句和批处理:创建一个 SQL 插入语句字符串sql,指定要插入的表为data_table,以及各个字段的名称和顺序。使用数据库连接创建一个PreparedStatement对象pstm,传入 SQL 语句。遍历数据项列表,对于每个DataItem对象:设置PreparedStatement对象的各个参数,分别对应整数、字符串、双精度浮点数、日期和BigDecimal类型的字段。如果某个字段的值为null,根据字段的类型调用相应的setNull方法,设置为数据库中的空值表示。例如,如果字符串字段为null,则调用pstm.setNull(2, java.sql.Types.VARCHAR)。如果字段不为null,则调用相应的setXxx方法设置参数值。例如,如果字符串字段不为null,则调用pstm.setString(2, data.getStringField())。将当前设置好参数的 SQL 语句添加到批处理中,调用pstm.addBatch()。
  4. 执行批处理和提交事务:调用pstm.executeBatch()方法执行批处理,该方法返回一个整数数组,表示每个 SQL 语句影响的行数。调用connection.commit()方法提交事务,将批处理中的所有插入操作永久保存到数据库中。
  5. 关闭资源:遍历批处理执行结果数组,打印每个 SQL 语句影响的行数。关闭PreparedStatement对象和数据库连接,释放资源。

通过以上步骤,程序实现了使用批处理将包含多种数据类型且可能包含空值的数据项插入到数据库中,同时确保了对空值的正确处理,提高了数据插入的效率和准确性。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表