Java servlet mysql不在语句中

Java servlet mysql不在语句中,java,mysql,database,servlets,Java,Mysql,Database,Servlets,我正在创建一个执行sql查询的servlet,它的基本版本可以工作,但是当我添加NOT IN语句时,它返回空指针异常。我宁愿它不这样做,而是显示一条消息,说他们不能注册一个科目 以下是相关表格 user - id, name, password subject - id, name, user_id lab - id, time, room, capacity, subject_id user_lab - id, user_id, lab_id 我想写的是一条声明,如果用户尚未注册实验室

我正在创建一个执行sql查询的servlet,它的基本版本可以工作,但是当我添加NOT IN语句时,它返回空指针异常。我宁愿它不这样做,而是显示一条消息,说他们不能注册一个科目

以下是相关表格

user - id, name, password

subject - id, name, user_id

lab - id, time, room, capacity, subject_id

user_lab - id, user_id, lab_id
我想写的是一条声明,如果用户尚未注册实验室,请打印
subject.name、lab.time、lab.room

 HttpSession session = request.getSession(true);
        //Set data you want to send back to the request (will be forwarded to the page)
        //Can set string, int, list, array etc.

     String id = request.getParameter("id"); 
     System.out.println("beej");
     int user_id = 0; 

     if(id != null && (!id.equals("")) ) { 
     user_id= Integer.parseInt(id); 
     } 

     String sql = "SELECT l.id,s.name,l.day,l.time,l.room" +
              " FROM subject s, lab l " +
                " WHERE" +
                " s.id = l.subject_id"+
                            " AND l.id "+"NOT IN"+
                "SELECT l.id"+
                " FROM lab ll, user_lab ul" +
                "WHERE"+"l.id ="+"ul.lab_id" + "AND ul.user_id="+(Integer)session.getAttribute("id");


      try{
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/wae","root","");

        System.out.println(session.getAttribute("id"));

          Statement stmt = con.createStatement();
          ResultSet res = stmt.executeQuery(sql);
          System.out.println(res);
          ArrayList<String> list1 = new ArrayList<String>();
          ArrayList<String> list2 = new ArrayList<String>();
          if (res.next()){
              do{
                   list1.add(res.getString(1));
                   list2.add(res.getString(2)+" "+res.getString(3)+" "+res.getString(4)+" "+res.getString(5));


              }while(res.next());

          String[] arr1 = list1.toArray(new String[list1.size()]);
          String[] arr2 = list2.toArray(new String[list2.size()]);
          System.out.println(list2);
          request.setAttribute("res1", arr1);
          request.setAttribute("res2", arr2);
          request.setAttribute("user_id", user_id);

          }



      }catch (SQLException e) {
        } 
        catch (Exception e) {
        } 


        //Decides what page to send the request data to
        RequestDispatcher view = request.getRequestDispatcher("Student_enrol.jsp");
        //Forward to the page and pass the request and response information
        view.forward(request, response); 




org.apache.jasper.JasperException: java.lang.NullPointerException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:534)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:457)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    Student_enrol.sendBack(Student_enrol.java:104)
    Student_enrol.doGet(Student_enrol.java:40)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)


root cause 

java.lang.NullPointerException
    org.apache.jsp.Student_005fenrol_jsp._jspService(Student_005fenrol_jsp.java:95)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    Student_enrol.sendBack(Student_enrol.java:104)
    Student_enrol.doGet(Student_enrol.java:40)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
HttpSession session=request.getSession(true);
//设置要发送回请求的数据(将转发到页面)
//可以设置字符串、整数、列表、数组等。
String id=request.getParameter(“id”);
System.out.println(“beej”);
int user_id=0;
如果(id!=null&(!id.equals(“”)){
user_id=Integer.parseInt(id);
} 
String sql=“选择l.id、s.name、l.day、l.time、l.room”+
“来自受试者s,实验室l”+
“哪里”+
“s.id=l.subject\u id”+
“和l.id”+“不在”+
“选择l.id”+
“来自实验室ll,用户\实验室ul”+
其中“+”l.id=“+”ul.lab_id“+”和ul.user_id=“+(整数)session.getAttribute(“id”);
试一试{
Connection con=DriverManager.getConnection(“jdbc:mysql://localhost:3306/wae“,”根“,”);
System.out.println(session.getAttribute(“id”);
语句stmt=con.createStatement();
ResultSet res=stmt.executeQuery(sql);
系统输出打印项次(res);
ArrayList list1=新的ArrayList();
ArrayList list2=新的ArrayList();
if(res.next()){
做{
列表1.add(res.getString(1));
列表2.add(res.getString(2)+“”+res.getString(3)+“”+res.getString(4)+“”+res.getString(5));
}while(res.next());
String[]arr1=list1.toArray(新字符串[list1.size()]);
String[]arr2=list2.toArray(新字符串[list2.size()]);
System.out.println(列表2);
setAttribute(“res1”,arr1);
setAttribute(“res2”,arr2);
setAttribute(“用户标识”,用户标识);
}
}捕获(SQLE异常){
} 
捕获(例外e){
} 
//决定将请求数据发送到哪个页面
RequestDispatcher视图=request.getRequestDispatcher(“Student_enrol.jsp”);
//转发到页面并传递请求和响应信息
视图。转发(请求、响应);
org.apache.jasper.jaspereException:java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:534)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:457)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javaservlet.http.HttpServlet.service(HttpServlet.java:722)
Student_enrol.sendBack(Student_enrol.java:104)
Student\u enrol.doGet(Student\u enrol.java:40)
javaservlet.http.HttpServlet.service(HttpServlet.java:621)
javaservlet.http.HttpServlet.service(HttpServlet.java:722)
根本原因
java.lang.NullPointerException
org.apache.jsp.Student\u 005fenrol\u jsp.\u jsp服务(Student\u 005fenrol\u jsp.java:95)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javaservlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javaservlet.http.HttpServlet.service(HttpServlet.java:722)
Student_enrol.sendBack(Student_enrol.java:104)
Student\u enrol.doGet(Student\u enrol.java:40)
javaservlet.http.HttpServlet.service(HttpServlet.java:621)
javaservlet.http.HttpServlet.service(HttpServlet.java:722)

不在
选择之间添加一个空格

" s.id = l.subject_id"+
" AND l.id "+"NOT IN  " +     // <== here
"SELECT l.id"+

您还需要在“WHERE”和“and”之前加上一些空格

应该是

" WHERE "+"l.id ="+"ul.lab_id" + " AND ul.user_id="+(Integer)session.getAttribute("id"); 

对yout代码进行以下更改:

  if (res.next()){
          do{
               list1.add(res.getString(1));
               list2.add(res.getString(2)+" "+res.getString(3)+" "+res.getString(4)+" "+res.getString(5));


          }while(res.next());
      String[] arr1 = list1.toArray(new String[list1.size()]);
      String[] arr2 = list2.toArray(new String[list2.size()]);
      System.out.println(list2);
      request.setAttribute("res1", arr1);
      request.setAttribute("res2", arr2);
致:

这是因为当您尝试打印空的list2或访问list1和list2时,它将抛出错误。要避免这种情况,请仅在存在行时使用它们


此外,如John Woo所述,在查询中的单词之间添加空格:)

在子查询中包装
选择
,并在子查询周围添加
()
-query@user1393064检查此
(整数)会话的值。getAttribute(“id”)
打印出正确的值。在sql语句之前打印时
" WHERE "+"l.id ="+"ul.lab_id" + " AND ul.user_id="+(Integer)session.getAttribute("id"); 
  if (res.next()){
          do{
               list1.add(res.getString(1));
               list2.add(res.getString(2)+" "+res.getString(3)+" "+res.getString(4)+" "+res.getString(5));


          }while(res.next());
      String[] arr1 = list1.toArray(new String[list1.size()]);
      String[] arr2 = list2.toArray(new String[list2.size()]);
      System.out.println(list2);
      request.setAttribute("res1", arr1);
      request.setAttribute("res2", arr2);
  String[] arr1 = null;
  String[] arr2 = null;
  while(res.next()){
       list1.add(res.getString(1));
       list2.add(res.getString(2)+" "+res.getString(3)+" "+res.getString(4)+" "+res.getString(5));
      arr1 = list1.toArray(new String[list1.size()]);
      arr2 = list2.toArray(new String[list2.size()]);
          }
  request.setAttribute("res1", arr1);
  request.setAttribute("res2", arr2);