我正在使用jdbc编写一个程序,它将是一个到数据库的接口(类似于smth的crud应用程序)。我假设我必须编写一个类(例如DBCLass)来完成数据库的所有操作(select, update, insert, delete,可能还有一些其他逻辑,这些逻辑将被简化为这些操作)。用户界面由一组表和几个按钮组成。要使用JTable,我需要实现一个类(例如Model),它是AbstractTableModel的一个子类。所以这个类将向用户显示我的数据。我需要为数据库模式中的所有表实现这样的模型。我不想在那些向用户显示数据的类中编写逻辑,我认为在这样的类中编写逻辑代码不是一件好事。但是,将数据库表中的所有数据加载到内存(例如arraylist)并在Model中显示也是不正确的。
所以,我想要一个建议,哪一个是解决这个问题的最好方法。
编辑
一个小例子:

Statement stmt = ....;
ResaultSet rs = stmt.executeQuery("SELECT * FROM table1");

javadoc说executequery方法返回一个resultset对象,该对象包含给定查询生成的数据。因此,如果我们有大量数据(其大小超过了虚拟机允许的大小),我们的程序将失败。
所以我的问题还是很重要的

最佳答案

下载SQuirreL SQl的源代码并查看表实现。
需要注意的事项:
数据库表不是java jtables。数据库中的表实际上是一个集合(诅咒使用错误术语的傻瓜),每个项都有属性(通常称为“columns”,这不是jcolumn,这解释了为什么很难映射两者)。
一套可以长到任何尺寸。它没有内在的秩序。你可以对它做很多的集合操作,比如:联合,差异,子集合。
因此,它不是一个表,特别是不是一个ui表。
将“set”映射到“table”并不容易。你可以
加载n条记录并翻页查看结果。
用户向下滚动时可以加载更多内容
您可以计算集合的大小并相应地调整滚动条。当用户在数据中滚动时,它将从数据库中获取并显示。
优点+缺点:
解决方案1最容易实现,也是用户最讨厌的解决方案。为什么他们需要等待看到数据时,再次倒退?如果每次提取需要15秒,这尤其令人沮丧。页面…等待。。。页面…哎呀!就在那儿!该死!等等等等…后退…等待。。。啊啊。
此外,数据库通常很难对数据进行分页。对于某些查询,性能可能是灾难性的。
解决方案2实现起来很简单,特别是如果您可以一直打开ResultSet。但是100%的时间,你不能。如果你让它开几个小时或一天,它就会开始失败。在那之后,数据库会认为“哦,它死了,吉姆”并关闭连接,你的用户会收到一条很好的错误消息,你会得到一个愤怒的用户。
所以你也需要在这里翻页,但不要经常翻页。从积极的方面来说,用户不必再等待他们已经拥有的数据。一个重要的观点是:如果集合包含数百万行,用户直观地理解,当他们向下滚动时,他们需要从不同的角度来解决问题。最终,他们会感到疲倦并要求更好的解决方案(而不是因为你愚蠢的程序不能在少于0.0000000001s的时间内显示1500万行而生你的气)。
解决方案3再次比2更糟。如果表增长,ui将变得不可用:即使查看滚动know也会将您移动到表中的任意位置。所以它让你的老鼠没用。你的用户很生气。
所以我通常尝试一个解决方案:
读取1000行,如果读取行的时间超过1秒,则最多在100行之后停止(因此用户至少有一些数据)。通常,查询速度很慢,读取结果集几乎不需要时间,但我喜欢在这里守势。
每列的顶部都有一个过滤器和一个“order by”,可以直接映射到sql。这样,我可以确保如果您希望数据按列排序,那么它将按所有值(而不仅仅是屏幕上可以看到的值)排序。
这允许用户将大量数据切分为有意义的子集合。

10-06 12:43
查看更多