网站首页 > java教程 正文
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 代码的主要功能是使用批处理的方式将包含多种数据类型(整数、字符串、双精度浮点数、日期和BigDecimal)的对象列表插入到数据库中。同时,它还处理了各个数据类型可能为null的情况,在插入数据时将null值转换为数据库中的相应空值表示。
二、主要类和对象
- DataItem类:这个类定义了一个数据项,包含五个字段:整数类型的integerField、字符串类型的stringField、双精度浮点数类型的doubleField、日期类型的dateField和BigDecimal类型的bigDecimalField。构造函数用于初始化这些字段,并且提供了相应的 getter 方法来获取各个字段的值。
- BatchProcessingWithVariousDataTypes类:这个类包含了程序的主要执行逻辑。
三、主要方法执行流程
- 创建数据项列表:在main方法中,首先创建了一个List<DataItem>类型的列表dataList。向列表中添加了三个DataItem对象,每个对象包含不同的值,其中第二个对象的bigDecimalField被设置为null,以模拟可能出现的空值情况。
- 建立数据库连接:指定数据库连接的 URL(jdbc:mysql://localhost:3306/mydb)、用户名(your_username)和密码(your_password)。使用DriverManager.getConnection方法建立与数据库的连接。设置连接的自动提交为false,以便在批处理结束后手动提交事务。
- 准备 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()。
- 执行批处理和提交事务:调用pstm.executeBatch()方法执行批处理,该方法返回一个整数数组,表示每个 SQL 语句影响的行数。调用connection.commit()方法提交事务,将批处理中的所有插入操作永久保存到数据库中。
- 关闭资源:遍历批处理执行结果数组,打印每个 SQL 语句影响的行数。关闭PreparedStatement对象和数据库连接,释放资源。
通过以上步骤,程序实现了使用批处理将包含多种数据类型且可能包含空值的数据项插入到数据库中,同时确保了对空值的正确处理,提高了数据插入的效率和准确性。
猜你喜欢
- 2024-11-03 初识java—(五十)输出流(java的输出)
- 2024-11-03 问题:Java的输入输出流包括 【10】 、字符流、文件流、对象流以
- 2024-11-03 JAVA中如何用字节输入输出流实现文件复制 有配图 有源码
- 2024-11-03 Java continue语句详解分享~(java的continue)
- 2024-11-03 Java 控制台输入输出操作记录(java如何从控制台输入一个数)
- 2024-11-03 高性能 - MySQL 之 Explain 输出分析
- 2024-11-03 零基础学 python(三)(完全零基础学python)
- 2024-11-03 《极简Java新手编程之道》6.4.2 continue语句
- 2024-11-03 Python3 输入和输出(python输入与输出)
- 2024-11-03 Java异常处理中throw与throws关键字的用法及区别
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)