繁体   English   中英

从列表中插入多条记录<person>进入 Oracle 数据库?</person>

[英]Inserting multiple records from a List<Person> into Oracle DB?

假设我们有一个 Person class 具有与其属性相关的 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);

有没有办法构建一个 SQL 语句,将它们全部插入 Oracle 数据库? 我在想它应该看起来像:

INSERT INTO persons_table (AGE, NAME, ADDRESS, WEIGHT, HEIGHT, REGISTRATION_DATE) 
VALUES (18, "Jack Harrs", "55 Albridge St", 155.20, 167.53, CURRENT_TIMESTAMP),
       (53, "Toby Canes", "59 Albridge St", 193.43, 179.11, CURRENT_TIMESTAMP),
       (24, "Dwayne Right", "74 W Saint St", 183.22, 183.87, CURRENT_TIMESTAMP),
       (33, "Shelby Johnson", "99 Broad St", 123.50, 158.30, CURRENT_TIMESTAMP)

但这不起作用,我不知道如何在 Java 中构建 SQL 语句,让它看起来像那样。 我已经阅读了有关批量插入的一些内容,但我也不知道该怎么做,因为这很少会使用数据库。 如果可能的话,我是否可以要求两种方法,一种是单个查询(如果可能),另一种是批量插入?

使用普通的 JDBC 你可以这样做:

Connection con = ... //get it from somewhere

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

//add a batch for each person
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();
}

//execute the batch and get results for each query in the order they have been added
int[] results = stmt.executeBatch();

编辑

根据要求,您可以通过以下方式过滤插入的人员。 请注意,您仍然需要阅读驱动程序可能返回的状态代码的文档,特别是在特殊情况下,但假设我们得到1表示成功插入的人,而-3 (参见PreparedStatement.EXECUTE_FAILED )表示插入失败:

List<Person> insertedPersons = new ArrayList<>();

for( int i = 0; i < results.length; i++ ) {
  int status = results[i];

  if( status == 1 ) { //or any other status that represents success
    insertedPersons.add(personsList.get(i));
  }
}

编辑:如果其中一个语句失败, executeBatch()实际上可能会抛出BatchUpdateExeption 此异常还包含与语句顺序相同的结果数组,但取决于驱动程序执行可能会在第一个异常处停止,并且该数组可能仅包含直到异常点的状态。

上面的方法仍然有效,但您可以像这样更改调用:

int[] results;
try { 
  results = stmt.executeBatch();
} catch(BatchUpdateException e) { 
  results = e.getUpdateCounts();
}

//in some cases the exception might return null if execution failed right away so initialize to an empty array to prevent a NPE
if( results == null ) {
  results = new int[0];
}

对于 oracle,插入多行的方法之一如下:

INSERT INTO persons_table (AGE, NAME, ADDRESS, WEIGHT, HEIGHT) 
select 18, "Jack Harrs", "55 Albridge St", 155.20, 167.53 from dual
union all
select 53, "Toby Canes", "59 Albridge St", 193.43, 179.11 from dual
union all
Select 24, "Dwayne Right", "74 W Saint St", 183.22, 183.87 from dual
union all
Select 33, "Shelby Johnson", "99 Broad St", 123.50, 158.30 from dual

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM