我用Jtable 显示数据库里的数据,必需要将数据先保存到数组然后再用JTable 显示数组里面的内容吗?
当将表格里的数据保存到数据库里时难道也非得先要将表格中的数据保存到数组中吗?
另外JTable中有没有将整个表中的数据保存到数组里的方法呀?我查了下api但没有找到将整张表保存到数据里的方法。要想将整张表中的数据保存到数组中时有没有比循环更好的方法呀???

解决方案 »

  1.   

    要想将整张表中的数据保存到数组中时有没有比循环更好的方法呀???
    有啊,你写个存储过程,传入二维数组,数据库里面去用for循环啊,比在外面for循环拆了一条条去insert要快好多哦。而且保证了要么全部insert,要么一个都不insert
      

  2.   

    参考Swing Hacks 23 Create a JDBC Table Model 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]; 

    }示例使用了HSQL数据库
    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"; 
     }
    }