Java servlet mysql不在语句中
我正在创建一个执行sql查询的servlet,它的基本版本可以工作,但是当我添加NOT IN语句时,它返回空指针异常。我宁愿它不这样做,而是显示一条消息,说他们不能注册一个科目 以下是相关表格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 我想写的是一条声明,如果用户尚未注册实验室
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);