0

我有一个 java 中的 store 程序和一个在 access 中创建的数据库。我的数据库中已经有 2 个表,分别是客户表和产品表。

我想添加一个订单表,其中它的主键是一个自动编号和一个 order_line 表来完成这个应用程序。我想要这样的桌子..

customer(cust_id, name, ....)
orders(order_no, cust_id, date_purchased,...)
order_line(order_no, product_id, ...)
products(product_id, product_name, price,....)

当客户购买产品时,我可以在订单表中插入新值。我不清楚的是如何在 order_line 表中也插入,因为我在 access 中创建的 order_no 是 autonumber 类型。

我会先做一个 select 语句来获取 order_no 值,然后将其放入 order_line 表中的 order_no 中吗?或者我只需要把它放在一个查询中。

有这方面经验的人吗?任何建议表示赞赏。

4

2 回答 2

1

插入 orders 和 order_line 表应该在一个事务中发生。这样做时,如果您使用纯 JDBC 将记录插入到订单表中,您可以将 order_no 注册为您的 OUT 参数,CallableStatement并在执行语句后获取值并用于设置记录的order_no属性order_line

 // begin transaction
 connection.setAutoCommit(false);

 CallableStatement cs = connection.prepareCall(INSERT_STMT_INTO_ORDERS_TABLE);
 cs.registerOutParameter(1, Types.INT);
 int updateCount = cs.execute();
 // Check the update count.
 long orderNo = cs.getInt(1);

 // CallableStatement csLine for inserting into order_line table
 // for (OrderLine line: orderLines) {
 //     Set the orderNo in line.
 //     set paramters on csLine.
 //     csLine.addBatch();
 // }
 // run the batch and verify update counts
 connection.commit();

 // connection.rollback() on error.
于 2012-10-26T14:50:37.040 回答
1

JDBC方式(如果你喜欢数据库独立),是使用getGeneratedKeys()语句的方法。

使用setAutoCommit(false),然后使用选项执行第一个查询Statement.RETURN_GENERATED_KEYS(例如,对于PreparedStatement)。

然后使用该getGeneratedKeys()方法检索键(注意:按列名引用,因为确切的实现和返回的列数取决于驱动程序的实现。

并使用检索到的密钥执行第二条语句。

最后,commit().

于 2012-10-26T15:00:03.163 回答