为了账号安全,请及时绑定邮箱和手机立即绑定

输入查询条件会报参数索引超出范围的错误

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

两个百分号之间加了空格,

控制台打印的paramerList为??????是不是表示页面的参数没有传过去?

package servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import bean.Message;

/**
 * @author 570
 *
 */
public class ListServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        try {
            
            String command = req.getParameter("command");//从页面拿到参数
            String description =req.getParameter("description");
            
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=true","root","root");
            
//            String sql ="SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM imooc_mybatis_list";
            
            //where 1=1 用于语句拼接。。不明所以
            StringBuilder sql = new StringBuilder("select ID,COMMAND,DESCRIPTION,CONTENT from imooc_mybatis_list where 1=1"); 
            
            PreparedStatement ps = conn.prepareStatement(sql.toString());
//            PreparedStatement ps = conn.prepareStatement(sql);
            //多条件查询时,利用List做缓冲,保存查询参数,然后再循环赋值
            List<String> paramerList = new ArrayList<String>();
            //语句拼接如果查询的指令非空且非空字符串则执行语句拼接查询
            if (command!=null&&!"".equals(command.trim())) {
                sql.append(" and COMMAND=? ");
                paramerList.add(command);
            }
            
            if (description!=null&&!"".equals(description.trim())) {
                sql.append("and DESCRIPTION like '%' ? '%' ");
                paramerList.add(description);
            }
            //把页面上的语句拿给要送到数据库查询的ps中
            for (int i = 0; i < paramerList.size(); i++) {
                System.out.println(paramerList.get(i));
                ps.setString(i+1, paramerList.get(i));//错误指向这一行
            }
            
            ResultSet rs = ps.executeQuery();
            List<Message> messageList = new ArrayList<Message>();
            
            while (rs.next()) {
                Message message = new Message();
                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 (ClassNotFoundException e) {            
            e.printStackTrace();
        } catch (SQLException e) {            
            e.printStackTrace();
        }        
        req.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        this.doGet(req, resp);
    }
    
    

}


正在回答

3 回答

" and COMMAND=? "     ?后面不要加空格

0 回复 有任何疑惑可以回复我~

你把req.setCharacterEncoding("UTF-8");这行代码复制到你的第34行应该是可以的

0 回复 有任何疑惑可以回复我~

出现了问号是编码问题, 你在第35行加一下这个,设置编码utf-8,试试看

req.setCharacterEncoding("UTF-8");


0 回复 有任何疑惑可以回复我~
#1

124839 提问者

按照您说的确是不是问号了,,谢谢。。不过还是出现了 信息: Server startup in 2194 ms 查看 java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). 。。。一大串
2016-09-13 回复 有任何疑惑可以回复我~
#2

Uauslman 回复 124839 提问者

sql.append("and DESCRIPTION like '%' ? '%' ");你的第60行是否输入了空格。sql语句语法对不对你再看看。输入空格试试。
2016-09-20 回复 有任何疑惑可以回复我~
#3

124839 提问者 回复 Uauslman

输入空格了。。就算是第一个查询命令command输入查看也会报java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).这个错误
2016-09-20 回复 有任何疑惑可以回复我~
#4

124839 提问者 回复 Uauslman

我把sql语句打出来了(select ID,COMMAND,DESCRIPTION,CONTENT from imooc_mybatis_list where 1=1 and COMMAND='?' 查看)是不是’查看‘没有替换掉‘?’
2016-09-20 回复 有任何疑惑可以回复我~
#5

Uauslman 回复 124839 提问者

我研究老半天才发现你把“PreparedStatement ps = conn.prepareStatement(sql.toString());”这就放到了判断句之前,在没有添加任何元素的情况下,当然回事空指针异常报警,希望能帮到你。
2016-09-20 回复 有任何疑惑可以回复我~
#6

Uauslman 回复 Uauslman

我研究老半天才发现你把“PreparedStatement ps = conn.prepareStatement(sql.toString());”这句放到了判断句之前,在没有添加任何元素的情况下就去执行这句话,当然会空指针异常报警,希望能帮到你。
2016-09-20 回复 有任何疑惑可以回复我~
查看3条回复

举报

0/150
提交
取消

输入查询条件会报参数索引超出范围的错误

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信