JSP + Servlet | JDBC - 테이블 조회하고 출력하기

파과·2022년 7월 18일
0

JSP + Servlet

목록 보기
21/33

JDBC
JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

JDBC로 데이터 조작하기

JDBC란? 자바프로그램에서 일관된 방식으로 데이터베이스에 접근할 수 있도록 API를 제공하는 클래스의 집합. (클래스들과 인터페이스들의 묶음)

JDBC로 데이터베이스에 연결하는 절차

  1. JDBC 드라이버 로드 - DriverManager
  2. 데이터베이스와 연결 - Connection
  3. SQL문 실행 - Statement
  4. 데이터베이스와 연결 끊음 - ResultSet

사용되는 인터페이스

  • Connection 데이터베이스와 연결
    • DriverManager.getConnection()으로 얻음
  • Statement 질의, 갱신 실행
    • connection.createStatement()로 얻음
  • ResultSet 결과물
    • statement.executeQuery()로 얻음

데이터베이스와 연결하기

1-1. Dynamic Web Project 생성
1-2. oracle이 설치된 디렉토리에서 JDBC 드라이버 파일을 찾아 복사함 (파일명: ojdbc6.jar)
1-3. 복사한 파일을 해당 프로젝트의 WebContent\WEB-INF\lib 폴더에 복사함 (매 프로젝트 생성시마다 해 줘야 함)

  1. 클래스로 JDBC 드라이버 로드.
Class.forName("oracle.jdbc.driver.OracleDriver");

오라클드라이버가 로드되어 DriveManager(자바에서 드라이버를 관리하는 객체)에 등록된다.

  1. getConnection으로 Connection 객체 얻기
Connection conn = null;
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String uid = "scott";
String pass = "tiger";
conn = DriverManager.getConnection(url, uid, pass);
  • 매개변수는 각각 관계형 데이터베이서 엔진에서 url: 위치, uid: 사용자 계정, pwd: 사용자 패스워드를 입력한다.
  • 'orcl'자리에는 전역 데이터베이스의 이름이 들어간다. oracle sql developer에서 오라클 계정 오른쪽 클릭 - 속성 - 세부정보의 SID에 적힌 이름을 적어준다.
  • 객체 변수로 접근할 수 있도록 getConnection()의 결과값을 conn에 넣어준다.
  1. 사용이 끝났다면 데이터베이스와의 연결을 끊는다.
conn.close();

SQL문과 Statement, ResultSet 클래스

SQL문 수행을 위해서는 conn(Connection 객체)으로 접근해 createStatement()를 통해 Statement객체를 얻어낸다.

Statement stmt = conn.createStatement();

얘도 작업이 끝나면 연결을 해제해줘야 한다.

stmt.close();

Statement 객체의 쿼리문 수행 메소드

  • executeQuery: select문과 같이 결과값이 여러 개의 레코드로 구해지는 경우
  • executeUpdate: insert, update, delete문과 같이 내부적으로 테이블의 내용이 변경만 되고 결과값이 없는 경우

executeQuery()가 여러 개의 행으로 반환하는 결과값을 ResultSet을 사용해 받는다.

String sql = "select * from member";
Statement stmt = null;
stmt = conn.createStatement();

ResultSet rs = null;
rs = stmt.executeQuery(sql);
  1. while문 안에서 next() 사용해 전체 행에 접근하기
    ResultSet.next()는 한 행 앞으로 이동하고, 성공적일 경우에는 true, 그렇지 않을 경우(데이터가 없을 경우)에는 false를 반환한다.

  2. get + 자료형 (컬럼명) 형태의 메소드로 각 데이터 읽어오기

    rs.getString("name")
    

member 테이블의 내용 출력하기

우선 오라클에서 member 테이블을 생성한다.

  • 생성 후 레코드를 3개 정도 추가한다.
  • 반드시 commit을 해 줘야 jdbc로 조회할 수 있다.
create table member(
    name varchar2(10),
    userid varchar2(10),
    pwd varchar2(10),
    email varchar2(20),
    phone varchar2(13),
    admin number(1) default 0, --0: 사용자, 1: 관리자
    primary key(userid)
);

insert into member values('이소미', 'somi', '1234', 'gmd@naver.com', '010-2362-5157', 0);
insert into member values('허상오', 'sang12', '1234', 'ha12@naver.com', '010-5629-8888', 1);
insert into member values('김윤승', 'light', '1234', 'youn1004@naver.com', '010-9999-8282', 0);

select * from member;

commit;

이클립스에서 아래 코드로 조회한다.

<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%!
	//선언부는 첫 방문자에 의해서 단 한번 수행합니다.
	//선언부에서 SQL문 수행을 위한 객체 변수를 선언합니다.
	Connection conn = null;
	Statement stmt = null;
	ResultSet rs = null;
	//전역 데이터베이스 이름은 sql developer에서 계정 오른쪽 마우스 클릭 - SID의 이름을 적는다.
	String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	String uid = "scott";
	String pass = "tiger";
	String sql = "select * from member";%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 테이블 생성하여 제목 출력 -->
	<table width='800' border='1'>
		<tr>
			<th>이름</th>
			<th>아이디</th>
			<th>암호</th>
			<th>이메일</th>
			<th>전화번호</th>
			<th>권한(1:관리자, 2:일반회원)</th>
		</tr>
		<%
			try {
				//JDBC 드라이버 로드
				Class.forName("oracle.jdbc.driver.OracleDriver");
				//DB 연결 객체인 Connection 생성
				conn = DriverManager.getConnection(url, uid, pass);
				stmt = conn.createStatement();
				//Statement 객체로 executeQuery() 실행 후 결과값을 얻어와서 ResultSet객체에 저장. 
                //executeQuery()메소드를 실행할 쿼리문은 member 테이블의 모든 데이터를 얻어오기 위해서 
                //"select * from member"로 13행에서 String형 sql변수에 초기값으로 지정해 두었다.
				rs = stmt.executeQuery(sql);
				//DB에 저장된 모든 회원정보를 얻어오기 위해 반복문을 돌면서 컬럼 단위로 얻어옴. 
                //문자열로 선언된 컬럼을 얻어오기 위해서는 getString() 사용. 
                //admin은 NUMBER로 선언된 컬럼이므로 필드는 int로 선언되어 있다. getInt() 사용.
				while (rs.next()) {
					out.println("<tr>");
					out.println("<td>" + rs.getString("name") + "</td>");
					out.println("<td>" + rs.getString("userid") + "</td>");
					out.println("<td>" + rs.getString("pwd") + "</td>");
					out.println("<td>" + rs.getString("email") + "</td>");
					out.println("<td>" + rs.getString("phone") + "</td>");
					out.println("<td>" + rs.getInt("admin") + "</td>");
					out.println("</tr>");
				}//while의 끝
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					if (rs != null)
						rs.close();
					if (stmt != null)
						stmt.close();
					if (conn != null)
						conn.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}//finally의 끝
		%>
	</table>
</body>
</html>

이번엔 emp 테이블 내용 출력하기.

<%@page import="java.sql.DriverManager" %>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%!
	//선언부는 첫 방문자에 의해서 단 한번 수행합니다.
	//선언부에서 SQL문 수행을 위한 객체 변수를 선언합니다.
	Connection conn = null;
	Statement stmt = null;
	ResultSet rs = null;
	//전역 데이터베이스 이름은 sql developer에서 계정 오른쪽 마우스 클릭 - SID의 이름을 적는다.
	String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	String uid = "scott";
	String pass = "tiger";
	String sql = "select * from emp";%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>employee</title>
</head>
<body>
	<!-- 테이블 생성하여 제목 출력 -->
	<table width='800' border='1'>
		<tr>
			<th>사번</th>
			<th>이름</th>
			<th>직무</th>
			<th>상급자</th>
			<th>입사일</th>
			<th>봉급</th>
			<th>성과급</th>
			<th>부서번호</th>
		</tr>
		<%
			try {
				//JDBC 드라이버 로드
				Class.forName("oracle.jdbc.driver.OracleDriver");
				//DB 연결 객체인 Connection 생성
				conn = DriverManager.getConnection(url, uid, pass);
				stmt = conn.createStatement();
				//Statement 객체로 executeQuery() 실행 후 결과값을 얻어와서 ResultSet객체에 저장. executeQuery()메소드를 실행할 쿼리문은 member 테이블의 모든 데이터를 얻어오기 위해서 "select * from member"로 13행에서 String형 sql변수에 초기값으로 지정해 두었다.
				rs = stmt.executeQuery(sql);
				//DB에 저장된 모든 회원정보를 얻어오기 위해 반복문을 돌면서 컬럼 단위로 얻어옴. 문자열로 선언된 컬럼을 얻어오기 위해서는 getString() 사용. admin은 NUMBER로 선언된 컬럼이므로 필드는 int로 선언되어 있다. getInt() 사용.
				while (rs.next()) {
					out.println("<tr>");
					out.println("<td>" + rs.getString("empno") + "</td>");
					out.println("<td>" + rs.getString("ename") + "</td>");
					out.println("<td>" + rs.getString("job") + "</td>");
					out.println("<td>" + rs.getString("mgr") + "</td>");
					out.println("<td>" + rs.getString("hiredate") + "</td>");
					out.println("<td>" + rs.getInt("sal") + "</td>");
					out.println("<td>" + rs.getInt("comm") + "</td>");
					out.println("<td>" + rs.getInt("deptno") + "</td>");
					out.println("</tr>");
				}//while의 끝
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					if (rs != null)
						rs.close();
					if (stmt != null)
						stmt.close();
					if (conn != null)
						conn.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}//finally의 끝
		%>
	</table>
</body>
</html>

0개의 댓글