1. 描述ResultSet信息的数据——ResultSetMetaData:
1) MetaData即元数据,即描述其它数据的数据,因此ResultSetMetaData就是描述ResultSet的元数据;
2) 通常在你对查询结果不了解的情况下可以使用该元数据来了解结果集的记录有几列,每列的类型是啥,每列的名称是啥?
2. 分析ResultSet元数据:
1) 首先你要获得ResultSetMetaData对象(必定是从属于某个ResultSet对象):ResultSetMetaData ResultSet.getMetaData();
2) 元数据对象中最常用的三种方法来获取记录的有关信息:都是ResultSetMetaData的对象方法
i. int getColumnCount(); // 获取列数
ii. String getColumnName(int column); // 获取指定列的列名,列索引从1开始计
iii. int getColumnType(int column); // 获取指定列的SQL类型,是Types中定义的静态常量
3) 一般不推荐使用ResultSetMetaData来分析结果集,因为这样分析需要一定的系统开销(底层查询数据库中的元数据然后返回想要的值),因此最好是先了解数据表的具体结构然后直接分析结果集比较好;
4) 示例:完全依赖ResultSetMetaData来解析结果集
public class Test {
private Connection conn;
private Statement stmt;
private JFrame jf;
private JPanel jp;
private JLabel jl;
private JTextField jt;
private JButton jb;
private JScrollPane jscp; // 显示查询结果的滚动面板
class ExecListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (jscp != null) {
jf.remove(jscp); // 先删掉原有的结果列表面板
}
try (
ResultSet rs = stmt.executeQuery(jt.getText())
) {
ResultSetMetaData rsmd = rs.getMetaData();
Vector<String> colNames = new Vector<>(); // 列名
Vector<Vector<String>> rows = new Vector<>(); // 行的集合
for (int i = 0; i < rsmd.getColumnCount(); i++) { // 获取列名
colNames.add(rsmd.getColumnName(i + 1));
}
while (rs.next()) {
Vector<String> v = new Vector<>();
for (int i = 0; i < rsmd.getColumnCount(); i++) { // 填写rows
v.add(rs.getString(i + 1));
}
rows.add(v);
}
JTable jtable = new JTable(rows, colNames); // 利用rows和colNames创建一个列表控件
jscp = new JScrollPane(jtable);
jf.add(jscp);
jf.validate(); // 主界面重画一遍
}
catch (Exception ex) {
ex.printStackTrace();
return ;
}
}
}
public void init() {
try { // 准备连接并获取句柄
Properties props = new Properties();
props.load(new FileInputStream("mysql.ini"));
String driver = props.getProperty("driver");
String url = props.getProperty("url");
String user = props.getProperty("user");
String pass = props.getProperty("pass");
conn = DriverManager.getConnection(url, user, pass);
stmt = conn.createStatement();
}
catch (Exception e) {
e.printStackTrace();
}
// 加载主界面
jf = new JFrame("SQL查询器");
jp = new JPanel(); jf.add(jp, BorderLayout.NORTH);
jl = new JLabel("输入查询语句:"); jp.add(jl);
jt = new JTextField(45); jp.add(jt);
jb = new JButton("查询"); jp.add(jb);
jt.addActionListener(new ExecListener());
jb.addActionListener(new ExecListener());
jf.setSize(700, 480);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
public static void main(String[] args) {
new Test().init();
}
}