通过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列的值
程序运行结果如下,