问答详情
源自:2-6 列表查询

确定和老师的代码一样,但是报错

已经排查了一小时了,实在是找不出毛病了,一查询就错,Parameter index out of range (1 > number of parameters, which is 0).我看也没少问号啊

public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		try {
			req.setCharacterEncoding("UTF-8");
			String command = req.getParameter("command");
			String description = req.getParameter("description");
			req.setAttribute("command", command);
			req.setAttribute("description", description);
			System.out.println(command+description);
			Class.forName("com.mysql.jdbc.Driver");
			Connection ct = DriverManager.getConnection("jdbc:mysql:///wechat?useUnicode=true&characterEncoding=UTF-8",
					"root", "qxqx");
			StringBuilder sql = new StringBuilder(
					"select ID,COMMAND,DESCRIPTION,CONTENT from message where 1=1 ");
			PreparedStatement ps = ct.prepareStatement(sql.toString());
			List<String> paramList = new ArrayList<String>();
			if (command != null && !"".equals(command.trim())) {
				sql.append(" and COMMAND='?' ");
				paramList.add(command);
			}
			if (description != null && !"".equals(description.trim())) {
				sql.append(" and DESCRIPTION like '%' ? '%' ");
				paramList.add(description);
			}
			for (int i = 0; i < paramList.size(); i++) {

				ps.setString(i + 1, paramList.get(i));
			}
			System.out.println(ps.toString());
			ResultSet rs = ps.executeQuery();
			List<Message> messageList = new ArrayList<Message>();

			while (rs.next()) {
				Message message = new Message();
				// 容器里加入的都是引用,不是对象本身,所以后续的set方法依然有用
				messageList.add(message);
				message.setId(rs.getString("ID"));
				message.setCommand(rs.getString("COMMAND"));
				message.setDescription(rs.getString("DESCRIPTION"));
				message.setContent(rs.getString("CONTENT"));
			}
			req.setAttribute("messageList", messageList);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		req.getRequestDispatcher("/WEB-INF/jsp/back/list.jsp").forward(req,
				resp);
	}

还有一个小问题,为什么doPost()方法用super.doGet(req,resp)会出现405错误,用doPost(req,resp)就可以了

==============================分割线===========================================

第一个问题解决了,把PreparedStatement ps = ct.prepareStatement(sql.toString());放到for循环前一行

提问者:JHsssss 2016-11-11 17:26

个回答

  • 慕圣2276752
    2016-11-12 11:06:16
    已采纳

    查询就出错? 是查询全部的数据出错,还是查询  command  指令出错,如果是 第一个,我没看出什么毛病,如果是第二个,你在 20 、 24 打个断点,我怀疑是 paramList.size() 出了问题 , paramList 数据未添加进去 ! 查询下数据,断点查看下你的 sql 语句是否出现问题!  还有最主要:   PreparedStatement ps = ct.prepareStatement(sql.toString());   你放错了位置,是放在paramList 添加参数后面的!

  • FloatingShuYin
    2016-12-11 13:51:21

    sql.append(" and COMMAND='?' ");

    ?问号不要加'' 单引号