JDBC의 개요
JDBC(Java DataBase Connectivity)
- 자바/JSP 프로그램 내에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 자바 표준 인터페이스
- 관계형 데이터베이스 시스템에 접근하여 SQL 문을 실행하기 위한 자바 API 또는 자바 라이브러리
- JDBC API를 사용하면 DBMS의 종류에 상관없이 데이터베이스 작업을 처리할 수 있음
JDBC 드라이버 란?
- 다양한 DBMS 제조사들은 본사에서 개발한 DBMS를 Sun사의 JAVA 프로그램과 연동할 수 있도록 기술을 지원하는 것을 의미
JDBC를 사용한 JSP와 데이터베이스의 연동
- java.sql.* 패키지 import
- JDBC 드라이버 로딩
- 데이터베이스 접속을 위한 Connection 객체 생성
- 쿼리문을 실행하기 위한 Statement/PreparedStatement/CallableStatement 객체 생성
- 쿼리 실행
- 쿼리 실행의 결과 값(int, ResultSet) 사용
- 사용된 객체(ResultSet, Statement/PreparedStatement/CallableStatement,Connection) 종료
JDBC 드라이버 로딩 및 DBMS 접속
JDBC 드라이버 로딩하기
- JDBC 드라이버 로딩 단계에서는 드라이버 인터페이스를 구현하는 작업
- Class.forName() 메소드를 이용하여 JDBC 드라이버를 로딩
Class.forName(String className);
- JDBC 드라이버가 로딩되면 자동으로 객체가 생성되고 DriverManager 클래스에 등록
[MySQL 드라이버 로딩 예]
<%
try{
Class.forName("com.mysql.jdbc.Driver");
} catch(SQLException e){
// 예외 발생 처리
out.println("DB 오류 발생");
} finally {
// 무조건 실행되는 부분, DB 연동 해제 작업 필요
}
%>
- JDBC 드라이버 로딩은 프로그램 수행 시 한 번만 필요
Connection 객체 생성하기
- JDBC 드라이버에서 데이터베이스와 연결된 커넥션을 가져오기 위해 DriverManager 클래스의 getConnection( ) 메소드를 사용
- DriverManager 클래스로 Connection 객체를 생성할 때 JDBC 드라이버를 검색하고, 검색된 드라이버를 이용하여 Connection 객체를 생성한 후 이를 반환
🛠 getConnection(”url”, “사용자 아이디”, “사용자 패스워드”);
<%
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/데이터베이스명?user=유저명&password=비밀번호");
} catch(SQLException ex) {
// 예외 발생 처리
}
%>
데이터베이스 연결 닫기
- 데이터베이스 연결이 더 이상 필요하지 않으면 데이터베이스와 JDBC 리소스가 자동으로 닫힐 때까지 대기하는 것이 아니라 close( ) 메소드로 생성한 Connection 객체를 해제
- 일반적으로 데이터베이스 리소스를 사용하지 않기 위해 사용을 끝내자마자 리소스를 해제하는 것이 좋음
<%
Connection conn = null;
try{
// JDBC 드라이버 로딩
// Connection 객체 생성
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/데이터베이스명?user=유저명&password=비밀번호");
} catch(SQLException e){
// 예외 발생 처리
out.println("DB 오류 발생");
} finally {
// conn이 null이 아니면 연결을 닫아준다
if (conn != null) conn.close();
}
%>
드라이버 복사
🛠 C:\Program Files (x86)\MySQL\Connector J 8.0 안에 jar 파일을 →
이클립스 작업폴더 - 해당 패키지 - src - main - webapp - WEB-INF - lib 로 복사
<%
Connection conn = null;
try {
String url = "jdbc:mysql://localhost:3306/데이터베이스명";
String user = "root";
String password = "1234";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
out.println("데이터베이스 연결이 성공했습니다.");
} catch(ClassNotFoundException e) { // forName에서 드라이버를 찾지 못했을 때
out.println("연결실패 : 드라이버 복사 필요");
} catch (SQLException ex) { // 데이터베이스 연결이 실패 하였을 때
out.println("데이터베이스 연결이 실패했습니다.<br>");
out.println("SQLException :" + ex.getMessage());
} finally {
if (conn != null)
conn.close();
}
%>
데이터베이스 쿼리 실행
Statement 객체로 데이터 접근하기
- Statement 객체 ( 문장 객체 )
- DB 연결로부터 SQL 문을 실행하기 위해서 사용
- Connection 객체로부터 createStatement() 호출로 생성
- 정적인 쿼리에 사용
- 하나의 쿼리를 사용하고 나면 더는 사용할 수 없음
- 하나의 쿼리를 끝내면 close( ) 를 사용하여 객체를 즉시 해제해야 함
- close( ) 를 사용하여 객체를 즉시 해제하지 않으면 무시할 수 없는 공간이 필요하며 페이지가 다른 작업을 수행하는 동안 멈추지 않기 때문
- 복잡하지 않은 간단한 쿼리문을 사용하는 경우가 좋음
Statement createStatement() throws SQLException
SELECT에만 excuteQuery 를 사용한다
INSERT, UPDATE, DELECT 등은 executeUpdate 문을 사용하여 성공/실패 유무만 int형으로 반환받음 ( 1: 성공, 0: 실패)
- executeQuery( ) 메소드로 데이터 조회하기. select 문에 사용
ResultSet executeQuery(String sql) throws SQLException
- executeUpdate( ) 메소드로 데이터 삽입, 수정, 삭제하기
int executeUpdate(String sql) throws SQLException
PreparedStatement 객체로 데이터 접근하기
- PreparedStatement 객체
- SQL에 필요한 변수 데이터 대신 “?” 로 기술하고 그 값을 메서드를 통해 설정하는 방식
- setXxx( ) 메서드는 기본 자료형별로 제공됨
- 하나의 객체로 여러 번의 쿼리를 실행할 수 있음
- 동일한 쿼리문을 특정 값만 바꾸어서 여러 번 실행
- 매개변수가 많아서 쿼리문을 정리해야 할 때 유용
- 많이 사용되는 SQL 문장이 있는 경우 이것을 미리 SQL 문장으로 만들어 두고 필요할때마다 사용
- 동적인 쿼리에 사용
- Statement 객체보다 구조적이고 편리해 권장됨
- executeQuery( ) 메소드로 데이터 조회하기. select 문에 사용
- executeQuery( ) 메소드는 동적인 SELECT 쿼리문을 통해 데이터를 검색하는 데 사용
- executeUpdate( ) 메소드로 데이터 삽입, 수정, 삭제하기
- executeUpdate( ) 메소드는 INSERT, UPDATE, DELETE 쿼리문을 통해 데이터를 삽입, 수정, 삭제하는 데 사용
Statement , preparedStatement의 차이
Statement 사용
<%@ include file="dbconn.jsp" %>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
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 ex) {
out.println("Member 테이블 삽입이 실패했습니다.<br>");
out.println("SQLException : " + ex.getMessage());
} finally {
// 닫는 순서는 처음 연 것을 가장 마지막에 닫는다.
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
}
%>
PreparedStatement 사용
<%@ include file="dbconn.jsp" %>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
String name = request.getParameter("name");
PreparedStatement pstmt = null;
try {
String sql = "INSERT INTO Member(id, passwd, name) VALUES(?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2,passwd);
pstmt.setString(3,name);
pstmt.executeUpdate();
out.println("Member 테이블 삽입이 성공 했습니다.");
} catch (SQLException ex) {
out.println("Member 테이블 삽입이 실패했습니다.<br>");
out.println("SQLException : " + ex.getMessage());
} finally {
// 닫는 순서는 처음 연 것을 가장 마지막에 닫는다.
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
}
%>
PreparedStatement를 사용하면
SQL 구문안에 들어갈 값을 “?” 로 만들어 주고 밑에서 해당하는 자료형 INT, String 등을 지정하여 훨씬 보기 쉽게 그리고 코드의 재사용을 쉽게 작성할 수 있다.
String id = request.getParameter(”id”); // form에서 id 값을 id 변수에 대입
String sql = “SELECT id FROM member WHERE id = ?” // 해당 SQL을 만든다.
PreparedStatement pstmt = conn.prepareStatement(sql); // prepareStatement를 선언
pstmt.setString(1, id); // SQL에서 첫번째 물음표부분에 id 변수값으로 설정
pstmt.executeUpdate(); // pstmt의 Query를 실행한다.
쿼리문 실행 결과 값 가져오기
ResultSet 객체
- Statement 또는 PreparedStatement 객체로 SELECT 문을 사용하여 얻어온 레코드 값을 테이블 형태로 가진 객체.
getString , getInteger, getChar 등등 사용 가능
[Statement 객체를 사용하는 경우]
ResultSet executeQuery(String sql) throws SQLException
[PreparedStatement 객체를 사용하는 경우]
ResultSet executeQuery() throws SQLException
- ResultSet 객체에는 select 문장에 의해 추출된 모든 레코드가 들어 있음.
- 한 번에 하나의 레코드만 접근 가능 → cursor라는 포인터 제공됨
- cursor를 움직이기 위한 다양한 메소드가 제공됨
- 커서의 초기값은 첫 번째 레코드 이전을 가리킨다.
- 다음 레코드가 있으면 true, 없으면 false
SQL의 번호는 1부터 시작함!
배열과 다르게 ResultSet의 인덱스는 1부터 시작한다.
while(rs.next()) {
out.println(rs.getString(2) + ", " + rs.getString(3) + "<br>");
} // 2번째 컬럼, 3번째 컬럼
- rs.getString(”컬럼명”) 으로 사용해도 됨
JDBC의 개요
JDBC(Java DataBase Connectivity)
- 자바/JSP 프로그램 내에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 자바 표준 인터페이스
- 관계형 데이터베이스 시스템에 접근하여 SQL 문을 실행하기 위한 자바 API 또는 자바 라이브러리
- JDBC API를 사용하면 DBMS의 종류에 상관없이 데이터베이스 작업을 처리할 수 있음
JDBC 드라이버 란?
- 다양한 DBMS 제조사들은 본사에서 개발한 DBMS를 Sun사의 JAVA 프로그램과 연동할 수 있도록 기술을 지원하는 것을 의미
JDBC를 사용한 JSP와 데이터베이스의 연동
- java.sql.* 패키지 import
- JDBC 드라이버 로딩
- 데이터베이스 접속을 위한 Connection 객체 생성
- 쿼리문을 실행하기 위한 Statement/PreparedStatement/CallableStatement 객체 생성
- 쿼리 실행
- 쿼리 실행의 결과 값(int, ResultSet) 사용
- 사용된 객체(ResultSet, Statement/PreparedStatement/CallableStatement,Connection) 종료
JDBC 드라이버 로딩 및 DBMS 접속
JDBC 드라이버 로딩하기
- JDBC 드라이버 로딩 단계에서는 드라이버 인터페이스를 구현하는 작업
- Class.forName() 메소드를 이용하여 JDBC 드라이버를 로딩
Class.forName(String className);
- JDBC 드라이버가 로딩되면 자동으로 객체가 생성되고 DriverManager 클래스에 등록
[MySQL 드라이버 로딩 예]
<%
try{
Class.forName("com.mysql.jdbc.Driver");
} catch(SQLException e){
// 예외 발생 처리
out.println("DB 오류 발생");
} finally {
// 무조건 실행되는 부분, DB 연동 해제 작업 필요
}
%>
- JDBC 드라이버 로딩은 프로그램 수행 시 한 번만 필요
Connection 객체 생성하기
- JDBC 드라이버에서 데이터베이스와 연결된 커넥션을 가져오기 위해 DriverManager 클래스의 getConnection( ) 메소드를 사용
- DriverManager 클래스로 Connection 객체를 생성할 때 JDBC 드라이버를 검색하고, 검색된 드라이버를 이용하여 Connection 객체를 생성한 후 이를 반환
🛠 getConnection(”url”, “사용자 아이디”, “사용자 패스워드”);
<%
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/데이터베이스명?user=유저명&password=비밀번호");
} catch(SQLException ex) {
// 예외 발생 처리
}
%>
데이터베이스 연결 닫기
- 데이터베이스 연결이 더 이상 필요하지 않으면 데이터베이스와 JDBC 리소스가 자동으로 닫힐 때까지 대기하는 것이 아니라 close( ) 메소드로 생성한 Connection 객체를 해제
- 일반적으로 데이터베이스 리소스를 사용하지 않기 위해 사용을 끝내자마자 리소스를 해제하는 것이 좋음
<%
Connection conn = null;
try{
// JDBC 드라이버 로딩
// Connection 객체 생성
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/데이터베이스명?user=유저명&password=비밀번호");
} catch(SQLException e){
// 예외 발생 처리
out.println("DB 오류 발생");
} finally {
// conn이 null이 아니면 연결을 닫아준다
if (conn != null) conn.close();
}
%>
드라이버 복사
🛠 C:\Program Files (x86)\MySQL\Connector J 8.0 안에 jar 파일을 →
이클립스 작업폴더 - 해당 패키지 - src - main - webapp - WEB-INF - lib 로 복사
<%
Connection conn = null;
try {
String url = "jdbc:mysql://localhost:3306/데이터베이스명";
String user = "root";
String password = "1234";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
out.println("데이터베이스 연결이 성공했습니다.");
} catch(ClassNotFoundException e) { // forName에서 드라이버를 찾지 못했을 때
out.println("연결실패 : 드라이버 복사 필요");
} catch (SQLException ex) { // 데이터베이스 연결이 실패 하였을 때
out.println("데이터베이스 연결이 실패했습니다.<br>");
out.println("SQLException :" + ex.getMessage());
} finally {
if (conn != null)
conn.close();
}
%>
데이터베이스 쿼리 실행
Statement 객체로 데이터 접근하기
- Statement 객체 ( 문장 객체 )
- DB 연결로부터 SQL 문을 실행하기 위해서 사용
- Connection 객체로부터 createStatement() 호출로 생성
- 정적인 쿼리에 사용
- 하나의 쿼리를 사용하고 나면 더는 사용할 수 없음
- 하나의 쿼리를 끝내면 close( ) 를 사용하여 객체를 즉시 해제해야 함
- close( ) 를 사용하여 객체를 즉시 해제하지 않으면 무시할 수 없는 공간이 필요하며 페이지가 다른 작업을 수행하는 동안 멈추지 않기 때문
- 복잡하지 않은 간단한 쿼리문을 사용하는 경우가 좋음
Statement createStatement() throws SQLException
SELECT에만 excuteQuery 를 사용한다
INSERT, UPDATE, DELECT 등은 executeUpdate 문을 사용하여 성공/실패 유무만 int형으로 반환받음 ( 1: 성공, 0: 실패)
- executeQuery( ) 메소드로 데이터 조회하기. select 문에 사용
ResultSet executeQuery(String sql) throws SQLException
- executeUpdate( ) 메소드로 데이터 삽입, 수정, 삭제하기
int executeUpdate(String sql) throws SQLException
PreparedStatement 객체로 데이터 접근하기
- PreparedStatement 객체
- SQL에 필요한 변수 데이터 대신 “?” 로 기술하고 그 값을 메서드를 통해 설정하는 방식
- setXxx( ) 메서드는 기본 자료형별로 제공됨
- 하나의 객체로 여러 번의 쿼리를 실행할 수 있음
- 동일한 쿼리문을 특정 값만 바꾸어서 여러 번 실행
- 매개변수가 많아서 쿼리문을 정리해야 할 때 유용
- 많이 사용되는 SQL 문장이 있는 경우 이것을 미리 SQL 문장으로 만들어 두고 필요할때마다 사용
- 동적인 쿼리에 사용
- Statement 객체보다 구조적이고 편리해 권장됨
- executeQuery( ) 메소드로 데이터 조회하기. select 문에 사용
- executeQuery( ) 메소드는 동적인 SELECT 쿼리문을 통해 데이터를 검색하는 데 사용
- executeUpdate( ) 메소드로 데이터 삽입, 수정, 삭제하기
- executeUpdate( ) 메소드는 INSERT, UPDATE, DELETE 쿼리문을 통해 데이터를 삽입, 수정, 삭제하는 데 사용
Statement , preparedStatement의 차이
Statement 사용
<%@ include file="dbconn.jsp" %>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
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 ex) {
out.println("Member 테이블 삽입이 실패했습니다.<br>");
out.println("SQLException : " + ex.getMessage());
} finally {
// 닫는 순서는 처음 연 것을 가장 마지막에 닫는다.
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
}
%>
PreparedStatement 사용
<%@ include file="dbconn.jsp" %>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
String name = request.getParameter("name");
PreparedStatement pstmt = null;
try {
String sql = "INSERT INTO Member(id, passwd, name) VALUES(?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2,passwd);
pstmt.setString(3,name);
pstmt.executeUpdate();
out.println("Member 테이블 삽입이 성공 했습니다.");
} catch (SQLException ex) {
out.println("Member 테이블 삽입이 실패했습니다.<br>");
out.println("SQLException : " + ex.getMessage());
} finally {
// 닫는 순서는 처음 연 것을 가장 마지막에 닫는다.
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
}
%>
PreparedStatement를 사용하면
SQL 구문안에 들어갈 값을 “?” 로 만들어 주고 밑에서 해당하는 자료형 INT, String 등을 지정하여 훨씬 보기 쉽게 그리고 코드의 재사용을 쉽게 작성할 수 있다.
String id = request.getParameter(”id”); // form에서 id 값을 id 변수에 대입
String sql = “SELECT id FROM member WHERE id = ?” // 해당 SQL을 만든다.
PreparedStatement pstmt = conn.prepareStatement(sql); // prepareStatement를 선언
pstmt.setString(1, id); // SQL에서 첫번째 물음표부분에 id 변수값으로 설정
pstmt.executeUpdate(); // pstmt의 Query를 실행한다.
쿼리문 실행 결과 값 가져오기
ResultSet 객체
- Statement 또는 PreparedStatement 객체로 SELECT 문을 사용하여 얻어온 레코드 값을 테이블 형태로 가진 객체.
getString , getInteger, getChar 등등 사용 가능
[Statement 객체를 사용하는 경우]
ResultSet executeQuery(String sql) throws SQLException
[PreparedStatement 객체를 사용하는 경우]
ResultSet executeQuery() throws SQLException
- ResultSet 객체에는 select 문장에 의해 추출된 모든 레코드가 들어 있음.
- 한 번에 하나의 레코드만 접근 가능 → cursor라는 포인터 제공됨
- cursor를 움직이기 위한 다양한 메소드가 제공됨
- 커서의 초기값은 첫 번째 레코드 이전을 가리킨다.
- 다음 레코드가 있으면 true, 없으면 false
SQL의 번호는 1부터 시작함!
배열과 다르게 ResultSet의 인덱스는 1부터 시작한다.
while(rs.next()) {
out.println(rs.getString(2) + ", " + rs.getString(3) + "<br>");
} // 2번째 컬럼, 3번째 컬럼
- rs.getString(”컬럼명”) 으로 사용해도 됨