通用查询
本节的目的是编写一个类,只要用户将数据库名、SQL语句传递给该类对象,那么该对象就用一个二维数组返回查询的记录。
编写通用查询,需要知道数据库表的列(字段)的名字,特别是表的列数(字段的个数),那么一个简单常用的办法是使用返回到程序中的结果集来获取相关的信息。
程序中的结果集ResultSet对象rs调用getMetaData()方法返回一个ResultSetMetaData对象(结果集的元数据对象):
ResultSetMetaData metaData = rs.getMetaData();
然后ResultSetMetaData对象,例如metaData,调用getColumnCount()方法就可以返回结果集rs中的列的数目:
int columnCount = metaData.getColumnCount();
ResultSetMetaData对象,例如metaData,调用getColumnName(int i)方法就可以返回结果集rs中的第i列的名字:
String columnName = metaData.getColumnName(i);
例子6将数据库名以及SQL语句传递给Query类的对象,用表格(JTable组件)显示查询到的记录,程序代码如下所示:
import javax.swing.*;public class Example6 { public static void main(String[] args) { String [] tableHead; String [][] content; JTable table ; JFrame win= new JFrame(); Query findRecord = new Query(); findRecord.setDatabaseName("students"); findRecord.setSQL("select * from mess"); content = findRecord.getRecord(); //返回二维数组,即查询的全部记录 tableHead=findRecord.getColumnName(); //返回全部字段(列)名 table = new JTable(content,tableHead); win.add(new JScrollPane(table)); win.setBounds(12,100,400,200); win.setVisible(true); win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}
import java.sql.*;public class Query { String databaseName=""; //数据库名 String SQL; //SQL语句 String [] columnName; //全部字段(列)名 String [][] record; //查询到的记录 public Query() { try { Class.forName ("com.mysql.jdbc.Driver"); //加载 JDBC-MySQL驱动 } catch(Exception e) {} } public void setDatabaseName(String s) { databaseName=s.trim(); } public void setSQL(String SQL) { this.SQL = SQL.trim(); } public String[] getColumnName() { if(columnName ==null) { System.out.println("先查询记录"); return null; } return columnName; } public String[][] getRecord() { startQuery(); return record; } private void startQuery() { Connection con; Statement sql; ResultSet rs; String uri = "jdbc:mysql://localhost:3306/"+databaseName+ "?useSSL=true&characterEncoding=utf-8"; try { con = DriverManager.getConnection(uri,"root",""); sql = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); rs = sql.executeQuery(SQL); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); //字段数目 columnName = new String[columnCount]; for(int i=1; i<=columnCount; i++) { columnName[i-1] = metaData.getColumnName(i); } rs.last(); int recordAmount = rs.getRow(); //结果集中的记录数目 record = new String[recordAmount][columnCount]; int i=0; rs.beforeFirst(); while(rs.next()) { for(int j=1;j<=columnCount;j++) { record[i][j-1]=rs.getString(j); //第i条记录放入二维数组的第i行 } i++; } con.close(); } catch(SQLException e) { System.out.println("请输入正确的表名"+e); } }}
程序运行效果如图所示。