核心方法
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));
}