[Java] JDBC를 이용하여 자바와 오라클DB 연동하기(JDBC에 대해)
자바와 DB를 연결할때 필요한것 요약
- 연결할때 자바쪽에서 필요한 클래스 및 인터페이스가 준비되어 있고, 오라클에서는 jdbc드라이버가 필요하다
(1) 필요한 객체 4가지: Driver Manager, Connection, Statement(또는 PreparedStatement), ResultSet
(2) DBMS마다 준비된 jdbc 드라이버
1. JDBC란?
- Java Database Connectivity
- JDBC는 데이터베이스에 연결하고 쿼리를 실행하는 Java API이다.
- DBMS(Database Management System)와 통신하기 위해 필요한 일종의 라이브러리이다.( .jar 확장자)
- JSP를 포함한 자바 어플리케이션에서 DB를 사용할 때는 JDBC를 이용해서 DB에 접근한다.
- 각각의 DBMS에서는 JDBC 드라이버를 제공하고 있다.
- 즉, 오라클을 사용한다면 오라클용 JDBC드라이버를, MySQL을 사용한다면 MySQL용 드라이버를 사용해야한다.
2. JDBC의 구성요소
(1) JDBC API
- 데이터베이스와 통신하는 방법과 인터페이스를 제공하며, 이는 JDK에서 제공하고 있다. (자바 API문서에서 확인가능)
- `java.sql` 과 `javax.sql` 이 두가지 패키지에서 jdbc api의 인터페이스와 클래스를 제공한다.
- java.sql 패키지 : 관계형DB에서 데이터 액세스와 데이터 프로세스를 위한 API를 제공해준다
- javax.sql 패키지 : connection pooling, statement pooling을 설정하는 소스를 제공하여
자바 패키지의 기능을 확장해준다
* 여기서 pool 의 의미
데이터베이스 연결을 열고 유지 및 관리하는 것은 비용이 많이 들며 리소스를 낭비한다.
connection pooling에서 연결이 생성되면 pool에 배치되고 다시 사용함으로 새 연결을 설정할 필요가 없다.
즉, 데이터베이스로 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다.
(2) JDBC Driver manager
- DB와의 연결을 설정하기 위해 어플리케이션에 드라이버를 로드할 때 사용한다.
- 데이터베이스 별로 따로 제공하는 드라이버를 사용해준다. 위에서 말한 DBMS별로 제공하는 드라이버가 이것이다.
- 사용자 요청을 처리하기 위해 데이터베이스에 대한 호출을 할때 사용된다.
(3) JDBC Test suite
- JDBC 드라이버가 수행하는 작업(삽입, 삭제, 업데이트 등)을 테스트하는 데 사용된다.
(4) JDBC-ODBC Bridge Drivers
- DB 드라이버를 DB에 연결하며 sun.jdbc.odbc 패키지를 사용한다.
3. JDBC API의 객체들과 데이터베이스의 연동과정
- 위에서 언급한 4가지 객체들을 통한 데이터베이스 연동 과정은 다음과 같다
- 연결과정 하나하나, 코드를 통해 확인해보자
0. JDBC 드라이버 설치
- 코드를 작성하기에 앞서, jdbc드라이버를 프로젝트에 설치해줘야 한다.
- 아래 경로로 가면 오라클에서 준비한 jdbc 드라이버가 있다.
- jdbc 뒤에 붙은 숫자가 가장큰걸로 선택해서 복사한다.
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
- 프로젝트의 src > main > webapp > WEB-INF > lib 폴더에 붙여넣기!
1. JDBC 드라이버 로딩
- 가장 먼저 해야하는 것은 DB작업을 위해 준비된 JDBC 드라이버 파일을 메모리에 로딩해야한다.
- `Class.forName()` 메서드를 호출하여 오라클에서 제공하는 드라이버를 로딩시킨다.
Class.forName(oracle.jdbc.driver.OracleDriver);
2. DBMS 서버 연결
- DBMS의 서버와의 연결작업을 한다.
- 해당 작업은 java.sql 패키지가 제공하는 DriverManager의 getConnection()를 사용한다.
- 연결에 성공하면 DB와 연결된 상태를 Connection 객체로 리턴해서 conn 변수에 저장한다.
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","hr","hr");
- `DriverManager.getConnection( ? , ? , ? )` 메서드의 3가지 인자에 대해
- 첫번째 인자: 오라클이 설치된 PC의 ip주소와 포트번호, DB의 이름이 들어간다
- DB이름은 따로 확인해야 알 수 있는데, 설치한 DB의 이름 찾는법
- cmd창에 `sqlplus / as sysdba` 작성해서 오라클 관리자 계정으로 접속한다
- `select name from v$database;` 작성해서 DB이름을 확인한다
- 두번째 인자: DB계정의 이름
- 세번째 인자: 계정의 암호
- 연결과정에서는 예외가 자주발생하기 때문에 문법적으로 try catch문이 필수다!
class DBTest {
Connection conn; // DB와 접속할때 사용하는 객체선언
void connect() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); //오라클 드라이버 호출
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE","hr","hr"); //연결에 필요한 정보, 객체생성
System.out.println("DB접속 성공!");
} catch(Exception e) {
System.out.println("DB접속 중 문제발생!");
} finally {
try {
conn.close(); //DB와의 접속해제
} catch(Exception e) {}
}
}
public class Study {
public static void main(String[] args) {
DBTest db = new DBTest();
db.connect(); // DB접속 실행
}
}
- 여기까지만 작성하고 확인해보면 연결이 잘 된것을 볼 수 있다!
3. 자바프로그램의 쿼리문을 DB로 전송해서 쿼리문 실행하기
- 자바 프로그램과 DB 간의 연결이 되었다면, 이 연결을 통해 자바프로그램은 DB로 sql 쿼리문을 전달하고,
- DB는 처리된 결과를 다시 자바 프로그램으로 전달해야 한다.
- 해당 기능을 담당하는 객체가 Statement 와 PreparedStatement 이다.
- 특히 PreparedStatement 객체는 sql을 작성할때 가독성과 유지보수성이 좋기 때문에 장점이 많고, 특징이 있는데
- 지금은 사용법만 간단히 알아볼 것이다.
(1) Statement 객체
- Statement 객체 생성하기
- Statement 객체를 생성하려면 Connection 객체가 제공하는 `createStatement()` 메서드를 사용한다
Statement stmt = conn.createStatement();
- Statement 객체에서 제공하는 메서드는 아래와 같다
- `executeQuery(String sql)` select 쿼리문을 실행하고 결과값을 ResultSet 객체로 리턴한다
- `executeUpdate(String sql)` update,delete,insert 쿼리문을 실행하고 결과값을 ResultSet 객체로 리턴한다
(2) PreparedStatement 객체
- PreparedStatement 객체 생성하기
- PreparedStatement 객체를 생성할때는 Statement 와 다르게
- `createStatement()` 메서드에 인자로 query를 넣고 `executeQuery()`에 인자를 넣지 않는다
PreparedStatement pstmt = conn.createStatement(query);
- PreparedStatement 객체에서 제공하는 메서드는 아래와 같다
- `executeQuery()` select 쿼리문을 실행하고 결과값을 ResultSet 객체로 리턴한다
- `executeUpdate()` update,delete,insert 쿼리문을 실행하고 결과값을 ResultSet 객체로 리턴한다
(3) ResultSet 객체
- ResultSet 객체 생성하기
- ResultSet 객체는 데이터베이스에서 실행된 쿼리문의 결과값(조회 결과)를 담는 객체이다.
- 즉, select문을 사용한 경우에만 쓰인다.
// Statement를 사용한 경우
ResultSet rs = stmt.executeQuery("select * from test");
// PreparedStatement를 사용한 경우
ResultSet rs = pstmt.executeQuery();
4. DB에서 실행한 쿼리문 결과값, 데이터 조회하기
- `next()`메서드
- select문을 실행하고 조회 결과가 있다면 true, 결과과 없으면 false를 반환하는 ResultSet객체의 메서드
- `getString()` 와 `getInt()`메서드
- 조회 결과의 열, 컬럼(column)값을 가져오는 메서드
while(rs.next()) { //모든 검색결과가 처리될때까지 반복
System.out.print(rs.getString(1)+", "); //사원번호
System.out.print(rs.getString(2) + rs.getString(3)+", "); //성+이름
System.out.println(rs.getString(4)); //이메일
System.out.println(rs.getString(5)); //전화번호
System.out.println(rs.getString(6)); //업무코드
}
전체 코드 및 실습
// 오라클DB의 사원정보테이블(employees)에 있는 모든데이터를 검색해서 자바로 옮긴 후 콘솔에 출력하기
class AllEmployees {
Connection conn; // DB와 접속할때 사용하는 객체선언
Statement stmt; // DB의 명령어(SQL)을 전달할때 사용하는 클래스
ResultSet rs; // DB에서 검색한 데이터들을 일시 저장할 때 사용하는 클래스
String query = "select * from employees"; // 자바에서 SQL문을 작성할때는 끝에 ;세미콜론 안붙임
// 자바에서 작성한 SQL문을 데이터베이스에게 전달해주는 역할: Statement
// SQL문을 받은 오라클은 SQL문을 실행함.
// SQL문을 실행한 결과를 자바에서 받을때 사용하는 클래스 : ResultSet
void doIt() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); //오라클의 자바관련 드라이버 호출
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","hr","hr");
stmt = conn.createStatement(); // Statement 객체 생성
rs = stmt.executeQuery(query); // 쿼리문을 실행하고 결과는 ResultSet에 저장
while(rs.next()) { //모든 검색결과가 처리될때까지 반복
System.out.print(rs.getString(1)+", "); //사번
System.out.print(rs.getString(2) + rs.getString(3)+", "); //성+이름
System.out.println(rs.getString(4)); //이메일
System.out.println(rs.getString(5)); //전화번호
System.out.println(rs.getString(6)); //업무코드
}
} catch(Exception e) {
System.out.println("DB처리중 문제발생");
} finally {
try {
conn.close(); //DB접속해제
} catch(Exception e) {}
}
}
}
public class Study {
public static void main(String[] args) {
AllEmployees db = new AllEmployees();
db.doIt();
}
}
참고자료 및 출처
https://www.geeksforgeeks.org/introduction-to-jdbc/
Introduction to JDBC (Java Database Connectivity) - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
https://ducmanhphan.github.io/2020-01-09-How-to-use-JDBC-to-connect-database-in-Java-project/
How to use JDBC to connect database in Java project
When working with Java applications, reading and writing data to a relational database is a must-have skill that we need to know. So, in this article, we will learn how to connect our java application to database based on JDBC. Let’s get started. Table o
ducmanhphan.github.io
https://opentutorials.org/module/3569/21222
JDBC 프로그래밍 - JSP/서블릿 흝어 보기
JDBC란? JDBC란, 자바 언어로 다양한 종류의 관계형 데이터베이스에 접속하고 SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API입니다. JDBC는 자바의 표준 에디션에서 지원하는
opentutorials.org
https://devlog-wjdrbs96.tistory.com/139
[Java] JDBC를 사용한 데이터베이스 연동(Mysql)
1. JDBC API Java DataBase Connectivity의 약자로 JDBC는 자바 언어로 데이터베이스 프로그래밍을 하기 위한 라이브러리이다. JDBC는 DBMS에 종속되지 않는 관련 API를 제공한다. JDBC API는 JDK에서 제공하며 JDBC
devlog-wjdrbs96.tistory.com