java 创建一个JDBC表格模型

2021-10-29 14:10:30 浏览数 (1)

创建一个JDBC表格模型

创建一个JDBC表格模型

代码语言:javascript复制
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的表

代码语言:javascript复制
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"; 
         }
    }

0 人点赞