안녕하세요 코북입니다.
오늘은 JDBC 연결하는 방법을 기록하려고 합니다.
Java에서 DB를 연결하려면 먼저 mysql, 오라클 DB 등이 설치되어있어야 합니다.
각 회사마다 Driver가 다르기 때문에 자신이 설치한 DB에 맞는 Driver를 사용해야 합니다.
연결 순서는 아래와 같습니다.
- 드라이버 로드
- Connection DB 연결
- Statement SQL 쿼리 실행
- excute() 결괏값 처리
- close() DB 연결 해제
1. 드라이버 로드
먼저 로드를 원하는 프로젝트에서 properties를 들어갑니다.
Java Build Path에서 Add External JARs 를 해줍니다.
ojdbc.jar 파일을 열면 끝입니다.
properties -> Java Build Path -> Add External JARs -> ojdbc.jar 파일 열기
를 통해 JDBC 드라이버 로딩을 완료했습니다.
완료 후 lib에 ojdbc.jar파일이 잘 생성되었는지 확인해주면 좋습니다.
2. Connection DB 연결
Class.forName("oracle.jdbc.driver.OracleDriver");
String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
String db_id = "id";
String db_pw = "pw";
Connection conn = DriverManager.getConnection(db_url, db_id, db_pw);
Class.forName(“driver”)을 사용해서 Driver Class를 로딩하여 객체를 생성합니다.
생성된 객체는 DriverManager에 등록됩니다.
DriverManager 클래스는 로드된 JDBC드라이버를 통해서 Connection을 활성화해주는(만드는) 객체입니다.
DriverManager.getConnection() 메소드로 Connection 객체 생성해줍니다.
Connection은 DB와 연결하는 객체입니다.
DriverManager.getConnection()은 DB_ID, DB_PW, DB_URL을 매개변수로 갖습니다.
3. Statement SQL쿼리 실행
통로를 생성하고 연결하는 작업을 해줬습니다.
이제 실행할 sql문을 작성해 sql쿼리를 실행할 수 있습니다.
String sql = "insert into model1 values(?,?,?)";
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setString(1,id);
psmt.setString(2,pw);
psmt.setString(3,name);
int cnt = psmt.executeUpdate();
prepareStatement() 메소드에 sql문을 전달해 PreparedStatement 객체를 생성합니다.
PreparedStatement는 SQL문장을 실행하고 결과를 반환하는 기능들을
캡슐화한 인터페이스이며, PreparedStatement는 Statement를 상속받고 있습니다.
PreparedStatement가 상속을 받고 있기 때문에, Statement보다 추가된 기능을 사용할 수 있습니다.
setString() 메소드로 sql문의 ? 에 값을 넣어줄 수 있습니다.
매개변수는 첫 번째는 ? 의 위치, 두 번째는 넣어줄 값입니다.
이때, "?"가 아닌 그냥 ? 를 사용합니다.
4. execute() 결괏값 처리
execute() 메소드를 사용해 SQL쿼리 실행 후 결괏값을 저장합니다.
위에서는 insert구문을 실행시켰기 때문에 int로 값을 받았습니다.
만약, select구문을 실행시켰다면 다음과 같이, ResultSet객체로 값을 리턴 받은 후,
next()메소드와 getInt(), getString() 등의 메소드를 통해 값을 가져올 수 있습니다.
next() 메소드는 테이블의 다음 행을 가리켜줍니다.
get() 메소드는 매개변수로 쓰인 숫자의 위치에 있는 값을 가져옵니다.
Stirng sql = "select * from model1 where user =?";
try{
psmt = conn.prepareStatement(sql);
psmt.setString(1, id)
rs = psmt.executeQuery();
if(rs.next()) {
int num = rs.getInt(1);
String id =rs.getString(2);
String pw = rs.getString(3);
}
dto = new Model1DTO(num, id, pw);
5. close() DB 연결 해제
통로를 연결하고 작업을 처리했기 때문에 이제 연결했던 통로를 다시 닫아 줘야 합니다.
꼭 열었던 순서의 역순으로 닫아 줘야 합니다.
닫아야 할 자원의 값이 null이라면 Error가 발생하기 때문에, if문으로 조건을 걸어줍니다.
try{
if (rs != null) {
rs.close();
}
if (psmt != null) {
psmt.close();
}
if (conn != null) {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
실행 메소드
메소드명(매개변수) | 리턴타입 | 기능 |
execute() | boolean | sql문 실행, 성공하면 false를 리턴, 모든 구문 수행가능 |
executeQuery() | ResultSet | Select구문 실행, ResultSet객체의 값을 리턴 |
executeUpdate() | int | Select 이외의 구문을 실행, int타입의 값을 리턴 insert, update, delete문을 실행하고 영향을 받은 행의 개수를 반환 create, drop관련 구문에서는 -1을 반환 |
close() | void | PreparedStatement의 자원을 반납 |
전체 소스코드
Connection conn = null;
PreparedStatement = null;
ResultSet rs = null;
int cnt = 0;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
String db_id = "id";
String db_pw = "pw";
conn = DriverManager.getConnection(db_url, db_id, db_pw);
String sql = "insert into model1 values(?,?,?)";
psmt = conn.prepareStatement(sql);
psmt.setString(1,id);
psmt.setString(2,pw);
psmt.setString(3,name);
cnt = psmt.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try{
if (rs != null) {
rs.close();
}
if (psmt != null) {
psmt.close();
}
if (conn != null) {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (cnt>0){
System.out.println("회원가입 성공");
} else {
System.out.println("회원가입 실패");
}
DAO 클래스에 메소드를 저장시켜서 사용
다음과 같이 클래스를 만들어 놓으면 inset() 메소드 한 줄로도 간편하게 모든 과정을 처리할 수 있다.
package Model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class DAO {
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
int cnt = 0;
public void conn() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
String db_id = "hr";
String db_pw = "hr";
conn = DriverManager.getConnection(db_url, db_id, db_pw);
} catch (Exception e) {
e.printStackTrace();
}
}
public void close() {
try {
if (rs != null) {
rs.close();
}
if (psmt != null) {
psmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public int insert(id) {
conn();
String sql = "insert into model1 values(?,?,?)";
try{
psmt = conn.prepareStatement(sql);
psmt.setString(1,id);
psmt.setString(2,pw);
psmt.setString(3,name);
cnt = psmt.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return cnt;
}
지금까지 JDBC연결 방법에 대해서 알아봤습니다.
끝까지 읽어주셔서 감사합니다 : )