java 创建一个JDBC表格模型
创建一个JDBC表格模型
创建一个JDBC表格模型
import javax.swing.*; import javax.swing.table.*; import java.sql.*; import java.util.*; /** an immutable table model built from getting metadata about a table in a jdbc database */ public class JDBCTableModel extends AbstractTableModel { Object[][] contents; String[] columnNames; Class[] columnClasses; public JDBCTableModel (Connection conn, String tableName) throws SQLException { super(); getTableContents (conn, tableName); } protected void getTableContents (Connection conn, String tableName) throws SQLException { // get metadata: what columns exist and what // types (classes) are they? DatabaseMetaData meta = conn.getMetaData(); System.out.println ("got meta = " + meta); ResultSet results = meta.getColumns (null, null, tableName, null) ; System.out.println ("got column results"); ArrayList colNamesList = new ArrayList(); ArrayList colClassesList = new ArrayList(); while (results.next()) { colNamesList.add (results.getString ("COLUMN_NAME")); System.out.println ("name: " + results.getString ("COLUMN_NAME")); int dbType = results.getInt ("DATA_TYPE"); switch (dbType) { case Types.INTEGER: colClassesList.add (Integer.class); break; case Types.FLOAT: colClassesList.add (Float.class); break; case Types.DOUBLE: case Types.REAL: colClassesList.add (Double.class); break; case Types.DATE: case Types.TIME: case Types.TIMESTAMP: colClassesList.add (java.sql.Date.class); break; default: colClassesList.add (String.class); break; }; System.out.println ("type: " + results.getInt ("DATA_TYPE")); } columnNames = new String [colNamesList.size()]; colNamesList.toArray (columnNames); columnClasses = new Class [colClassesList.size()]; colClassesList.toArray (columnClasses); // get all data from table and put into // contents array Statement statement = conn.createStatement (); results = statement.executeQuery ("SELECT * FROM " + tableName); ArrayList rowList = new ArrayList(); while (results.next()) { ArrayList cellList = new ArrayList(); for (int i = 0; i<columnClasses.length; i++) { Object cellValue = null; if (columnClasses[i] == String.class) cellValue = results.getString (columnNames[i]); else if (columnClasses[i] == Integer.class) cellValue = new Integer ( results.getInt (columnNames[i])); else if (columnClasses[i] == Float.class) cellValue = new Float ( results.getInt (columnNames[i])); else if (columnClasses[i] == Double.class) cellValue = new Double ( results.getDouble (columnNames[i])); else if (columnClasses[i] == java.sql.Date.class) cellValue = results.getDate (columnNames[i]); else System.out.println ("Can't assign " + columnNames[i]); cellList.add (cellValue); }// for Object[] cells = cellList.toArray(); rowList.add (cells); } // while // finally create contents two-dim array contents = new Object[rowList.size()] []; for (int i=0; i<contents.length; i++) contents[i] = (Object []) rowList.get (i); System.out.println ("Created model with " + contents.length + " rows"); // close stuff results.close(); statement.close(); } // AbstractTableModel methods public int getRowCount() { return contents.length; } public int getColumnCount() { if (contents.length == 0) return 0; else return contents[0].length; } public Object getValueAt (int row, int column) { return contents [row][column]; } // overrides methods for which AbstractTableModel // has trivial implementations public Class getColumnClass (int col) { return columnClasses [col]; } public String getColumnName (int col) { return columnNames [col]; } }
测试基于JDBC的表
import javax.swing.*; import javax.swing.table.*; import java.sql.*; import java.util.*; import java.io.*; public class TestJDBCTable { public static void main (String[] args) { try { /* driver, url, user, and pass can be passed in as system properties "jdbctable.driver", "jdbctable.url", "jdbctable.user", and "jdbctable.pass", or specified in a file called "jdbctable.properties" in current directory */ Properties testProps = new Properties(); String ddriver = System.getProperty ("jdbctable.driver"); String durl = System.getProperty ("jdbctable.url"); String duser = System.getProperty ("jdbctable.user"); String dpass = System.getProperty ("jdbctable.pass"); if (ddriver != null) testProps.setProperty ("jdbctable.driver", ddriver); if (durl != null) testProps.setProperty ("jdbctable.url", durl); if (duser != null) testProps.setProperty ("jdbctable.user", duser); if (dpass != null) testProps.setProperty ("jdbctable.pass", dpass); try { testProps.load (new FileInputStream ( new File ("jdbctable.properties"))); } catch (Exception e) {} // ignore FNF, etc. System.out.println ("Test Properties:"); testProps.list (System.out); // now get a connection // note care to replace nulls with empty strings Class.forName(testProps.getProperty ("jdbctable.driver")).newInstance(); String url = testProps.getProperty ("jdbctable.url"); url = ((url == null) ? "" : url); String user = testProps.getProperty ("jdbctable.user"); user = ((user == null) ? "" : user); String pass = testProps.getProperty ("jdbctable.pass"); pass = ((pass == null) ? "" : pass); Connection conn = DriverManager.getConnection (url, user, pass); // create db table to use String tableName = createSampleTable(conn); // get a model for this db table and add to a JTable TableModel mod = new JDBCTableModel (conn, tableName); JTable jtable = new JTable (mod); JScrollPane scroller = new JScrollPane (jtable, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); JFrame frame = new JFrame ("JDBCTableModel demo"); frame.getContentPane().add (scroller); frame.pack(); frame.setVisible (true); conn.close(); } catch (Exception e) { e.printStackTrace(); } } public static String createSampleTable (Connection conn) throws SQLException { Statement statement = conn.createStatement(); // drop table if it exists try { statement.execute ("DROP TABLE EMPLOYEES"); } catch (SQLException sqle) { sqle.printStackTrace(); // if table !exists } statement.execute ("CREATE TABLE EMPLOYEES " + "(Name CHAR(20), Title CHAR(30), Salary INT)"); statement.execute ("INSERT INTO EMPLOYEES VALUES " + "('Jill', 'CEO', 200000 )"); statement.execute ("INSERT INTO EMPLOYEES VALUES " + "('Bob', 'VP', 195000 )"); statement.execute ("INSERT INTO EMPLOYEES VALUES " + "('Omar', 'VP', 190000 )"); statement.execute ("INSERT INTO EMPLOYEES VALUES " + "('Amy', 'Software Engineer', 50000 )"); statement.execute ("INSERT INTO EMPLOYEES VALUES " + "('Greg', 'Software Engineer', 45000 )"); statement.close(); return "EMPLOYEES"; } }