简单快速的将数据库中的表引入Swing之内
假如你已经用过数据库了,你很可能已经用过为数据库提供的维护和查询表的工具:命令行工具很适合作简单而直接的工作,但是很难完成大量数据的处理工作。在一次查询中写一条返回10或20列的数据就已经很困难了-更糟的是由于换行而使每条记录都有很多行的情况,此时你根本无法区分一条记录在哪一行结束,另一条记录在哪一行开始。
如果能够将数据库中表的内容映射到Swing的JTable中是否好一些呢?加上一些JDBC语句,添加到JFrame上,顷刻之间就形成了图形界面。
建立连接
如果你同时用到JDBC和Swing,只需要一句话你就可以抓住要点:使用数据库表的元数据来建立Swing表控件模型。如果你还没用到它们,下面就是你需要了解的背景知识:JDBC提供许多抽象方法来存取数据库。对于一个数据库有效的Java代码也应该对其他数据库有效,唯一的不同之处在于JDBC与不同的数据库建立连接时所需要提供的下面的一些字符串也是不同的:
¨ 一个驱动程序类的类名,提供各种不同的java.sql接口的实现。
¨ 一个连接到数据库的URL。这就意味着可能会用到socket,尽管这不是一定的。一些小的可嵌入的数据库就像你的应用程序一样可以存活于Java虚拟机中。
¨ 一个可选的用户名。
¨ 一个可选的密码。
一旦建立了连接,你就可以发送一些命令(创建、删除、或修改表),或者通过该连接,创建SQL语句来对数据库进行查询。你也能通过该连接得到数据库的元数据,例如它所支持的各种特性,某一字符串的最大长度等等。更重要的是,它可以让你知道数据库中都有哪些表,它们都有哪些字段,每个字段的数据类型是什么。
因此,假设连接到了数据库,并且知道该数据库中的一个表的表名,你就可以利用两次查询将表的内容用Java表现出来。第一次查询能得到该表的各字段的元数据并且将字段名和字段的类型构建成一个数组。这些能被适当地而且很好地映射到Java类中,至少支持你想支持的各种类型。第二次查询得到表中所有的数据。对于每行数据,对应字段它都有相应的值。这些数据可以放入一个二维数组中,该数组存放的是整个表的内容。
通过这两次查询,也就完成了要实现AbstractTableModel类中的抽象方法的所有准备:
¨ getRowCount():是你所创建的内容数组contents的长度。
¨ getColumnCount():如果没有内容则为0,否则为数组contents的第一项(该项也是一个数组,因为内容数组是一个二维数组)的长度。
¨ getValueAt():contents[row][col]的值。
AbstractTableModel已经完全的实现了getColumnClass()和getColumnName()两个方法,因此,前者总是返回Object.class,后者返回"A","B","C",等等;你也可以利用第一次查询的字段元数据覆盖这两个方法,以更好的实现它们。