回滚ORMapper查询

时间:2011-12-20 18:36:19

标签: java orm transactions rollback mybatis

我们正在使用MyBatis(3.0.5)作为我们的or-mapping工具(我没有任何发言权!)。

我创建了一个Response对象,通过MyBatis映射到我们的[responses]数据库表(我们使用PostgreSQL)。

实际上,我们使用的ormapping结构如下:

  • ResponseMapper.xml - 这是定义PSQL查询并映射到ResponseMapper.java **类及其方法的XML文件
  • ReponseMapper.java - MyBatis用于执行XML文件中定义的查询的接口(上图)
  • ResponseDAO.java - 用于DI目的的界面(我们使用Spring)
  • ResponseDAOImpl.java - 实际调用ResponseDAO方法的ResponseMapper的具体实现;我们使用Spring将此类的实例注入到我们的应用程序中

因此,要将新的[responses]记录插入到PostgreSQL中,代码在调用组件中看起来像这样:

@Autowired
private ResponseDAO response;

public void doStuff()
{
    int action = getAction();

    response.setAction(action);

    response.insert();
}

这个设置对我们很有效。但是我现在正在尝试为ResponseDAOImpl类编写一组JUnit测试,我想确保它正确地对PostgreSQL数据库执行查询。

据我所知,没有办法“模拟”整个数据库。因此,我唯一的选择(看似)是让测试方法执行查询,检查是否成功,然后再将其回滚。

MyBatis似乎不支持这种回滚功能。我在Old Nabble的mybatis-user邮件列表中发现了this,但海报上使用的是Guice,他/她的问题似乎更多是关于通过Guice回滚交易。

如果MyBatis 不支持支持事务/回滚(是吗?!?!),那么看起来我的唯一重做就是PostgreSQL-JDBC驱动程序支持这些。我想我可以尝试配置我的测试方法,以便它们运行ResponseDAO.insert()方法,然后手动尝试直接通过驱动程序回滚事务(没有MyBatis)。

SO有这方面的经验吗?代码示例?提示?最佳做法?提前谢谢!

2 个答案:

答案 0 :(得分:0)

不确定这是否是您所需要的,但org.apache.ibatis.session.SqlSession类具有可用于回滚的rollback()方法。

另一种方法是使用来自同一个类的getConnection()方法,该方法将返回javax.sql.Connection javax.sql.Connection类,该类也有commit()和rollback()方法。

希望它有所帮助。 Remis B

答案 1 :(得分:0)

MyBatis在使用“SqlSession”时允许回滚,你可以使用spring依赖注入片,它会在方法完成时自动提交你的事务。

你有几个选择,其中

  1. 注入依赖项的模拟。有一些摇摆的图书馆可以帮助解决这个问题。与Mockitohere is a good question on Spring Mockito stuff一样。这将测试您的java中的业务逻辑,而不是您的实际查询。

  2. 提交查询,并在测试运行后删除您的数据。这是我们采用的方法,因为它也测试了我们的数据库。你显然需要一个数据库的测试实例,而有些人却没有。

  3. 您可以尝试为在MyBatis Spring Integration中执行自动提交的类提供自己的测试绑定,并覆盖那些行为,以便在测试环境中行为是回滚查询而不是提交。在Guice集成中使用了类似的方法,并对其进行了描述here