我在java中有一个商店程序,在访问中有一个数据库。我的数据库中已有2个表,即customers表和products表。
我想添加一个订单表,其中主键是自动编号和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吗?或者我只需要将它放在一个查询中。
有经验的人吗?任何建议都表示赞赏。
答案 0 :(得分:1)
插入订单和order_line表应该在单个事务中进行。执行此操作时,如果您使用普通JDBC将记录插入到订单表中,则可以register the order_no as an OUT parameter中的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.
答案 1 :(得分:1)
JDBC-way(如果你喜欢数据库独立性)是使用getGeneratedKeys()
语句方法。
使用setAutoCommit(false)
,然后使用选项Statement.RETURN_GENERATED_KEYS
执行第一个查询(例如PreparedStatement)。
然后使用getGeneratedKeys()
方法检索密钥(注意:按列名引用,因为确切的实现和返回列的数量取决于驱动程序的实现。
使用检索到的密钥执行第二个语句。
最后,commit()
。