使用纯JDBC

时间:2017-01-04 18:58:46

标签: java jdbc transactions dao

想象一下,我有课程AccountPayment

班级帐户

public class Account {
    private Integer id;
    private Integer accountHolderId;
    private BigDecimal balance;
    private Byte status;  // 0: account is fine, 1: locked, can't make payments.

    // Getters and Setters
}

课程付款

public class Payment {
    private Integer id;
    private BigDecimal amount;
    private Integer senderId;
    private Integer receiver;
    private Integer paymentStatusId;

    // Getters and Setters
}


DAO图层包含实现CRUD方法的AccountDaoPaymentDao类。下一个是服务层,它具有AccountServicePaymentService类,可以在DAO类之上执行其他操作。

由于我正在使用货币/货币,我正在使用transactions。我在 DAO类中使用它们。

我的DaoFactory类有一个方法createConnection(),它为每个特定的DaoFactory(例如MySqlDaoFactory)返回一个Connection对象,该对象已使用connection.setAutoCommit(false);启用了事务功能。因此,每次与数据库建立连接时,我都会手动使用commit()rollback()方法。

问题

我想说我想从一个帐户(发件人)到另一个帐户(收件人)付款。该方案如下所示:

  1. 检查是否sender.status == 0,这意味着它已解锁且可以发送付款。
  2. 检查他的余额上是否he has more or equals amount of money是否要发送。
  3. 从他的账户中提取这笔钱。
  4. 检查receiver.status == 0是否已解锁且可以收款。
  5. 在收款人的账户上存入金额。
  6. 将付款状态更改为1,即成功。
  7. 此方案告诉我们使用两个DAO INSTANCES:AccountDaoPaymentDao并从这些实例中调用方法。当我在PaymentService中实现这个场景时,它是一种实现事务的正确方法吗?

1 个答案:

答案 0 :(得分:1)

由于您没有使用某些框架,例如Spring Transaction(我强烈建议您使用),我建议您执行以下操作:

  1. 只使用一个DAO类来创建您需要的所有业务流程,并在那里使用该事务。
  2. 在服务层中创建连接,并将其作为参数传递给业务流程中所需的所有DAO。我不喜欢这种方式,因为您将连接控件委托给服务层,也不委托数据访问控制层。
  3. 将JDBC更改为使用Spring Transaction,它将允许您对服务层中同一事务中的方法进行声明,尽管它们位于不同的DAO中。这是有效的,因为Spring将控制Connection,因此它将通过DAO注入相同的连接。看一下这个example
  4. 更多的是设计偏好的问题,那么哪一个是正确的