JDBC之实现对MySQL数据的模糊查询

核心方法

 

[sql][/sql] view plaincopy

  1. select * from AAA where A like ‘%a%’ and B like ‘%b%’ and C like ‘%c%’ and…

上式中:AAA为表名,A、B、C、…、为列名。

 

即表示在表AAA中查询A列中含有a字符、B列中含有b字符、C列中含有c字符的记录。。

要求

如下图的一张航班信息列表,需按照航班班次、出发站、目的站等任意一个或多个条件来查询航班信息。

查询分析

对于“航班班次”的输入框,为保证查询的合理性和有效性:

(1)若输入结果为空,则查询语句应为 …where fname like ‘%‘…

(2)若输入结果不为空,则查询语句为..where fname like ‘%查询内容%’…

故,我们可以采用三目运算符来表示like后面的内容:

 

[java][/java] view plaincopy

  1. String string1 = (jTextField1.getText().trim().isEmpty()) ? (“‘%'”)
  2.         : (“‘%” + jTextField1.getText() + “%'”);

建立JTable中的二维数组

 

通过核心方法和查询分析,即可通过SQL语句来模糊查询数据库中内容,并将其转化为二维数组。

 

[java][/java] view plaincopy

  1. private Object[][] tableObjects() {
  2.     String string1 = (jTextField1.getText().trim().isEmpty()) ? (“‘%'”)
  3.             : (“‘%” + jTextField1.getText() + “%'”);
  4.     String string2 = (jTextField2.getText().trim().isEmpty()) ? (“‘%'”)
  5.             : (“‘%” + jTextField2.getText() + “%'”);
  6.     String string3 = (jTextField3.getText().trim().isEmpty()) ? (“‘%'”)
  7.             : (“‘%” + jTextField3.getText() + “%'”);
  8.     String string = “select fid,fname,ftype,”
  9.             + “fstart,fend,fstarttime,fendtime,fprice,fdiscount,”
  10.             + “fnumber,fnote from ticket_flight ” + “WHERE fname LIKE “
  11.             + string1 + ” and fstart LIKE ” + string2 + ” and fend LIKE “
  12.             + string3;
  13.     Object[] objects = {};
  14.     return fDao.resultSetToObjectArray(fDao.getResultSet(string, objects));
  15. }

其中,getResultSet方法如下:

 

 

[java][/java] view plaincopy

  1. /** 查询并返回记录集 */
  2. public ResultSet getResultSet(String sql, Object[] objArr){
  3.     getConn();
  4.     try {
  5.         ps = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
  6.         if(objArr!=null && objArr.length>0) {
  7.             for (int i = 0; i < objArr.length; i++) {
  8.                 ps.setObject(i+1, objArr[i]);
  9.             }
  10.         }
  11.         rs = ps.executeQuery();
  12.     } catch (SQLException e) {
  13.         e.printStackTrace();
  14.     } finally {
  15.         //close();
  16.     }
  17.     return rs;
  18. }

 

resultSetToObjectArray方法如下:

[java][/java] view plaincopy

  1. /** 把结果集转成Object[][] */
  2. public Object[][] resultSetToObjectArray(ResultSet rs) {
  3.     Object[][] data = null;
  4.     try {
  5.         rs.last();
  6.         int rows = rs.getRow();
  7.         data = new Object[rows][];
  8.         ResultSetMetaData md = rs.getMetaData();//获取记录集的元数据
  9.         int columnCount = md.getColumnCount();//列数
  10.         rs.beforeFirst();
  11.         int k = 0;
  12.         while(rs.next()) {
  13.             Object[] row = new Object[columnCount];
  14.             for(int i=0; i<columnCount; i++) {
  15.                 row[i] = rs.getObject(i+1).toString();
  16.             }
  17.             data[k] = row;
  18.             k++;
  19.         }
  20.     } catch (Exception e) {
  21.     } finally {
  22.         close();
  23.     }
  24.     return data;
  25. }

将二维数组放入JTable

方法参见博文:http://blog.csdn.net/jueblog/article/details/9635527

对查询按钮设置监听器:

 

[java][/java] view plaincopy

  1. private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
  2.     // TODO add your handling code here:查询
  3.     jTable1.setModel(new DefaultTableModel(tableObjects(), tableStrings));
  4. }

其中,tableStrings为表头字符串:

 

 

[java][/java] view plaincopy

  1. String[] tableStrings = { “航班ID”, “航班班次”, “客机型号”, “出发城市”, “飞往城市”, “起飞时间”,
  2.         “降落时间”, “机票价格”, “最低折扣”, “机票总数”, “备注信息” };

效果图

 

如查询“航班班次”中,带有“3”的航班,结果如下:

在此基础上,增加查询条件:目的站带有“门”的航班班次。结果如下:

刷新结果

为了更方便的使用,可以通过刷新按钮,来显示全部航班,并清空三个查询输入框信息:

给“刷新”键设置监听器如下:

 

[java][/java] view plaincopy

  1. private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
  2.     // TODO add your handling code here:刷新
  3.     FlightRefresh();
  4. }

其中,FlightRefresh方法如下:

 

 

[java][/java] view plaincopy

  1. /** 刷新航班*/
  2. public void FlightRefresh() {
  3.     jTextField1.setText(null);
  4.     jTextField2.setText(null);
  5.     jTextField3.setText(null);
  6.     Object[][] dataObjects = fDao.resultSetToObjectArray(fDao.getResultSet(
  7.             “select fid,fname,ftype,”
  8.                     + “fstart,fend,fstarttime,fendtime,fprice,fdiscount,”
  9.                     + “fnumber,fnote from ticket_flight”, null));
  10.     jTable1.setModel(new DefaultTableModel(dataObjects, tableStrings));
  11. }

标签