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

    程序运行结果如下,

  • 相关阅读:
    第十四周 Leetcode 315. Count of Smaller Numbers After Self(HARD) 主席树
    POJ1050 To the Max 最大子矩阵
    POJ1259 The Picnic 最大空凸包问题 DP
    POJ 3734 Blocks 矩阵递推
    POJ2686 Traveling by Stagecoach 状态压缩DP
    iOS上架ipa上传问题那些事
    深入浅出iOS事件机制
    iOS如何跳到系统设置里的各种设置界面
    坑爹的私有API
    业务层网络请求封装
  • 原文地址:https://www.cnblogs.com/fysola/p/6170869.html
Copyright © 2011-2022 走看看