下载
SQuirreL SQl的源代码并查看表实现.
有些事情需要注意:
数据库表不是Java JTable.数据库中的表实际上是一个集合(诅咒使用错误术语的傻瓜)和项目,每个项目都有属性(通常称为“列”,而不是JColumn,它解释了为什么很难映射这两个) .
一套可以增长到任何尺寸.它没有内在的秩序.你可以对它进行很多设置操作,例如:union,difference,sub set.
因此,它不是表,尤其不是UI表.
没有简单的UI范例将“set”映射到“table”.您可以
>加载N条记录并翻阅结果.
>您可以在用户向下滚动时加载更多内容
>您可以计算集合的大小并相应地调整滚动条.当用户滚动数据时,它将从DB中获取并显示.
优点缺点:
解决方案1实现起来最简单,也是用户最讨厌的解决方案.他们为什么要在倒退时等待再次查看数据呢?如果每次获取需要15秒,这尤其令人沮丧.页面…等待…页面…哎呀!那是它!该死的!等待等待……回来……等等…… aaargh.
此外,数据库通常很难分页数据.对于某些查询,性能可能是灾难性的.
解决方案2易于实现,尤其是如果您可以永久保持ResultSet打开.但是100%的时间,你不能.如果你把它打开几个小时或一天,它将开始失败.在那段时间之后,DB会认为“哦,它已经死了,Jim”并关闭连接,你的用户会得到一个很好的错误信息,你会得到一个愤怒的用户.
所以你也需要在这里寻呼,但不是经常.从积极的方面来说,用户无需再等待他们已有的数据.一个重要的观点:如果集合包含数百万行,用户可以直观地了解他们需要在向下滚动时从不同角度解决问题.最终,他们会感到疲倦并要求更好的解决方案(而不是对你生气,因为你的愚蠢程序不能在不到0.0000000001秒内显示1500万行).
解决方案3再次比#2差.如果表增长,UI将变得无法使用:即使查看滚动,也会将您移动到表中的随机位置.所以它让你的鼠标无用.而你的用户生气了.
所以我通常会尝试一个解决方案:
>读取1000行,最多另外,如果读取行超过1秒,我会在100行之后停止(因此用户至少有一些数据).通常,查询速度很慢,读取结果集几乎没有时间,但我喜欢在这里采取防御措施.
>在每列的顶部是一个过滤器和一个“order by”,它可以直接映射到SQL.这样,我可以确保如果您希望按列排序的数据,它将按所有值排序(而不仅仅是您可以在屏幕上看到的值).
这允许用户将大量数据切割成有意义的子集.