파게로그
[JDBC] JDBC 연결 본문
새로운 Java 프로젝트를 생성하여 JDBC를 통해 간단하게 DB에 접속해보았다. 기본적인 기능들을 확인하기 위해 아래 사이트를 참고했는데 코드 퀄리티 자체도 좋지 않을 뿐더러 설명이 다소 미흡한 부분이 있어서 조금 고생을 했다.
일단, 아래 링크를 통해서 Oracle JDBC Driver를 다운받는다.
www.oracle.com/database/technologies/appdev/jdbc-ucp-183-downloads.html
Classpath 아래에 Add External JARs를 통해서 JAR를 추가해준다.
서버의 IP, 오라클 SID, 접속 프로토콜 등은 ServiceName으로서 대표되고, 클라이언트 프로그램은 ServiceName을 통해서 서버에 접속할 수 있다. 이는 클라이언트쪽의 TNSNAMES.ORA에 정의되어 있다(m.blog.naver.com/PostView.nhn?blogId=kingrudals&logNo=30187112015&proxyReferer=https:%2F%2Fwww.google.com%2F 참고).
SID를 확인하고자 한다면, SQL Plus를 DBA 계정으로 접속해서 위와 같이 확인할 수 있다.
또는 Windows의 서비스에서도 위와 같이 확인할 수 있다.
package jdbcprj;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Main {
// JDBC driver info
static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
static final String DB_URL1 = "jdbc:oracle:thin:@localhost:1521/xepdb1"; // ServiceName으로 접속할 때에는 / 사용
static final String DB_URL2 = "jdbc:oracle:thin:@localhost:1521:xe"; // SID로 접속할 때에는 : 사용
// DB credentials
static final String USER = "c##berry";
static final String PASS = "straw";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
/* register JDBC driver */
Class.forName(JDBC_DRIVER);
// Java Reflection API
// JDBC 4.0 이후로는 불필요하다(여기서도 지워도 작동에 문제가 없다).
// 메모리에 동적으로 로드하는 것까지는 알겠는데 return값을 이용하지 않을 거라면 이게 왜 필요한지 아직 잘 모르겠다.
/* open a connection */
System.out.println("Connecting to DB");
conn = DriverManager.getConnection(DB_URL1, USER, PASS);
System.out.println("DB connected successfully");
System.out.println("Creating statement");
stmt = conn.createStatement();
System.out.println("State created successfully");
// /* execute a query */
// System.out.println("Inserting record");
//
// String sql1 = "CREATE TABLE emp (" +
// " empno NUMBER(10)," +
// " ename VARCHAR2(30)," +
// " deptno NUMBER(5)," +
// " age NUMBER(3)" +
// ")";
// stmt.executeUpdate(sql1);
//
// System.out.println("Table created successfully");
//
// String sql2 = "INSERT INTO emp VALUES (1001, '신짱구', 250, 21)";
// stmt.executeUpdate(sql2);
//
// String sql3 = "INSERT INTO emp VALUES (1002, '김철수', 410, 24)";
// stmt.executeUpdate(sql3);
//
// System.out.println("Record inserted successfully");
/* execute a query */
// execute SELECT statement
String sql4 = "SELECT empno, ename FROM berry.emp";
ResultSet rs = stmt.executeQuery(sql4);
// retrieve data
while (rs.next()) {
// retrieve by column name
int id = rs.getInt("empno");
String ename = rs.getString("ename");
// display values
System.out.printf("empno: %d, ename: %s\n", id, ename);
}
} catch (SQLException se) {
/* handle errors for JDBC */
se.printStackTrace();
} catch (Exception e) {
/* handle errors for Class.forName */
e.printStackTrace();
} finally {
/* close resource */
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException se2) {
// I cannot do anything
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException se) {
se.printStackTrace();
}
}
System.out.println("End of program");
}
}
기본적인 메서드 사용에서 주목할 만한 점이라면 Statement 객체에 대해서 반환 결과가 있는 경우와 그렇지 않은 경우 등, 여러 경우에 대해서 사용하는 메서드가 다르다. 위에서는 INSERT문에 대해서 executeUpdate( )를, SELECT문에 대해서 executeQuery( )를 사용했다.
한편 DB 사용자가 다를 경우 반드시 [사용자명].[테이블명]을 통해서 테이블에 접근하여야만 ORA-00942 에러를 피할 수 있다.
그리고 이중 try문이 상당히 거슬렸는데, Java 7부터 지원되는 try-with-resource문을 통해 다음과 같이 개선할 수 있다고 한다. 파이썬의 with문과 비슷하다고 생각하면 될 것 같다.
package jdbcprj;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Main {
// JDBC driver info
static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
static final String DB_URL1 = "jdbc:oracle:thin:@localhost:1521/xepdb1"; // ServiceName으로 접속할 때에는 / 사용
static final String DB_URL2 = "jdbc:oracle:thin:@localhost:1521:xe"; // SID로 접속할 때에는 : 사용
// DB credentials
static final String USER = "c##berry";
static final String PASS = "straw";
public static void main(String[] args) {
System.out.println("Connecting to DB, Creating statement");
try (
Connection conn = DriverManager.getConnection(DB_URL1, USER, PASS);
Statement stmt = conn.createStatement();
) {
System.out.println("Connected to DB, Statement created successfully");
/* execute a query */
// execute SELECT statement
String sql4 = "SELECT empno, ename FROM berry.emp";
ResultSet rs = stmt.executeQuery(sql4);
// retrieve data
while (rs.next()) {
// retrieve by column name
int id = rs.getInt("empno");
String ename = rs.getString("ename");
// display values
System.out.printf("empno: %d, ename: %s\n", id, ename);
}
} catch (SQLException se) {
/* handle errors for JDBC */
se.printStackTrace();
} catch (Exception e) {
/* handle errors for Class.forName */
e.printStackTrace();
}
System.out.println("End of program");
}
}
'콤퓨타 왕기초 > Spring' 카테고리의 다른 글
[Spring MVC] 서비스 객체, Connection 분리하기 (0) | 2021.05.01 |
---|---|
[Spring MVC] 서비스 객체 사용하기 (0) | 2021.05.01 |
[JDBC] JDBC (0) | 2021.05.01 |
[Spring MVC] 데이터 서비스 클래스 (0) | 2021.04.29 |
[Spring MVC] Tiles를 통한 페이지 모듈 분리(Retired Framework) (0) | 2021.04.29 |