ResultSetMetaData和DatabaseMetaData

来源:互联网 发布:java 生成xml格式报文 编辑:程序博客网 时间:2024/06/06 14:12

         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:

ResultSetMetaData和DatabaseMetaData - quanquan127@126 - 学无止境

 
2.DatabaseMetaData
    JDBC提供了DatabaseMetaData来封装数据库连接对应数据库的信息,同过Connection提供的getMetaData()方法就可以获取到数据库对应的DatabaseMetaData对象。
    许多DatabaseMetaData方法以ResultSet对象的形式返回查询的信息,使用ResultSet的常规方法(例如getString和getInt)即可从这些ResultSet对象中获取数据。如果查询的信息不可用,则返回一个空的ResultSet对象。

原创粉丝点击