테이블 값 조회
jsp와 database 연결을 공부하면서 테이블의 데이터를 다루는 쿼리문장들을 여럿 살펴보았다. 그중 가장 처음으로 했던 select 쿼리문을 이용하여 선택적인 값만 조회하도록 하자.
처음에는 select *from table; 이라는 문구로 데이터베이스 테이블내의 모든 데이터를 조회하고 조회한 결과를 웹 페이지에 출력 했었다.
그리고 두번째로, UPDATE 쿼리문을 공부할때에 테이블내의 특정 아이디값을 조회하여 해당 아이디값의 행을 모두 출력하는 방법도 해보았다. select * from table where id = ?;
이제 더 나아가, 조회하려는 기준 값이 id가 아닌, name 또는 email 등 으로 유동적으로 바뀔수 있다고 생각을 해 봐야한다. 예를들면 mysql 관련 게시물을 검색하고 싶은데, 제목을 기준으로 검색을 할지, 내용을 기준으로 검색을 할지, 작성자를 기준으로 검색을 할지를 정하는것이다.
1. 검색 입력창 구현
form 태그를 이용해 검색창을 구현해보자.
검색하려는 기준 값이 제공하려는 속성만큼 갯수가 한정적으로 정하고 싶다. select 입력창으로, 검색할 기준의 option을 정한다. 그리고 검색할 내용을 input text 박스에 입력하고 submit으로 실질적인 데이터베이스의 쿼리문과 값을 출력해 보여주는 파일로 url경로를 설정한다.
<form action="<%=request.getContextPath()%>/msearch/m_search_list.jsp" method="post">
<select name="sk">
<option value="m_id">아이디</option>
<option value="m_level">권한</option>
<option value="m_name">이름</option>
<option value="m_email">이메일</option>
</select>
<input type="text" name="sv">
<input type="submit" value="검색버튼">
</form>
검색 입력창
2. 값을 받아오기
버튼 - 클릭시 action에 해당하는 경로로 이동하며, 입력했던 값을 getContextPath 메소드를 호출하여 가지고 간다.
값을 받아오기 위해서는 가져온 값을 getParameter 메소드를 호출하여야 하는점을 알고 있을 것이다.
<%
String sk = request.getParameter("sk");
String sv = request.getParameter("sv");
%>
새로운 변수에 값을 담아 보다 편하게 사용할수 있다.
이제 값을 받아왔으니, 데이터베이스를 연결하고, 쿼리문을 작성,실행하여 값을 출력해보자.
3. 데이터베이스 객체 임포트
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.ResultSet" %>
<%@ page import = "java.sql.SQLException" %>
늘 그렇듯 데이터베이스의 객체를 사용하기 위해 임포트 해주는것이 첫번째 이다.
4. 변수 초기화(선언)와 드라이버 로딩
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
Class.forName("com.mysql.jdbc.Driver");
5. 데이터베이스 연결 Connection
String jdbcDriver = "jdbc:mysql://localhost:3306/dev35db?" +
"useUnicode=true&characterEncoding=euckr";
String dbUser = "dev35id";
String dbPass = "dev35pw";
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
6. 쿼리문 작성, 조건문 이용
선택창에서 값을 선택하지 않고, 입력창에 값을 입력하지 않을때 쿼리문을 실행해서는 안된다.
if(sk != null & sv != null){
pstmt = conn.prepareStatement("SELECT *FROM tb_member WHERE "+sk+"=?");
pstmt.setString(1, sv);
}
이때 쿼리문은 sk를 동적? 변수 ?로 두고 사용할 경우에 '' 따옴표 사이에 들어가서 쿼리문이 제대로 이루어지지 않으므로, 직접 변수를 대입하여 문장을 완성하였다.
또한, 해보지는 않았지만 mySQL에서 LIKE 구문을 사용해본 적이 있을 것이다. 이 구문을 쿼리문에 넣어 응용해본다면, 그 해당 문구가 들어가는 결과값을 출력할수 있을것 같다.
주의할점으로, 쿼리문은 sql툴에서 복사해서 가져온 후 값을 수정하여야 오타없이 작동한다.
하지만 그래도 오타가 있을 수 있으니 쿼리문 자체를 콘솔창에 출력해 보고, 콘솔창에서 출력된 쿼리문을 복사해서 다시 sql툴에서 실행해보아야 한다. 실행이 된다면 그대로 사용해도 좋다.
7. 쿼리문 실행
rs = pstmt.executeQuery();
쿼리문을 실행하고 그 결과를 rs 변수에 저장한다. (boolean 타입의 결과라 변수자체를 이용할순 없다.)
8. 쿼리 결과 사용.출력
while(rs.next()){
<%= rs.getString("m_id")%>
<%= rs.getString("m_pw")%>
<%= rs.getString("m_level")%>
<%= rs.getString("m_name")%>
<%= rs.getString("m_email")%>
}
검색 결과가 여러개일 수도 있다. 그러므로 while 반복문을 사용하여 rs의 값이 없을때 까지 next 메소드를 사용하여 한 행씩 출력한다.
9. 객체종료
rs.close();
pstmt.close();
conn.close();
메모리낭비를 줄이기 위해 마지막엔 언제나 객체를 종료시킨다