请教一个关于数据库不定条件查询的问题

qq_33679861 2017-05-04 04:28:03
想问各位大神一个关于多条件查询的问题,我是从网上找到了一个比较完整的代码,然后自己改了改,它使用的是sql语句拼接的方法,现在sql语句基本能拼接对,但是在执行的时候老是提示这样的错误:java.lang.RuntimeException: java.sql.SQLException: Your statment hasn't any parameter! 这个错误在网上搜都搜不到,困扰我很久了,恳请各位帮帮忙吧!代码如下:
拼接sql语句的类
public class PersonServices {
public List<Map<String,String>> queryperson(String...val)throws Exception

{
Connection conn=null;
PreparedStatement psmt=null;
ResultSet rs=null;
Db2 db2=new Db2();
try{

String pname=val[0];
String pnumber=val[1];
String xl=val[2];
String jszc=val[3];
String bsal=val[4];
String esal=val[5];

System.out.println(pname);
System.out.println(pnumber);
System.out.println(xl);
System.out.println(jszc);
System.out.println(bsal);
System.out.println(esal);


conn=db2.ConnAcc();

List<Object> pars=new ArrayList<>();
StringBuilder sql=new StringBuilder("select * from X where 1=1");

if(pname != null && !pname.trim().isEmpty()){

sql.append(" and PNAME=");
sql.append(pname);
pars.add(pname);

}
if(pnumber != null && !pnumber.trim().isEmpty()){
sql.append(" and PNUMBER=");
sql.append(pnumber);
pars.add(pnumber);

}
if(xl != null && !xl.trim().isEmpty()){
sql.append(" and XL=");
sql.append(xl);
pars.add(xl);

}
if(jszc != null && !jszc.trim().isEmpty()){
sql.append(" and JSZC=");
sql.append(jszc);
pars.add(jszc);

}
if(bsal != null && !bsal.trim().isEmpty()){
sql.append(" and BSAL>=");
sql.append(bsal);


pars.add(bsal);

}
if(esal != null && !esal.trim().isEmpty()){
sql.append(" and ESAL<=");
sql.append(esal);

pars.add(esal);

}

System.out.println(sql);
System.out.println(pars);
psmt=conn.prepareStatement(sql.toString());
int index=1;
for (Object parm : pars) {
psmt.setObject(index++, parm);
}
rs=psmt.executeQuery();

ResultSetMetaData rsmd=rs.getMetaData();
int count=rsmd.getColumnCount();
int init_size=((int)(count/0.75))+2;


List<Map<String,String>> rows=new ArrayList<>();

Map<String,String> ins=null;
while(rs.next()){
ins=new HashMap<>(init_size);
for(int i=1;i<=count;i++){
ins.put(rsmd.getColumnLabel(i).toLowerCase(),rs.getString(i));
}


rows.add(ins);
}
return rows;


}catch(SQLException e){
throw new RuntimeException(e);
}
//return null;
}

servlet类

public class a1servlet extends HttpServlet{
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


String pname=request.getParameter("qpname");
String pnumber=request.getParameter("qpumber");
String xl=request.getParameter("qxl");
String jszc=request.getParameter("qjszc");
String bsal=request.getParameter("bsal");
String esal=request.getParameter("esal");

String val[]={pname,pnumber,xl,jszc,bsal,esal};
PersonServices service=new PersonServices();
try {
List<Map<String,String>> rows=service.queryperson(val);
request.setAttribute("rows", rows);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(pname);
System.out.println(pnumber);
System.out.println(xl);
System.out.println(jszc);
System.out.println(bsal);
System.out.println(esal);
}

jsp界面body部分
<form action="/index/a1" method="get">  
<!-- 数据查询条件区 -->
<div class="query">
<table>
<caption>
员工管理
<hr>
</caption>
<tr class="title">
<td colspan="100">查询条件</td>
</tr>
<tr>
<td>姓名</td>
<td>
<input type="text" name="qpname">
</td>
<td>身份证</td>
<td>
<input type="text" name="qpnumber">
</td>
</tr>
<tr>
<td>学历</td>
<td>
<select name="qxl">
<option value="">==不限==</option>
<option value="1">高中以下</option>
<option value="2">高中</option>
<option value="3">专科</option>
<option value="4">本科</option>
</select>
</td>
<td>技术职称</td>
<td>
<select name="qjszc">
<option value="">==不限==</option>
<option value="01">初级职称</option>
<option value="02">中级职称</option>
<option value="03">副高级职称</option>
<option value="04">高级职称</option>
</select>
</td>
</tr>
<tr>
<td>工资[B]</td>
<td>
<input type="number" step="0.01" name="bsal">
</td>
<td>工资[E]</td>
<td>
<input type="number" step="0.01" name="esal">
</td>
</tr>
</table>
</div>

<!-- 数据迭代区(以表格形式显示查询结果) -->
<div class="data">
${rows }
</div>

<!-- 按钮区 -->
<div class="button">
<table>
<tr>
<td>
<input type="submit" name="next" value="查询">
<input type="submit" name="next" value="添加">
<input type="submit" name="next" value="删除" disabled="disabled">
</td>
</tr>
</table>
</div>
</form>

代码有点长,想知道哪里错了,谢谢各位!
...全文
203 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33679861 2017-05-04
  • 打赏
  • 举报
回复
引用 14 楼 qq2890974020 的回复:
[quote=引用 11 楼 qq_33679861 的回复:]
[quote=引用 8 楼 qq2890974020 的回复:]
把拼好的sql直接扔数据库里试试,看看sql有没问题

数据库可以查询出来,java不行[/quote]
那说明sql拼接没有问题,拼接完直接这样
psmt=conn.prepareStatement(sql.toString());
rs = psmt.executeQuery();[/quote]
就是这样处理的啊,放在一个rows里面,jsp界面接收rows显示。是不是这部分有问题?其实我不太清楚这部分的代码

zy_arhahaha 2017-05-04
  • 打赏
  • 举报
回复
引用 11 楼 qq_33679861 的回复:
[quote=引用 8 楼 qq2890974020 的回复:] 把拼好的sql直接扔数据库里试试,看看sql有没问题
数据库可以查询出来,java不行[/quote] 那说明sql拼接没有问题,拼接完直接这样 psmt=conn.prepareStatement(sql.toString()); rs = psmt.executeQuery();
qq_33679861 2017-05-04
  • 打赏
  • 举报
回复
引用 7 楼 zc881124 的回复:
字符串能这么拼?试试上面图片的方法
可是从运行结果来看,sql语句拼接的结果是正确的啊
qq_33679861 2017-05-04
  • 打赏
  • 举报
回复
引用 10 楼 zjs91 的回复:
[quote=引用 9 楼 qq_33679861 的回复:] [quote=引用 5 楼 zjs91 的回复:] for (Object parm : pars) { psmt.setObject(index++, parm); } 这句有问题,你的sql中没有问号占位符,为什么还要替换参数呢
该怎么修改呢,是把那句删掉吗?[/quote] 是的[/quote] 删除了也不行,界面的姓名那输入:zhangsan,控制台错误变成了:java.lang.RuntimeException: java.sql.SQLException: Invalid column or variable: zhangsan
qq_33679861 2017-05-04
  • 打赏
  • 举报
回复
引用 8 楼 qq2890974020 的回复:
把拼好的sql直接扔数据库里试试,看看sql有没问题
数据库可以查询出来,java不行
zjs91 2017-05-04
  • 打赏
  • 举报
回复
引用 9 楼 qq_33679861 的回复:
[quote=引用 5 楼 zjs91 的回复:] for (Object parm : pars) { psmt.setObject(index++, parm); } 这句有问题,你的sql中没有问号占位符,为什么还要替换参数呢
该怎么修改呢,是把那句删掉吗?[/quote] 是的
qq_33679861 2017-05-04
  • 打赏
  • 举报
回复
引用 5 楼 zjs91 的回复:
for (Object parm : pars) { psmt.setObject(index++, parm); } 这句有问题,你的sql中没有问号占位符,为什么还要替换参数呢
该怎么修改呢,是把那句删掉吗?
zy_arhahaha 2017-05-04
  • 打赏
  • 举报
回复
把拼好的sql直接扔数据库里试试,看看sql有没问题
110成成 2017-05-04
  • 打赏
  • 举报
回复
字符串能这么拼?试试上面图片的方法
qq_33679861 2017-05-04
  • 打赏
  • 举报
回复
引用 3 楼 zc881124 的回复:

啥意思呢,我拼接sql语句错了?运行一下是这样的
zjs91 2017-05-04
  • 打赏
  • 举报
回复
for (Object parm : pars) { psmt.setObject(index++, parm); } 这句有问题,你的sql中没有问号占位符,为什么还要替换参数呢
qq_33679861 2017-05-04
  • 打赏
  • 举报
回复
引用 2 楼 qq2890974020 的回复:
拼接好的sql语句呢,直接放到数据库里运行试试

界面是这个样子,比如我输入下图中的这几项,控制台输出的sql语句是:select * from X where 1=1 and PNAME=zhangsan and BSAL>=1320 and ESAL<=2231,同时会出现下面的错误:


会不会是拼接好后,执行sql的代码有问题呢?
110成成 2017-05-04
  • 打赏
  • 举报
回复
zy_arhahaha 2017-05-04
  • 打赏
  • 举报
回复
拼接好的sql语句呢,直接放到数据库里运行试试
qq_33679861 2017-05-04
  • 打赏
  • 举报
回复
给自己顶一下:PersonServices类中,拼接完sql语句后,执行sql的语句不太明白

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧