Java sql如何进行executeBatch()插入以返回布尔值

Posted

技术标签:

【中文标题】Java sql如何进行executeBatch()插入以返回布尔值【英文标题】:Java sql how to make executeBatch() insertion to return boolean 【发布时间】:2021-05-07 21:13:02 【问题描述】:

假设我们有一个 Person 类,其中包含与其属性相关的 setter 和 getter:

private int age
private String name
private String address
private double weight //lbs
private double height //cm

然后是它们的列表:

Person person1 = new Person(18, "Jack Harrs", "55 Albridge St", 155.20, 167.53)
Person person2 = new Person(53, "Toby Canes", "59 Albridge St", 193.43, 179.11)
Person person3 = new Person(24, "Dwayne Right", "74 W Saint St", 183.22, 183.87)
Person person4 = new Person(33, "Shelby Johnson", "99 Broad St", 123.50, 158.30)

List<Person> personsList = new ArrayList<>();
personsList.add(person1);
personsList.add(person2);
personsList.add(person3);
personsList.add(person4);

目前我通过executeBatch() 插入:

Connection con = ... 

PreparedStatement stmt = con.prepareStatement("INSERT INTO persons_table (AGE, NAME, ADDRESS, 
                                                            WEIGHT, HEIGHT) VALUES (?, ?, ?, ?, ?)");

for( Person person : personsList ) 
  stmt.setInt(1, person.getAge());
  stmt.setString(2, person.getName());
  stmt.setString(3, person.getAddress());
  stmt.setDouble(4, person.getWeight());
  stmt.setDouble(5, person.getHeight());
  stmt.addBatch();


int[] results = stmt.executeBatch();

因此,int[] results 看起来像 [1,1,..],其中 1 表示成功,x 其他数字表示失败。但是,我想根据操作是否成功返回 true 或 false。我试过只在最后做一个return true 而没有初始化一个int[] 数组但是我不知道如何在代码中解释return false 的情况?

【问题讨论】:

你不能。它是一个定义的接口。如果操作没有“成功”,那是什么意思?引发异常? 【参考方案1】:

听起来应该使用results 来确定是否所有批处理语句都成功。例如:

    ...
    int[] results = stmt.executeBatch();
    return isSuccess(results);


private void isSuccess(int[] batchUpdateResults) 
    Arrays.stream(batchUpdateResults).allMatch(updateCount -> updateCount == 1);

请注意,这要求所有批处理语句都更新了单个记录。如果任何批处理语句返回 1 以外的任何值,则将返回 false。所以成功的定义可能需要澄清一下。

此外,从示例代码中也不清楚如果抛出异常会发生什么。是否会在方法中捕获异常并返回false?

【讨论】:

对于 mysql 数据库,值 not = 1 的通常定义是什么? 我不确定您在问什么,但results 的每个元素都表示该特定查询的更新计数。【参考方案2】:

你可以试试这个:

try 
  stmt.executeBatch();
  return true;
 catch (SQLException e) 
  return false;

executeBatch() 将仅在批处理中的所有命令都成功时返回 int[],否则将抛出 SQLExceptionBatchUpdateExceptionSQLException 的子类)。

Reference to docs

【讨论】:

以上是关于Java sql如何进行executeBatch()插入以返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章

MyEclipse------executeBatch()使用方法

在executeBatch()之前如何检查Prepared Statement是不是有一些批次?

JDBC批量插入数据优化,使用addBatch和executeBatch

execute(),executeQuery(),executeUpdate()和executeBatch()的使用与区别

jdbc的executeBatch()返回正确的行计数

使用 JDBC executeBatch() 通过 appscript 批量插入 Cloud SQL,耗时过多