例如,Order中有List<OrderItem>,需要保存Order 和 OrderItem
在service层只有Order参数,此时,应该抽取出两个dao层方法,一个用来保存Order,一个用来保存OrderItem,而不是把参数
Order传递到Dao层,在获取OrderItem。
注:保持订单和保持订单项必须保持统一事务,传递的Connection必须一致
service层:做业务数据处理,调用dao层执行语句。
@Override
public void saveOrder(Order order) throws Exception {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
conn.setAutoCommit(false);
//保存订单
dao.saveOrder(conn,order);
//保持订单项
for(OrderItem orderItem:order.getList()){
dao.saveOrderItem(conn,orderItem);
}
conn.commit();
} catch (Exception e) {
if(null != conn){
conn.rollback();
}
e.printStackTrace();
}finally{
JDBCUtils.closeConn(conn);
}
}
dao层:通常只负责执行sql,不做业务数据处理。
@Override
public void saveOrder(Connection conn, Order order) throws Exception {
QueryRunner qr = new QueryRunner();
//保存order表
String orderSql = "insert into orders values (?,?,?,?,?,?,?,?)";
Object[] orderParams = {order.getOid(),order.getOrdertime(),order.getTotal(),
order.getState(),order.getAddress(),order.getName(),order.getTelephone(),
order.getUser().getUid()};
qr.update(conn, orderSql, orderParams);
}
@Override
public void saveOrderItem(Connection conn, OrderItem orderItem) throws Exception {
QueryRunner qr = new QueryRunner();
String orderItemSql = "insert into orderitem values (?,?,?,?,?)";
Object[] orderItemParamms = {orderItem.getItemid(),orderItem.getQuantity(),orderItem.getTotal(),
orderItem.getProduct().getPid(),orderItem.getOrder().getOid()};
qr.update(conn,orderItemSql,orderItemParamms);
}