JAVA基础知识之JDBC——使用ResultSetMetaData分析结果集

通过ResultSetMetaData可以对ResultSet进行分析,获取ResultSet里包含了哪些数据列,以及每个列的数据类型。

ResultSet中包含了一个getMetaData()方法,通过这个方法可以返回一个 ResultSetMetaData 对象,此对象提供大量方法获取ResultSet的属性,常用方法有,

  • int getColumnCount() , 返回 ResultSet总共有多少列
  • String getColumnName(int column) , 返回第column的列名
  • int getColumnType(int conlumn) , 返回第column列的类型

下面的程序是一个简单的SQL执行器,输入SQL,将执行结果显示出来,

  1 package db;
  2 
  3 import java.awt.BorderLayout;
  4 import java.awt.event.ActionEvent;
  5 import java.awt.event.ActionListener;
  6 import java.io.FileInputStream;
  7 import java.sql.Connection;
  8 import java.sql.DriverManager;
  9 import java.sql.ResultSet;
 10 import java.sql.ResultSetMetaData;
 11 import java.sql.SQLException;
 12 import java.sql.Statement;
 13 import java.util.Properties;
 14 import java.util.Vector;
 15 
 16 import javax.swing.JButton;
 17 import javax.swing.JFrame;
 18 import javax.swing.JLabel;
 19 import javax.swing.JPanel;
 20 import javax.swing.JScrollPane;
 21 import javax.swing.JTable;
 22 import javax.swing.JTextField;
 23 
 24 public class QueryExecutor {
 25     JFrame jf = new JFrame("查询执行器");
 26     private JScrollPane scrollPane;
 27     private JButton execBn = new JButton("查询");
 28     //用来输入查询语句的文本框
 29     private JTextField sqlField = new JTextField(45);
 30     private static Connection conn;
 31     private static Statement stmt;
 32     //用静态初始化块来初始化Connection和Statement对象
 33     static {
 34         try {
 35             //用Properties类加载属性文件
 36             Properties prop = new Properties();
 37             prop.load(new FileInputStream("mysql.ini"));
 38             String drivers = prop.getProperty("driver");
 39             String url = prop.getProperty("url");
 40             String user = prop.getProperty("user");
 41             String pass = prop.getProperty("pass");
 42             Class.forName(drivers);
 43             conn = DriverManager.getConnection(url, user, pass);
 44             stmt = conn.createStatement();
 45         } catch (Exception e) {
 46             e.printStackTrace();
 47         }
 48     }
 49     //初始化界面
 50     public void init() {
 51         JPanel top = new JPanel();
 52         top.add(new JLabel("输入查询语句"));
 53         top.add(sqlField);
 54         top.add(execBn);
 55         //为执行按钮,单行文本框添加事件监听器
 56         execBn.addActionListener(new ExceListener());
 57         sqlField.addActionListener(new ExceListener());
 58         jf.add(top, BorderLayout.NORTH);
 59         jf.setSize(680, 480);
 60         jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 61         jf.setVisible(true);
 62     }
 63     //定义监听器
 64     class ExceListener implements ActionListener {
 65 
 66         @Override
 67         public void actionPerformed(ActionEvent evt) {
 68             //删除原来的JTable(JTable使用scrollPane来包装)
 69             if (scrollPane != null) {
 70                 jf.remove(scrollPane);
 71             }
 72             try (
 73                     ResultSet rs = stmt.executeQuery(sqlField.getText())) {
 74                 //取出ResultSet的MetaData
 75                 ResultSetMetaData rsmd = rs.getMetaData();
 76                 Vector<String> columnNames = new Vector<>();
 77                 Vector<Vector<String>> data = new Vector<>();
 78                 //把ResultSet的所有列名添加到vector里
 79                 for (int i = 0; i < rsmd.getColumnCount(); i++) {
 80                     columnNames.add(rsmd.getColumnName(i+1));
 81                 }
 82                 //把ResultSet的所有记录添加到vector里
 83                 while (rs.next()) {
 84                     Vector<String> v = new Vector<>();
 85                     for (int i = 0; i < rsmd.getColumnCount(); i++) {
 86                         v.add(rs.getString(i+1));
 87                     }
 88                     data.add(v);
 89                 }
 90                 //创建新的JTable
 91                 JTable table = new JTable(data, columnNames);
 92                 scrollPane = new JScrollPane(table);
 93                 //添加新的table
 94                 jf.add(scrollPane);
 95                 //更新主窗口
 96                 jf.validate();
 97                 
 98             } catch (SQLException e) {
 99                 // TODO Auto-generated catch block
100                 e.printStackTrace();
101             }
102         }
103         
104     }
105     
106     public static void main(String[] args) {
107         new QueryExecutor().init();
108     }
109 }    

 上面程序中,在第75行用ResultSet对象的getMetaData()方法返回了ResultSetMetaData对象,

接着在79行和80行用ResultSetMetaData对象的getColumnCount()和getColumnName(column)返回了ResultSet的总行数和每列的名字,

最后在86行,通过ResultSet对象的 getXxx(i)方法返回当前行第i列的值

程序运行结果如下,

 

 

posted @ 2016-12-13 17:46  fysola  阅读(1491)  评论(0编辑  收藏  举报