有没有人知道我是否有一个很好的通用基于表格的结构来管理数据? ResultSet是一个接口,如果我想要没有数据库的类似功能,我是不是必须完全实现一些东西? Apache Commons Collections似乎没有任何直接适用的东西。
答案 0 :(得分:6)
通常为此使用List
或Set
Javabeans。每个Javabean反过来代表一个真实世界实体,就像数据库中的一行。例如User
:
public class User {
private Long id;
private String name;
private Integer age;
// Add/generate getters+setters.
}
与
List<User> users = new ArrayList<User>();
users.add(new User(1L, "foo", 30));
users.add(new User(2L, "bar", 20));
//...
List
提供了通过索引快速访问的方法。
对于未确定数量的属性(列),您可以考虑使用Map<String, Object>
代替属性(列)名称。
List<Map<String, Object>> table = new ArrayList<Map<String, Object>>();
Map<String, Object> row = new HashMap<String, Object>();
row.put("id", 1L);
row.put("name", "foo");
row.put("age", 30);
table.add(row);
// ...
它只比简单的Javabean增加了更多的开销,因为这些字符串键也需要存储在堆中。
如果您不关心列名称,那么您也可以继续使用List<List<Object>>
或甚至更不灵活的Object[][]
。您可以通过x
和y
轻松访问元素。
答案 1 :(得分:2)
为什么不使用内存数据库,例如HSQLDB或H2。它们非常轻量级,快速,提供您想要的JDBC接口,并提供您提到的JOIN功能。
答案 2 :(得分:2)
Google Guava个库提供了几个通用Table实现 - HashBasedTable,TreeBasedTable。这些类是通用的,因此任何类都可以充当行/列键。
文档示例:
Table<Vertex, Vertex, Double> weightedGraph = HashBasedTable.create();
weightedGraph.put(v1, v2, 4.0);
weightedGraph.put(v1, v3, 20.0);
weightedGraph.put(v2, v3, 5.0);
weightedGraph.row(v1); // returns a Map mapping v2 to 4, v3 to 20
weightedGraph.column(v3); // returns a Map mapping v1 to 20, v2 to 5
答案 3 :(得分:0)
也许类似DefaultTableModel
的内容符合您的要求。它通常与JTable一起使用来显示数据,但它可以单独使用。
或者基于RowTableModel
的{{3}}还有一些动态功能,可让您更轻松地访问数据行。
答案 4 :(得分:0)
Java 6有一个CachedRowSet
接口,并附带一个Sun类CachedRowSetImpl
。这可能是最接近你想要的东西。它的设计目标是ResultSet
。
如果这适合你,那可能就是你正在寻找的。 p>
如果没有,您可能会在填写正确的问题时遇到问题。