如何以编程方式从没有数据库的自定义数据创建Java ResultSet

我有一些现有的代码接受包含从Oracle数据库检索的信息的java.sql.ResultSet 。 我现在想重用这段代码,但我想传递一个ResultSet对象,我自己从一些与任何数据库无关的内存数据创建。 是否存在可用于此的现有Java框架类? ResultSet有很多方法,所以实现我自己的类似乎有点矫枉过正,尽管我可以忽略大多数方法来解决我的具体情况。

我正在考虑旧的Microsoft ADO记录集对象的内容,我可以在其中创建字段,然后填充每个字段的行数据。 这看起来像是一个容易混淆的问题,但我一直无法找到任何好的指针。

  • 创建自己的AbstractResultSet类,它(如AbstractQueue)通过抛出UnsupportedOperationException(Eclipse会在瞬间自动生成这些方法)来实现所有方法。
  • 现在扩展AbstractResultSet 。 子类只能覆盖您有兴趣实现的方法。

这是一个稍微左侧的解决方案,但您可以使用模拟框架(例如JMock )。 这些框架通常用于创建unit testing接口的模拟实现,但我认为没有理由使用它来创建java.sql.ResultSet的“部分实现”。

例如,假设您只想实现getString()方法,而不是其他:

 Mockery mockery = new Mockery(); final ResultSet resultSet = mockery.mock(ResultSet.class); mockery.checking(new Expectations() {{ allowing(resultSet).getString(1); will(returnValue("my first string")); allowing(resultSet).getString(2); will(returnValue("my second string")); }}); // resultSet is now a java.sql.ResultSet object, which you can pass to your legacy code resultSet.getString(1); 

相当不正统,相当繁琐,但它应该工作

您可以查看CachedRowSet接口:

http://java.sun.com/j2se/1.5.0/docs/api/javax/sql/rowset/CachedRowSet.html

这允许您在断开连接模式下工作。

java.sql.ResultSet是一个接口,因此您可以创建自己的类来实现该接口。

我的第一个选择是重构代码,以便它采用List

>或其他适当的东西(即List >,如果移动的数据没有真正的结构或完全如果具有结构,则为对象。

如果这不可行或时间有效,那么“有趣”的黑客就是查询内存中的H2数据库以获取ResultSet。 如果没有为ResultSet找到合理的存根,则可以轻松实例化,它可能比滚动自己更快(拉入jar,编写20行代码来创建数据库并填充表)。

我通常不会回答java问题,因为我不是java开发人员,但如果你需要从代码创建一个sql对象以传递给方法来回收方法,这似乎是一个架构缺陷。 我想你会想让你的接收方法接受一些其他更具体的输入forms(比如自定义的对象数组)以使其可重用,然后将ResultData解析为该格式。