代码之家  ›  专栏  ›  技术社区  ›  Chris Farmer Marcelo Cantos

如何从没有数据库的自定义数据编程地创建Java结果集

  •  28
  • Chris Farmer Marcelo Cantos  · 技术社区  · 15 年前

    我有一些接受 java.sql.ResultSet 它包含从Oracle数据库中检索到的信息。我现在想重用这段代码,但我想传递一个 ResultSet 对象,它是我从一些不属于任何数据库的内存数据中创建的。有一个我可以使用的Java框架类吗? 结果集 有很多方法,因此为这个实现我自己的类似乎是多余的,即使对于我的特定情况我可以忽略大多数方法。

    我在想一些与旧的Microsoft ADO记录集对象类似的东西,在这里我可以创建字段,然后为每个字段填充行数据。这似乎是一个简单易懂的问题,但我一直找不到任何好的提示。

    6 回复  |  直到 11 年前
        1
  •  17
  •   Community noseratio    11 年前
    • 创造你自己 AbstractResultSet 类,通过抛出UnsupportedOperationException(Eclipse在瞬间自动生成这些方法)实现所有方法的类(与AbstractQueue类似)。
    • 现在扩展 抽象结果集 . 子类只能重写您感兴趣实现的方法。
        2
  •  10
  •   skaffman    15 年前

    这是一个稍微偏左的字段解决方案,但是您可以使用模拟框架(例如 JMock )这些框架通常用于为单元测试创建接口的模拟实现,但我看不出为什么您可以使用它来创建 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);
    

    挺不正统的,挺麻烦的,不过应该管用的

        3
  •  4
  •   davek    15 年前

    您可以查看cachedrowset接口:

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

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

        4
  •  3
  •   rayd09    15 年前

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

        5
  •  2
  •   alex    15 年前

    我的第一个选择是重构代码,使其采用list<map<string、object>>或适当的内容(即,如果要移动的数据没有真正的结构,则使用list<map<string、object>>,如果它确实有结构,则使用完全类型的对象)。

    如果这不可行或不省时,那么“有趣”的方法就是查询内存中的h2数据库以获取结果集。如果你没有找到一个合理的结果集存根,你可以很容易地实例化,它可能比滚动你自己的(拉入jar,写20行代码来创建数据库和填充一个表)更快。

        6
  •  1
  •   Nathan Wheeler    15 年前

    我通常不回答Java问题,因为我不是Java开发人员,但如果需要从代码中创建SQL对象,以便将方法循环使用,这似乎是一个体系结构缺陷。我认为您应该让接收方法接受一些其他更具体的输入形式(例如自定义定义的对象数组),使其可重用,然后将结果数据解析为该格式。