这里讲的这些条件查询的技巧主要是应对某些特定的情况,例如页面在加载的时候只需要查询出全部的内容然后再绑定显示出来,但是又允许用户选择不同的条件来对这些内容进行筛选显示,这种情况下就可以用到下面要讲的条件查询技巧来解决。
1)整型
String findData = "SELECT * FROM table ";
if (id>0) {
StrBuilder builder = new StrBuilder();
builder.append(findData);
builder.append("WHERE ID = "+ id +"");
ps = con.prepareStatement(builder.toString());
}else {
ps = con.prepareStatement(findData);
}
页面加载时参数的值为空值或者小于等于零时执行else的语句,直接给prepareStatement方法传查询全表的SQL语句。当参数大于零时就需要用到StringBuffer或者StringBuilder的append方法来拼接SQL语句的条件,同时把需要用到的参数绑定上去。
注意:在拼接SQL语句时需要在第一句的末尾或者后一句的开头加上空格,否则拼接出来的SQL语句是连起来的,就会报语法错误的异常。
2)字符串型
ps=con.prepareStatement("SELECT * FROM table WHERE name LIKE ?");
if (Str!="" || Str!=null) {
ps.setString(1, "%" + Str + "%");
}else{
ps.setString(1, "%");
}
字符串型在页面加载时参数的值为空值,所以在JDBC中需要进行判断,如果参数的值为空就给占位符赋值"%",%叫做通配符,代表任何字符任意数量,用在这里就等同于查询该条件的全部数据了。用户操作时加了筛选条件之后参数不为空时就给占位符赋值"%" + 参数 + "%"就可以实现字符串型的模糊查询。
3)布尔型
ps = con.prepareStatement("SELECT * FROM table WHERE bool IN (?,?)");
if (State == 2) {
ps.setInt(1, 0);
ps.setInt(2, 1);
}else if(State == 1){
ps.setInt(1, 1);
ps.setInt(2, 1);
}else if(State == 0){
ps.setInt(1, 0);
ps.setInt(2, 0);
}
布尔型中0与false等价、1与true等价,所以在SQL语句中就可以用上IN操作符来筛选布尔型的数据。页面加载时参数无值,这里将没有值的状态赋值为2,然后给占位符分别赋上0和1来查询全部false与true的数据。当参数为true时,给两个占位符都赋值为1,即查询所有为true的数据。查询false同理。
4)日期型
if (BeginDate==null || BeginDate=="") {
BeginDate = "1000-01-01";
}
if (EndDate==null || EndDate=="") {
EndDate = "3000-01-01";
}
ps = con.prepareStatement("SELECT * FROM table WHERE Date <= ? AND Date >= ?");
ps.setString(1, BeginDate);
ps.setString(2, EndDate);
日期型在参数为空值时需要设置默认值。这里有两个参数分别是开始时间与结束时间,开始时间要设置得尽量早,结束时间要设置得尽量晚,同时这两个参数是字符串类型。SQL语句中把参数赋值给定位符即可完成时间段的条件查询。
注意:因为设置时间的默认值时只设置了年月日,所以在查询的时候时分秒的值是00:00:00,如查询要精确到时分秒,可以在设置值时加上。