[Java] 자바와 DB (오라클) 연결
- 언어/자바
- 2021. 7. 27.
JDBC
프로젝트에 ojdbc 라이브러리를 추가했으면 이제 자바코드로 오라클을 다룰 수 있다.
ojdbc 라이브러리 추가방법
ojdbc 드라이버 로드
Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName을 사용하여 해당 DB사의 jdbc 드라이버를 로드 한다.
ClassNotFoundException이 발생할 수 있다.
DB와 연결 생성
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521/orcl", "hr", "hr");
DriverManager 클래스를 통해 DB와의 연결을 생성한다.
DB접속에 필요한 URL, ID, PW를 입력한다. (본인 PC에 따라 값이 다를 수 있다.)
SQLException이 발생할 수 있다.
드라이버로드, getConnection까지 문제 없이 작성하면 DB 연결은 끝.
테스트
위에서 입력한 계정에 존재하는 테이블을 가지고 결과를 받아볼 수 있다.
// 3. 생성된 연결을 통해 전송할 쿼리문 생성
PreparedStatement pstmt = conn.prepareStatement("select * from employees");
// 4. 생성된 쿼리문을 DB로 보냄
ResultSet rs = pstmt.executeQuery();
// 5. 받아온 결과를 사용
while (rs.next()) {
System.out.println(rs.getString("first_name") + "/" +rs.getString("salary"));
}
전체 코드
아래의 코드 실행시 에러가 안뜨고 결과를 받아오면 DB 연결에 성공한 것
hr의 기본 테이블(employees)을 테스트할 때 사용함
public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521/orcl", "hr", "hr");
PreparedStatement pstmt = conn.prepareStatement("select * from employees");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("first_name") + "/" +rs.getString("salary"));
}
// 6. 사용후 연결 끊기 (선연후끊)
rs.close();
pstmt.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
사용한 자원들(Connection, Statement .. 등등)은 사용 후 close() 를 사용해서 연결을 해제하는 것이 좋다.
연결 순서의 역순으로 연결을 해제하면 된다.
Connection, PreparedStatement, ResultSet 같은 자원들은 autocloseable을 사용해서 close() 없이 자동으로 close를 할 수 있다. (글 맨 아래에서 사용 방법 확인)
Connection용 클래스 생성
DB 작업시 매번 새로 연결할 필요 없이 Connection정보를 담고 있는 클래스를 생성해 둔 후 호출해서 사용할 수 있다.
Connection 정보를 직접 입력한 클래스
// DB 연결용 클래스 ( Connection을 생성하고 return 해준다)
public class DBConnecter {
public static Connection getConnection() {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521/orcl";
String id = "hr";
String password = "hr";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, id, password);
return conn;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
}
Connection 정보를 파일에서 받아온 클래스
원하는 경로의 txt파일에 DB 정보를 입력해 놓는다.
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521/orcl
hr
hr
public class DBConnecter {
public static Connection getConnection() {
String driver;
String url;
String id;
String password;
try {
BufferedReader in = new BufferedReader(new FileReader("DB.txt"));
driver = in.readLine();
url = in.readLine();
id = in.readLine();
password = in.readLine();
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, id, password);
return conn;
} catch (FileNotFoundException e1) {
e1.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
}
파일의 내용을 한줄씩 읽고, 그 파일을 자원으로 사용 한다.
코드의 내용은 길어지지만 관리하기가 편하다.
둘 중 아무거나 편한방식으로 사용하면 될 것 같다.
생성해놓은 Connection 클래스 사용방법
위에서 두 가지 방법중 하나로 생성한 클래스를 다른 클래스에서 호출해서 사용하는 방법
Connection 연결을 아래의 한줄로 끝낼 수 있다.
Connection conn = DBConnecter.getConnection();
테스트용 전체 코드
public static void main(String[] args) throws SQLException {
Connection conn = DBConnecter.getConnection();
String sql = "SELECT * FROM employees";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
rs.close();
pstmt.close();
conn.close();
while (rs.next()) {
System.out.printf("%d\t%s\t%s\n", rs.getInt(1), rs.getString(2), rs.getString(3));
}
}
autocloseable 사용
try ()내부에 자원을 선언하면 conn,pstmt,rs 등이 자동으로 close된다.
public static void main(String[] args) {
String sql = "SELECT * FROM employees";
try(
Connection conn = DBConnecter.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
){
while (rs.next()) {
System.out.printf("%d\t%s\t%s\n", rs.getInt(1), rs.getString(2), rs.getString(3));
}
}catch(SQLException e) {
e.printStackTrace();
}
}
'언어 > 자바' 카테고리의 다른 글
[Java] JDBC PreparedStatement 사용하기 (2) | 2021.07.28 |
---|---|
[Java] JDBC 자바와 DB(오라클) 연결 (0) | 2021.07.26 |
[Java] Random 메소드 / 랜덤숫자 생성 (0) | 2021.07.18 |
[Java] StringBuiler 문자열을 다루는 클래스 (0) | 2021.07.06 |
[Java] 삼항연산자 사용 방법 (0) | 2021.07.06 |