zoukankan      html  css  js  c++  java
  • 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,将执行结果显示出来,

      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列的值

    程序运行结果如下,

  • 相关阅读:
    Unity小地图Map
    DoTween扩展Transform
    Android开发笔记1.2
    Android开发笔记1.1.1
    Unity向量夹角
    使用vi
    MIPS 两个数的和(输入,计算,输出)
    python openpyxl 读取excel表操作
    javaI/O文件,读操作
    试用git遇见问题
  • 原文地址:https://www.cnblogs.com/fysola/p/6170869.html
Copyright © 2011-2022 走看看