/**
* 通过区县Id获取街道列表
*/
public List selectJdListByQxId(int qxId) {
openConn();List reList = new ArrayList();
String sql = " SELECT jdid,jd,qxid FROM tbl_jd WHERE qxid = ? ";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, qxId);
rs = pstmt.executeQuery(sql);
while(rs.next()){
JD jd = new JD();
jd.setJdid(rs.getInt("jdid"));
jd.setJd(rs.getString("jd"));
jd.setQxid(rs.getInt("qxid"));
reList.add(jd);
}
} catch (SQLException e) {
e.printStackTrace();
}
return reList;
}
如上代码,运行到rs = pstmt.executeQuery(sql);这一行的时候结果为空,然后程序直接跳过while()代码,服务器抛出异常
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
经检查,将SELECT jdid,jd,qxid FROM tbl_jd WHERE qxid = 1发现完全没有问题,但是在程序中会出现问题,这是为什么呢?
请看我们的的异常信息“to use near '?' at line 1”是“?”周围有错误,这说明在数据库查询的时候并没有转化成我们要的qxId的值,而是一个活生生的“?”,
说明问题出现在 rs = pstmt.executeQuery(sql);这句话,因为这是我们最后的数程序出错的地方了,因为这句话里面的sql == " SELECT jdid,jd,qxid FROM tbl_jd WHERE qxid =?"这句话,在pstmt.setInt(1, qxId)这行代码中,我们改变的不是整体的sql,而是一个问号,也就是说这儿的sql没有被改变,当我们在 rs = pstmt.executeQuery(sql)中又加入sql,这个sql是带问号而且问号没有被改变的sql,所以当然数据库会认为你写了一个非法字符,所以直接这样写 rs = pstmt.executeQuery();问题就解决了。