티스토리 뷰
- JDBC의 개요
- JDBC 드라이버 로딩 및 DBMS 접속
- DB 쿼리 실행
- 쿼리문 실행 결과 값 가져오기
JDBC의 개요
JDBC는 자바/JSP 프로그램 내에서 D와 관련된 작업을 치리하는 자바 표준 인터페이스이다.
JDBC를 사용한 JSP와 DB의 연동의 프로그래밍 단계
- java.sql* 패키지 임포트
- JDBC 드라이버 로딩
- DB 접속을 위한 Connection 객체 생성
- 쿼리문을 실행하기 위한 Statement/PreparedStatement/CallableStatement 객체 생성
- 쿼리 실행
- 쿼리 실행의 결과 값 (int, ResultSet) 사용
- 사용된 객체 (ResultSet, Statement/PreparedStatement/CallableStatement) 종료
JDBC 드라이버 로딩 및 DBMS 접속
: DB 접근의 첫 단계는 JDBC 드라이버 로딩, 그 후 DB와 연결한다. 관련 작업이 종료되면 연결을 해제한다.
##JDBC 드라이버 로딩
: 로딩 단계는 드라이버 인터페이스를 구현하는 작업이다. Class.forName() 메소드를 이용한다.
드라이버가 로딩되면 자동으로 객체가 생성되고 DriverManager 클래스에 등록된다. 로딩은 한 번만 수행한다.
Class.forName(String className);
<%
try{
Class.forName("com.myslq.jdbc.Driver");
}catch(SQLException e){
}
%>
※ JDBC 드라이버 로딩을 하는 또 다른 방법
WEB-INF / web.xml 파일의 <init-param> 요소에 드라이버 이름을 설정한다.
서블릿을 초기화할 때 로딩된다.
<init-param>
<param-name>jdbcDriver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
// <init-param> 요소에 설정한 드라이버 이름을 사용한다.
java.lang.Class.forName(config.getInitParameter("jdbcDriver"));
## Connection 객체 생성
JDBC 드라이버에서 DB와 연결된 커넥션을 가져오기 위해 DriverManager 클래스의 getConnection() 메소드를 사용한다.
DriverManager 클래스로 Connection 객체를 생성할 때 JDBC 드라이버를 검색하고, 검색된 드라이버를 이용하여 Connection 객체를 생성한 후 반환한다.
- static Connection getConnection(String url)
- static Connection getConnection(String url, String user, String password)
- static Connection getConnection(String url, Properties info)
<%
Connection conn = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/JSPBookDB?user=root
&password=1234");
}
%>
## DB 연결 닫기
: DB 연결이 필요없으면 close() 메소드로 생성한 Connection 객체를 해제한다.
close() 메소드는 반드시 실행이 되야한다. 따라서 예외처리 시 finally 구문에 작성을 하도록 한다.
void close() throws SQLException
<%
Connection conn = null;
try{
String url = "jdbc:mysql://localhost:3306/jspbookdb?serverTimezone=UTC";
String user = "root";
String password = "rhkdgns92";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
out.println("데이터베이스 연결 성공!!");
} catch(SQLException e){
out.println("데이터베이스 연결 실패!!");
out.println("SQLException : " + e.getMessage());
}finally{
if(conn != null) conn.close();
}
%>
DB 쿼리 실행
DB가 연결되면 쿼리 실행 객체를 이용하여 쿼리를 실행한다.
쿼리 실행 객체는 3가지가 있다.
- Statement
- PreparedStatement
- CallableStatement
## Statement 객체로 데이터 접근하기
: 해당 객체는 정적인 쿼리에 사용이된다. 하나의 쿼리만을 실행한다. 한 번 사용하면 반드시 close() 해야한다.
Statement createStatement() throws SQLException
Statement 객체의 메소드
- executeQuery(String sql) : SELECT문 실행 시 사용
- executeUpdate(String sql) : 삽입, 수정, 삭제와 관련된 sql 문 실행
<%
Connection conn = null;
String url = "jdbc:mysql://localhost:3306/exercisedb?serverTimezone=UTC&characterEncoding=UTF-8";
String user = "root";
String password = "rhkdgns92";
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
%>
DB와의 연결 커넥션 객체를 갖고오기 위한 준비.
<%@ include file = "dbconn.jsp" %>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String passwd = request.getParameter("pwd");
String name = request.getParameter("name");
Statement stmt = null;
try{
String sql = "INSERT INTO Member(id, passwd, name) VALUES('"+ id + "','" + passwd +"','" + name +"')";
stmt = conn.createStatement();
stmt.executeUpdate(sql);
out.println("Member 테이블 삽입 성공");
} catch(SQLException e){
out.println("Member 테이블 삽입 실패");
out.println("SQLException : " + e.getMessage());
} finally{
if(stmt != null) stmt.close();
if(conn != null) conn.close();
}
%>
Statement 객체의 변수 stmt 를 선언하고, stmt에 conn객체를 이용해 Statement를 주입한다.
stmt = conn.createStatement();
그 후 stmt 객체변수를 사용하여 excuteUpdate() 메소드를 사용한다.
## PreparedStatement 객체
: 해당 객체는 동적인 쿼리에 사용한다. 하나의 객체로 여러 번의 쿼리를 실행할 수 있다.
동일한 쿼리문을 특정 값만 바꾸어서 여러 번 실행해야 할 때, 매개변수가 많아서 쿼리문을 정리해야 할 때 유용하다.
PreparedStatement prepareStatement(String sql) throws SQLException
쿼리문에서 정해지지 않은 값은 ? (물음표)로 표시하여 사용한다.
물음표에 값을 할당하기 위해 set--() 메소드를 사용한다. set이후에 필드의 데이터형을 적으면 된다.
ex) setString, setInt, setLong, setDouble ...
PreparedStatement 객체의 메소드 종류
- executeQuery() : SELECT 문을 실행할 때 사용 ==> 반환 유형 : ResultSet
- executeUpdate() : 삽입, 수정, 삭제와 관련된 SQL문 사용
<%
String sql = "SELECT*FROM Member WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "1");
Result rs = pstmt.executeQuery(sql);
%>
★주의!! 객체의 변수에 커넥션을 주입 코드 작성 시 prepare이다!!
<%
Connection conn = null
String sql = "INSERT INTO Member(id, name, passwd) VALUES (?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "1");
pstmt.setString(2, "이름");
pstmt.setString(3, "1234");
pstmt.executeUpdate();
%>
쿼리문 실행 결과 값 가져오기
: select 문 실행 시 executeQuery() 메소드 사용 시 결과값은 ResultSet 형으로 반환된다.
ResultSet 객체는 해당 객체로 부터 쿼리문을 사용하여 얻어온 데이터를 테이블 형태로 가진 객체이다.
ResultSet 객체는 SELECT 문으로 필드 값을 가져오기 위해 get--() 메소드를 사용 -- 는 필드의 데이터형으로 받으면 된다.
<%@ include file="dbconn.jsp" %>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String passwd = request.getParameter("pwd");
String name = request.getParameter("name");
ResultSet rs = null;
PreparedStatement pstmt = null;
try{
String sql = "SELECT id, passwd from member where id = '" + id + "'";
pstmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
if(rs.next()){
String rId = rs.getString("id");
String rPasswd = rs.getString("passwd");
if(id.equals(rId) && passwd.equals(rPasswd)){
sql = "update member set name = '" + name + "' where id = '"+id+"' ";
pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
out.println("Member 테이블을 수정했음");
} else {
out.println("일치하는 비밀번호가 아닙니다.");
}
} else{
out.println("member 테이블에 아이디 없음");
}
} catch(SQLException e){
out.println("예외처리!!");
out.println(e.getMessage());
} finally{
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}
%>
<%
Statement stmt = conn.createStatement();
String sql = "SELECT*FROM Member WHERE id = '1'";
ResultSet rs = stmt.executeQuery(sql);
while(re.next()){
out.println(rs.getString(2) + "," + rs.getString(3) + "<br/>");
}
rs.close();
stmt.close();
%>
<%@ include file="dbconn.jsp" %>
<table width="300" border="1">
<tr>
<td>아이디</td>
<td>비밀번호</td>
<td>이름</td>
</tr>
<%
ResultSet rs = null;
Statement stmt = null;
try{
String sql = "select * from member";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
String id = rs.getString("id");
String pw = rs.getString("passwd");
String name = rs.getString("name");
%>
<tr>
<td><%=id%></td>
<td><%=pw%></td>
<td><%=name%></td>
</tr>
<%
}
}catch(SQLException e){
out.println("Member 테이블 호출 실패!");
out.println("SQLExepction : " + e.getMessage());
}finally{
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
}
%>
</table>
<%@ include file="dbconn.jsp" %>
<table width="300" border="1">
<tr>
<td>아이디</td>
<td>비밀번호</td>
<td>이름</td>
</tr>
<%
ResultSet rs = null; // 반환 변수 생성
PreparedStatement pstmt = null; // 쿼리 객체 생성
try{
String sql = "select * from member";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()){
String id = rs.getString("id");
String pw = rs.getString("passwd");
String name = rs.getString("name");
%>
<tr>
<td><%=id%></td>
<td><%=pw%></td>
<td><%=name%></td>
</tr>
<%
}
}catch(SQLException e){
out.println("Member 테이블 호출 실패!");
out.println("SQLExepction : " + e.getMessage());
}finally{
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}
%>
</table>
update문 실행 쿼리 갖고오기
<%@ include file="dbconn.jsp" %>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String passwd = request.getParameter("pwd");
String name = request.getParameter("name");
ResultSet rs = null;
Statement stmt = null;
try{
String sql = "SELECT id, passwd from member where id = '" + id + "'";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if(rs.next()){
String rId = rs.getString("id");
String rPasswd = rs.getString("passwd");
if(id.equals(rId) && passwd.equals(rPasswd)){
sql = "update member set name = '" + name + "' where id = '"+id+"' ";
stmt = conn.createStatement();
stmt.executeUpdate(sql);
out.println("Member 테이블을 수정했음");
} else {
out.println("일치하는 비밀번호가 아닙니다.");
}
} else{
out.println("member 테이블에 아이디 없음");
}
} catch(SQLException e){
out.println("예외처리!!");
out.println(e.getMessage());
} finally{
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
}
%>
'학교공부 > JSP' 카테고리의 다른 글
chapter - 14 (cookie) (0) | 2021.05.17 |
---|---|
chapter - 13 (세션) (0) | 2021.05.16 |
JSP - 8 (0) | 2021.04.17 |
JSP - 10 (0) | 2021.04.15 |
JSP - 9 (0) | 2021.04.06 |