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,将执行结果显示出来,

 package db;

 import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.Vector; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField; public class QueryExecutor {
JFrame jf = new JFrame("查询执行器");
private JScrollPane scrollPane;
private JButton execBn = new JButton("查询");
//用来输入查询语句的文本框
private JTextField sqlField = new JTextField(45);
private static Connection conn;
private static Statement stmt;
//用静态初始化块来初始化Connection和Statement对象
static {
try {
//用Properties类加载属性文件
Properties prop = new Properties();
prop.load(new FileInputStream("mysql.ini"));
String drivers = prop.getProperty("driver");
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String pass = prop.getProperty("pass");
Class.forName(drivers);
conn = DriverManager.getConnection(url, user, pass);
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 ExceListener());
sqlField.addActionListener(new ExceListener());
jf.add(top, BorderLayout.NORTH);
jf.setSize(680, 480);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
//定义监听器
class ExceListener implements ActionListener { @Override
public void actionPerformed(ActionEvent evt) {
//删除原来的JTable(JTable使用scrollPane来包装)
if (scrollPane != null) {
jf.remove(scrollPane);
}
try (
ResultSet rs = stmt.executeQuery(sqlField.getText())) {
//取出ResultSet的MetaData
ResultSetMetaData rsmd = rs.getMetaData();
Vector<String> columnNames = new Vector<>();
Vector<Vector<String>> data = new Vector<>();
//把ResultSet的所有列名添加到vector里
for (int i = 0; i < rsmd.getColumnCount(); i++) {
columnNames.add(rsmd.getColumnName(i+1));
}
//把ResultSet的所有记录添加到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
JTable table = new JTable(data, columnNames);
scrollPane = new JScrollPane(table);
//添加新的table
jf.add(scrollPane);
//更新主窗口
jf.validate(); } catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public static void main(String[] args) {
new QueryExecutor().init();
}
}    

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

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

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

程序运行结果如下,

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

上一篇:集成shareSDK错误总结(新浪微博)


下一篇:Swift #function 和 _cmd (Objective-C)