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();
        }
    }
    

猜你喜欢

转载自blog.csdn.net/weixin_39452731/article/details/83041399