MetaData的意思是元数据,即描述其他数据的数据,因此ResultSetMetaData封装了描述ResultSet对象的数据,这些描述ResultSet对象的数据包括列名、列类型、列数、表名等信息;而DatabaseMetaData则封装了描述Database的数据,这些描述数据库的元数据包括表类型、数据库的全部数据表、表的主键、表的外键、数据库里的存储过程、某个表的全部数据列等待信息。
1.ResultSetMetaData
ResultSet里包含一个getMetaData()方法,该方法返回该ResultSet对应的ResultSetMetaData对象。一旦获得了ResultSetMetaData对象,就可通过ResultSetMetaData提供大量的方法来返回ResultSet的描述信息,常用的方法有如下三个:
(1)int getColumnCount():返回该ResultSet的列数量。
(2)String getColumnName(int column):返回指定索引的列名。
(3)int getColumnType(int column):返回指定索引的列类型。
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.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; import javax.swing.table.DefaultTableModel;
public class QueryExecutor { JFrame jf=new JFrame("查询执行器"); private JScrollPane scrollPane; private DefaultTableModel model; private JButton execBn=new JButton("查询"); //用于输入查询语娥句的文本框 private JTextField sqlField=new JTextField(45); private static Connection conn; private static Statement stmt; private ResultSet rs; static { try { Properties prop=new Properties(); FileInputStream in=new FileInputStream("mysql.ini"); prop.load(in); in.close(); String driver=prop.getProperty("driver"); String url=prop.getProperty("url"); String username=prop.getProperty("user"); String password=prop.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 ExceListener()); sqlField.addActionListener(new ExceListener()); jf.add(top,BorderLayout.NORTH); jf.setSize(640, 480); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setVisible(true); } class ExceListener implements ActionListener {
@Override public void actionPerformed(ActionEvent event) { // TODO Auto-generated method stub if(scrollPane!=null) { jf.remove(scrollPane); } try { //根据用户输入的Sql语句执行查询 rs=stmt.executeQuery(sqlField.getText()); //取出ResultSet的MetaData ResultSetMetaData rsmd=rs.getMetaData(); Vector<String> columnNames=new Vector<String>(); Vector data=new Vector();
//把ResultSet的所有列名添加到Vector里 int columnCount=rsmd.getColumnCount(); for(int i=1;i<=columnCount;i++) { columnNames.add(rsmd.getColumnName(i)); } while(rs.next()) { Vector v=new Vector(); for(int i=1;i<=columnCount;i++) { v.add(rs.getString(i)); } data.add(v); } //更新TableModel model=new DefaultTableModel(data,columnNames); //创建新的JTable JTable table=new JTable(model); scrollPane=new JScrollPane(table); //添加新的Table jf.add(scrollPane); jf.pack(); //更新窗口 jf.setVisible(true); } catch(Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { new QueryExecutor().init(); } }
上面程序中蓝色斜体代码就是根据ResultSetMetaData分析ResultSet的关键代码,使用ResultSetMetaData查询ResultSet包含多少列,并把所有数据列的列名添加到一个Vector里,再把ResultSet里的所有数据添加到Vector里,并使用这两个Vector来创建新的TableModel,并利用该TableModel生成新的JTable,最后将该JTable显示出来. chengxuyunxingjieguoruxiasuoshi:
2.DatabaseMetaData
JDBC提供了DatabaseMetaData来封装数据库连接对应数据库的信息,同过Connection提供的getMetaData()方法就可以获取到数据库对应的DatabaseMetaData对象。
许多DatabaseMetaData方法以ResultSet对象的形式返回查询的信息,使用ResultSet的常规方法(例如getString和getInt)即可从这些ResultSet对象中获取数据。如果查询的信息不可用,则返回一个空的ResultSet对象。