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

22 篇文章 0 订阅

核心方法

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后面的内容:

		String string1 = (jTextField1.getText().trim().isEmpty()) ? ("'%'")
				: ("'%" + jTextField1.getText() + "%'");

建立JTable中的二维数组

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

	private Object[][] tableObjects() {
		String string1 = (jTextField1.getText().trim().isEmpty()) ? ("'%'")
				: ("'%" + jTextField1.getText() + "%'");
		String string2 = (jTextField2.getText().trim().isEmpty()) ? ("'%'")
				: ("'%" + jTextField2.getText() + "%'");
		String string3 = (jTextField3.getText().trim().isEmpty()) ? ("'%'")
				: ("'%" + jTextField3.getText() + "%'");
		String string = "select fid,fname,ftype,"
				+ "fstart,fend,fstarttime,fendtime,fprice,fdiscount,"
				+ "fnumber,fnote from ticket_flight " + "WHERE fname LIKE "
				+ string1 + " and fstart LIKE " + string2 + " and fend LIKE "
				+ string3;
		Object[] objects = {};
		return fDao.resultSetToObjectArray(fDao.getResultSet(string, objects));
	}
其中,getResultSet方法如下:

	/** 查询并返回记录集 */
	public ResultSet getResultSet(String sql, Object[] objArr){
		getConn();
		try {
			ps = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			if(objArr!=null && objArr.length>0) {
				for (int i = 0; i < objArr.length; i++) {
					ps.setObject(i+1, objArr[i]);
				}
			}
			rs = ps.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			//close();
		}
		return rs;
	}

resultSetToObjectArray方法如下:

	/** 把结果集转成Object[][] */
	public Object[][] resultSetToObjectArray(ResultSet rs) {
		Object[][] data = null;
		try {	
			rs.last();
			int rows = rs.getRow();
			data = new Object[rows][];  
			ResultSetMetaData md = rs.getMetaData();//获取记录集的元数据
			int columnCount = md.getColumnCount();//列数
			rs.beforeFirst();
			int k = 0;
			while(rs.next()) {
				Object[] row = new Object[columnCount];
				for(int i=0; i<columnCount; i++) {
					row[i] = rs.getObject(i+1).toString();
				}
				data[k] = row;
				k++;
			}
		} catch (Exception e) {
			
		} finally {
			close();
		}
		return data;
	}

将二维数组放入JTable

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

对查询按钮设置监听器:

	private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
		// TODO add your handling code here:查询
		jTable1.setModel(new DefaultTableModel(tableObjects(), tableStrings));
	}
其中,tableStrings为表头字符串:

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

效果图

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


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


刷新结果

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

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

	private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
		// TODO add your handling code here:刷新
		FlightRefresh();
	}
其中,FlightRefresh方法如下:

	/** 刷新航班*/
	public void FlightRefresh() {
		jTextField1.setText(null);
		jTextField2.setText(null);
		jTextField3.setText(null);
		Object[][] dataObjects = fDao.resultSetToObjectArray(fDao.getResultSet(
				"select fid,fname,ftype,"
						+ "fstart,fend,fstarttime,fendtime,fprice,fdiscount,"
						+ "fnumber,fnote from ticket_flight", null));
		jTable1.setModel(new DefaultTableModel(dataObjects, tableStrings));
	}


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值