MySQL/에러(ERROR)

[MySQL_Error] java.sql.SQLException: No value specified for parameter 1 해결방법

림케이원 2020. 5. 26.

데브림의 블로그 포스팅 한 것들을 한 눈에 확인하고 싶다면 클릭!

👉 https://github.com/DevLimK1/tistory-map 👈 

 


기록은 나의 자산이자 누군가에게는 도움이 되고, 그토록 원하던 답변일 수 있다. 
[개발 환경]
서버: Tomcat v9.0
eclipse: Version: 2019-12 (4.14.0)
jdk: 13.0.1

▶ 발단

라면모아 사이트 후기 게시판을 구현하고 있는데,  검색기능을 구현하던 중에 에러가 발생하였다.

 

아래 코드는 ReviewListController.java (사용자의 요청을 받아 뷰(jsp)에 데이터를 넘겨줌)

   1: @WebServlet("/list")
   2: public class ReviewListController extends HttpServlet {
   3: 	private static final long serialVersionUID = 1L;
   4: 	protected void doGet(HttpServletRequest request, HttpServletResponse response)
   5: 			throws ServletException, IOException {
   6: 		List<Review> list = new ArrayList();
   7: 		String field_ = request.getParameter("f");
   8: 		String query_ = request.getParameter("q");
   9: 		String field = "title";
  10: 		
  11: 		if (field_ != null)
  12: 			field = field_;
  13: 		String query="";
  14: 		if (query_ != null)
  15: 			query = query_;
  16: 		ReviewService service = new ReviewService();
  17: 		
  18: 		try {
  19: 			list = service.getReviewList(field,query,1);
  20: 		} catch (ClassNotFoundException e) {
  21: 			// TODO Auto-generated catch block
  22: 			e.printStackTrace();
  23: 		} catch (SQLException e) {
  24: 			// TODO Auto-generated catch block
  25: 			e.printStackTrace();
  26: 		}
  27: 		request.setAttribute("list", list);
  28: 		RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/view/review/list.jsp");
  29: 		dispatcher.forward(request, response);
  30: 	}
19: 에러 발생 (아래 에러 상황 이미지 참조)

아래 코드는 ReviewService.java (DB접속하여 쿼리 실행)

   1: //검색
   2: 	public List<Review> getReviewList(String field, String query, int page) throws ClassNotFoundException, SQLException {
   3: 		List<Review> list = new ArrayList<Review>();
   4: 
   5: 		String sql = "SELECT * FROM ReviewBoardTest " + 
   6: 				" WHERE "+field+ " LIKE ? LIMIT ?,?";
   7: 		
   8: 		String url = "jdbc:mysql://dev.notepubs.com:9898/rmteam?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC";
   9: 		System.out.println(field);
  10: 		System.out.println(query);
  11: 		System.out.println(page);
  12: 		System.out.println("debuging2");
  13: 		Class.forName("com.mysql.cj.jdbc.Driver");
  14: 		Connection con = DriverManager.getConnection(url, "rmteam", "rm0322");
  15: 		PreparedStatement st = con.prepareStatement(sql);
  16: 		ResultSet rs = st.executeQuery();
  17: 		
  18: 		st.setString(1, "%"+query+"%");
  19: 		st.setInt(2, (page-1)*10);
  20: 		st.setInt(3, page*10-1);
  21: 		
  22: 		
  23: 		
  24: 		while (rs.next()) {
  25: 			Review review = new Review(rs.getInt("id"), rs.getString("item"), rs.getString("star"),
  26: 					rs.getString("regdate"), rs.getString("writerName"), rs.getString("title"), rs.getInt("comment"));
  27: 			list.add(review);
  28: 		}
  29: 		
  30: 
  31: 		rs.close();
  32: 		st.close();
  33: 		con.close();
  34: 
  35: 		return list;
  36: 	}
16: 에러 발생 (아래 에러 상황 이미지 참조)

 에러(Error) 상황

java.sql.SQLException: No value specified for parameter 1 에러발생!

시도해본 내용

parameter 1 이라는 오류 메시지를 보고 sql문에 오류가 있는지 꼼꼼히 검토해보고, 

System.out.println 으로 인자값이 제대로 넘어오는 확인을 해봤다.

물론, 구글링도 해봤음

알아낸 오류 원인

오류의 원인을 알고나니 허탈했다... 

역시 컴퓨터는 거짓말하지 않는다..

오류 해결 전

st.setString(1, "%"+query+"%");
st.setInt(2, (page-1)*10);
st.setInt(3, page*10-1);
★sql의 ?(파라미터)에 값을 대입해서 st.executeQuery(); 를 실행해야하는데
그 전에 st.executeQuery(); 를 실행했음으로 오류가 발생한 것이다.

 

 해결방법

 

오류 해결 후

간단하다.... 
sql 파라미터에 값을 대입하고 실행시킨 후 ResultSet rs=st.executeQuery(); 를 실행하게 코드 순서를 변경해준다.
♥ 수정이 필요한 부분 , 지적해주실 부분은 댓글로 부탁드려요~ 피드백은 언제나 환영입니다 ♥
♥ 긴 글 읽어주셔서 감사합니다 ♥

 

댓글