关于JSP 使用prepareStatement进行综合查询的问题
本人想实现一个查询,要求是根据用户输入条件进行综合查询,例子详细如下:
数据库内 四个列 user time ip text
表单四个输入栏,如果用户 在表单user内输入内容,即在数据库查询user相似于关键字的记录,如果用户既输入user又输入time,即在数所库查询user相似关键字以及time相似关键字的记录,以此类推
现在我能将变化的SQL语句写出来,但问题是,stmt.setString()这句是变化不定的,该如何写?因为并不知道用户会在输入哪个关键字,所以除了判断用户所有的输入情况之外,好像无法动态决定stmt.setString()的写法,但判断用户所有输入情况太麻烦,只有4个也许能实现,但如果有N个,怎么办?
在线等,
PS:好像在这提问要给分的,在哪看自已有多少分?
------解决方案--------------------还没写好
sql语句为select * from <table> where time like ? or user like ? or ip like ?.
stmt.setString(1, "% "+object.getTime()+ "% ")
stmt.setString(2, "% "+object.getUser()+ "% ")
stmt.setString(3, "% "+object.getIp() + "% ")
由于是or,即使time like ? ,user like ?,ip like ? 只要有符合条件的就行了
也可以这样
上面没有对为空的检查如果为空的话条件就成%null%,这样我想没关系吧
如有关系就判断一下吧
stmt.setString(1, "% "+object.getTime()==null? " ":object.getTime()+ "% ")
------解决方案--------------------汗,重新改一下,刚才那个出错了,不过我认为应该用 AND 不应该用 OR。
Map <String, String> map = new HashMap <String, String> ();
// 将用户填入的有效条件放到 Map 中,键为字段名,值为用户输入的值
map.put( "user ", "aaa ");
map.put( "ip ", "192.168.1.1 ");
map.put( "text ", "kkk ");
// 进行 SQL 拼接
StringBuffer sb = new StringBuffer( "SELECT * FROM info WHERE ");
for (Map.Entry <String, String> entry : map.entrySet()) {
sb.append(entry.getKey()).append( " LIKE ? AND ");
}
// 去除最后一个空格和 AND
String sql = sb.toString().substring(0, sb.length()-5);
ps = con.prepareStatement(sql);
// 设置 ps 的参数
int i = 1;
for (Map.Entry <String, String> entry : map.entrySet()) {
ps.setString(i, "% " + entry.getValue() + "% ");
i++;
}
map.clear();