JDBC
JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.
JDBC란? 자바프로그램에서 일관된 방식으로 데이터베이스에 접근할 수 있도록 API를 제공하는 클래스의 집합. (클래스들과 인터페이스들의 묶음)
JDBC로 데이터베이스에 연결하는 절차
- JDBC 드라이버 로드 - DriverManager
- 데이터베이스와 연결 - Connection
- SQL문 실행 - Statement
- 데이터베이스와 연결 끊음 - 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
폴더에 복사함 (매 프로젝트 생성시마다 해 줘야 함)
Class.forName("oracle.jdbc.driver.OracleDriver");
오라클드라이버가 로드되어 DriveManager(자바에서 드라이버를 관리하는 객체)에 등록된다.
Connection conn = null;
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String uid = "scott";
String pass = "tiger";
conn = DriverManager.getConnection(url, uid, pass);
conn.close();
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);
while문 안에서 next() 사용해 전체 행에 접근하기
ResultSet.next()
는 한 행 앞으로 이동하고, 성공적일 경우에는 true, 그렇지 않을 경우(데이터가 없을 경우)에는 false를 반환한다.
get + 자료형 (컬럼명)
형태의 메소드로 각 데이터 읽어오기
rs.getString("name")
우선 오라클에서 member 테이블을 생성한다.
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>