java資料庫程式設計(8)ResultSetMetaData
阿新 • • 發佈:2018-12-02
- 前面說過可以通過next()方法或者使用可滾動的結果集方法查詢結果,但是這都只是在以每一行為單位的,如果需要訪問以每一行的每一個數據的話,可以使用ResultSetMetaData來訪問。
- MetaData是“元資料的意思”,是描述其他資料時回到的資料。
- 幾個ResultSetMetaData的方法
- getColumnCount()返回該結果集的行數
- getCountName(int count)返回指定索引的列名
- getCountType(int column)返回指定型別的索引名
- 以下具體程式碼和執行結果
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(); } }