티스토리 뷰

학교공부/JSP

JDBC

날따라해봐요요롷게 2021. 6. 13. 22:10
  • 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함