1. 程式人生 > >java資料庫程式設計(8)ResultSetMetaData

java資料庫程式設計(8)ResultSetMetaData

  1. 前面說過可以通過next()方法或者使用可滾動的結果集方法查詢結果,但是這都只是在以每一行為單位的,如果需要訪問以每一行的每一個數據的話,可以使用ResultSetMetaData來訪問。
  2. MetaData是“元資料的意思”,是描述其他資料時回到的資料。
  3. 幾個ResultSetMetaData的方法
    1. getColumnCount()返回該結果集的行數
    2. getCountName(int count)返回指定索引的列名
    3. getCountType(int column)返回指定型別的索引名 
  4. 以下具體程式碼和執行結果
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.FileInputStream;
    import java.sql.*;
    import java.util.Properties;
    import java.util.Vector;
    
    public class QueryExecutor {
    
    //    下面這幾行是圖形化介面的,不講~~
        JFrame jf = new JFrame("查詢分析器");
        private JScrollPane scrollPane;
        private JButton execBn = new JButton("查詢");
        private JTextField sqlField = new JTextField(30);
    
    //    這裡是和前面一樣的常規操作
        private static Connection conn;
        private static Statement stmt;
        static{
            try{
                Properties props = new Properties();
                props.load(new FileInputStream("mysql.ini"));
                String driver = props.getProperty("driver");
                String url = props.getProperty("url");
                String username = props.getProperty("user");
                String password = props.getProperty("pass");
                Class.forName(driver);
                conn = DriverManager.getConnection(url, username, password);
                stmt = conn.createStatement();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
        public void init(){
            JPanel top = new JPanel();
            top.add(new JLabel("輸入查詢語句: "));
            top.add(sqlField);
            top.add(execBn);
            execBn.addActionListener(new ExceListListener());
            sqlField.addActionListener(new ExceListListener());
            jf.add(top, BorderLayout.NORTH);
            jf.setSize(640, 600);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setVisible(true);
        }
    
    //    這個才是本例需要講解的部分,在使用sql語句執行完查詢之後會返回ResultSet
    //    然後使用ResultSetMetaData來獲取ResultSet的相關描述資訊
    
    //    知識補充:Vector類實現了可擴充套件的物件陣列。 像陣列一樣,它包含可以使用整數
    //    索引訪問的元件。 但是, Vector的大小可以根據需要增長或縮小,以適應在建立
    //    Vector之後新增和刪除專案。
        class ExceListListener implements ActionListener{
            public  void actionPerformed(ActionEvent evt){
                if(scrollPane != null){
                    jf.remove(scrollPane);
                }
                try(
                        ResultSet rs = stmt.executeQuery(sqlField.getText()))
    //                    執行sql語句後得到的結果集
                {
                    ResultSetMetaData rsmd = rs.getMetaData();
    //                得到結果集的ResultSetMetaData
    
    //                將獲得的結果拆分放在Vector中
                    Vector<String> columnNames = new Vector<>();
                    Vector<Vector<String>> data = new Vector<>();
    
    //                這裡是獲取目錄名
                    for(int i=0; i<rsmd.getColumnCount(); i++){
                        columnNames.add(rsmd.getCatalogName(i+1));
                    }
    
    //                這裡的執行過程是:以行為單位遍結果集,然後將每一行以列為單位遍歷之後存放在一個 Vector裡,然後
    //                用另一個Vector將這個存放有每一列資訊的Vector新增進去。
                    while (rs.next()){
                        Vector<String> v = new Vector<>();
                        for(int i=0; i<rsmd.getColumnCount(); i++){
                            v.add(rs.getString(i+1));
                        }
                        data.add(v);
                    }
                    JTable table = new JTable(data, columnNames);
                    scrollPane = new JScrollPane(table);
                    jf.add(scrollPane);
                    jf.validate();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
        public static void main(String args[]){
            new QueryExecutor().init();
        }
    }