mysql预编译模糊查询恶心了我一天的时间,终于弄好了。但是还有一点不明白。如下:
为什么用serNString方法能行,用setString方法死活不行。我真晕了。
为什么用serNString方法能行,用setString方法死活不行。我真晕了。
2016-06-08
Sorry,上面的代码有错,没考虑同时传指令和描述的情况,改成如下这样就没问题了。当然最好最简洁的写法还是老师那样,在拼接时就设定好,后面直接传参
boolean descFlag=false,cmdFlag=false; if (cmd!=null && !"".equals(cmd.trim())){ sql.append(" and command=?"); cmdFlag=true;//指令传参,标记改为真 } if (desc!=null && !"".equals(desc.trim())){ sql.append(" and description like ?"); descFlag=true; //描述传参,标记改为真 } try { ps = conn.prepareStatement(sql.toString()); int index=0; //参数索引值 //两个标记里若为真,说明有参,用参数取代占位符,否则跳过 if (cmdFlag) ps.setString(++index, cmd); if (descFlag) ps.setString(++index, "%"+desc+"%"); rs = ps.executeQuery();
不用这么麻烦,你可以定义个boolean的变量,用来记录传参是不是description,如果是,在paramList的循环里做模糊拼接,不是,就不用
boolean descFlag=false; //标记传来的参数是否为description,为后面的模糊查询SQL语句拼接做准备 if (desc!=null && !"".equals(desc.trim())){ sql.append(" and description like ?"); descFlag=true; //如果传参description,设为真 paramList.add(desc); } try { //System.out.println(sql.toString()); //用于调试输出SQL语句 ps = conn.prepareStatement(sql.toString()); if (paramList.size()>0){ for (int i=0;i<paramList.size();i++){ //如果flag为真,做模糊查询拼接,否则,无需拼接 if (descFlag) ps.setString(i+1, "%"+paramList.get(i)+"%"); else ps.setString(i+1, paramList.get(i)); //System.out.println(paramList.get(i));//调试输出参数值 } }
举报