0321

使用ResultSetMetaData分析结果集
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import java.util.*;
import java.io.*;
import java.sql.*;
public class QueryExecutor
{
	JFrame jf = new JFrame("執行查詢器");   //Creates a new, initially invisible Frame with the specified title. 
	private JScrollPane scrollPane;  //JScrollPane提供轻量级组件的可滚动视图
	private JButton execBn = new JButton("查询");//Creates a button with "查询"。
	// 用于输入查询语句的文本框
	private JTextField sqlField = new JTextField(20);//testfield宽度
	private static Connection conn;
	private static Statement stmt;
	// 采用静态初始化块来初始化Connection、Statement对象。在类加载时首先执行,且只会执行一次。
	static
	{
		try
		{
			Properties props = new Properties();
			props.load(new FileInputStream("mysql.ini"));
			String drivers = props.getProperty("driver");
			String url = props.getProperty("url");
			String username = props.getProperty("user");
			String password = props.getProperty("pass");
			// 加载数据库驱动
			Class.forName(drivers);
			// 取得数据库连接
			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(680, 480);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setVisible(true);
	}
	// 定义监听器
	class ExceListener implements ActionListener
	{
		public void actionPerformed(ActionEvent evt)  //当动作发生时被调用
		{
			// 删除原来的JTable(JTable使用scrollPane来包装)
			if (scrollPane != null)
			{
				jf.remove(scrollPane);
			}
			try(
				// 根据用户输入的SQL执行查询
				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 (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args)
	{
		new QueryExecutor().init();
	}
}

猜你喜欢

转载自huadianfanxing.iteye.com/blog/2364631