Using Marauroa-High Level Database Access
转自https://stendhalgame.org/wiki/High_Level_Database_Access
本文描述了在游戏中如何使用Marauroa在高层级访问数据库。内部的工作在Low Level Database Access中解释。Marauroa的数据库表结构在Marauroa Database Structure中解释。
大多数的数据库访问是透明的。例如客户端请求创建账号,服务器接受该请求的逻辑。Marauroa会自动向数据库中添加需要的记录。但是在某些情况下,你可能需要自己做一些数据库操作。例如你可能想记录游戏事件,或者你可能有一个网站允许用户创建账号。
Data Access Objects
遵循Marauroa体系结构,数据库访问相关代码不会遍布整个代码库,而是集中在一组数据访问对象(DAO)中,并且完整的DAO包的JavaDoc。 请注意,游戏可以添加自己的DAO。
// 记录玩家注销游戏信息
gameEventDAO.addGameEvent(playerName, "logout");
// 继承DAO对象,添加或修改功能
// 这以为这不能简单的创建一个GameEventDAO,而是需要使用DAORegister
GameEventDAO gameEventDAO = DAORegister.get().get(GameEventDAO.class);
gameEventDAO.addGameEvent(playerName, "logout");
Transactions
DAO类所有公有方法都有两个签名:一个使用DBTransaction对象作为第一个参数,一个没有。这是为了您的方便:在大多数情况下,这些函数不是更大的上下文的一部分,因此您根本不必关心事务:DAO类自己进行事务处理。 但是,在少数情况下,您希望在一个事务中对DAO进行多次调用。 在这种情况下,您从TransactionPool获取DBTransaction并将其作为DAO方法的第一个参数提供。 完成后,您必须使用TransactionPool类中的相应方法提交或回滚更改。
DBTransaction transaction = TransactionPool.get().beginWork();
try {
DAORegister.get().get(GameEventDAO.class).addGameEvent(transaction, playerName, "saved");
DAORegister.get().get(GameEventDAO.class).addGameEvent(transaction, playerName, "logout");
} finally {
TransactionPool.get().commit(transaction);
}
请注意,如果出现任何错误,commit()将自动执行回滚并抛出SQLException。