我正在构建一个 Java 应用程序,并且我还在构建一个 ORM(对象关系映射),它提供 DAO(数据访问对象)。也许使用现有的其中一个更聪明,但我在尝试设计 ORM 时非常有趣。
目前它存在于这些类中非常基本的 cq 函数:
- Beans(数据存储在这些对象中)
- 约束(这些与 bean 联系在一起并用于搜索)
- 经理(在这些对象上,您将插入/更新/删除/搜索数据)
现在我想添加一个额外的层,即Transitions。我认为它们介于 Managers 和正在使用的实际 PreparedStatement 之间。我知道我可以直接使用 SQL 连接,但这对我来说似乎不太好和面向对象。
最重要的布局是 Manager 类之一:
public abstract class Manager<B extends Bean, C extends AbstractConstraint<B>> {
protected final Connection connection;
public Manager(final Connection con) {
this.connection = con;
}
public final int insert(B b) throws InsertException {
}
public final boolean update(B b) throws UpdateException {
}
public final boolean delete(B b) throws DeleteException {
}
public final B get(C... c) throws SearchException {
}
public final List<B> search(C... c) throws SearchException {
}
public final List<B> getAll() throws SearchException {
}
abstract protected PreparedStatement insertPS(B b) throws SQLException;
abstract protected PreparedStatement updatePS(B b) throws SQLException;
abstract protected PreparedStatement deletePS(B b) throws SQLException;
abstract protected String searchQuery();
abstract protected B createBean(ResultSet rs) throws SQLException;
}
现在我计划添加一个 Transaction 类,前提是当您在其中输入两个插入/更新/删除“语句”时,它们将作为事务提交到数据库。
我将如何让它工作?(给定的例子不是现实生活中的例子,只是编造一些简单的东西)
Transaction transaction = new Transaction(SQL.getConnection());
//Normal execution
int insertedId = ManagerFactory.getAccountManager().insert(new Account(...));
boolean updateSucceeded = ManagerFactory.getGeneralManager().update(new General(...)); //with modified data to reflect insertion of an account
transaction.commit();
我正在考虑让Transaction
调用函数Manager
直接像这样:
Transaction transaction = new Transaction(SQL.getConnection());
transaction.add(ManagerFactory.getAccountManager(), Action.INSERT, new Account(...));
transaction.add(ManagerFactory.getGeneralManager(), Action.UPDATE, new General(...));
transaction.commit();
你有类似的东西:
public void add(Manager m, Action a, Bean b) { }
它调用了需要采取的相应行动
我怎样才能将返回值返回给调用者?
即使我将其拆分为addInsert()
,addUpdate()
和addDelete()
,我将如何延迟返回它们的返回值,直到commit()
发生?因为只有这样才能知道这些值。
问候。