☕Java/JDBC
[20210611] JDBC
캔
2021. 6. 11. 16:25
JDBC를 통해 오라클 데이터베이스에 저장된 데이터에 접근하는 것이 가능하다. 오라클 데이터베이스 안에서 데이터를 다루는 것은 오라클 데이터베이스 카테고리에서 설명해 놓았다.
여기서는 자바 프로그램에서 JDBC를 통해 오라클 데이터베이스에 접근할 수 있도록 하는 코드를 기술한다.
//JDBCEx02.java
package Day11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JDBCEx02 {
public static void main(String[] args) throws Exception {
//---------서버 접속을 위한 정보(드라이버명, url, 사용자이름, 비밀번호) 선언
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost";
String user = "scott";
String password = "tiger";
//---------연결을 위한 객체들 생성
//Connecton: 데이터베이스에 연결 및 접속하기 위한 객체
//PreparedStatement: SQL문을 미리 컴파일해놓은 객체
//ResultSet: SQL문 중 SELECT문으로 질의한 결과를 저장하기 위한 객체
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//연결부: 연결을 하기 위한 코드들
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
System.out.println("conn: "+ conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
//조작부: SQL문을 실행하여 질의(Query)를 실행하거나 데이터를 삽입(insert), 수정(update), 삭제(delete)
//여기서는 SELECT문을 통해서 데이터베이스에 질의하고 결과를 가져온다.
String sql = "select * from emp";
try {
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();//SQL문을 실행한 결과를 ResultSet에 입력
while(rs.next()) {
//ResultSet에 저장된 결과 집합에서 필요한 각각의 데이터들을 형에 맞춰 자바의 변수로 가져옴
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
int sal = rs.getInt("sal");
String hiredate = rs.getString("hiredate");
int deptno = rs.getInt("deptno");
System.out.print("사번: "+empno);
System.out.print(", 사원명: "+ename);
System.out.print(", 급여: "+sal);
System.out.print(", 입사일: "+hiredate.substring(0, 10));
System.out.print(", 부서번호: "+deptno);
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
}
//MakeConnection.java
package Day11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class MakeConnection {
private static String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static String URL = "jdbc:oracle:thin:@localhost";
private static String USER = "scott";
private static String PASSWORD = "tiger";
static Connection conn = null;
private static MakeConnection mc;
private MakeConnection() {}
public static MakeConnection getInstance() {
if(mc == null) mc = new MakeConnection();
return mc;
}
public static Connection getConnection() {
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
첫 번째 코드에서 연결부를 MakeConnection 클래스로 만들어주었다. 매번 연결할 때마다 코드를 다시 작성하는 것은 비효율적이므로 클래스를 만들어 사용한다.
package Day11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import Day11.MakeConnection;
public class JDBCEx05 {
public static void main(String[] args) {
//연결부
Connection conn = MakeConnection.getConnection();
System.out.println("conn : " + conn);
//INSERT문 수행을 위한 데이터 변수 선언
int empno = 7945;
String ename = "홍길동";
String job = "산적";
int mgr = 7900;
String hiredate = "1812/02/03";
int sal = 2000;
int comm = 0;
int deptno = 50;
StringBuffer sb = new StringBuffer();//StringBuffer는 가변적인 문자열을 다루는 클래스
sb.append("insert into emp ");SQL문을 StringBuffer에 뒤쪽으로 추가(append)
sb.append("values (?,?,?,?,?,?,?,?) ");//'? 위치에 데이터를 추가 하겠다는 의미
PreparedStatement pstmt = null;
//조작부
try {
pstmt = conn.prepareStatement(sb.toString());
pstmt.setInt(1, empno);//sb의 첫 번째 물음표에 데이터 추가
pstmt.setString(2, ename);//sb의 두 번째 물음표에 데이터 추가
pstmt.setString(3, job);//sb의 세 번째 물음표에 데이터 추가
pstmt.setInt(4, mgr);//sb의 네 번째 물음표에 데이터 추가
pstmt.setString(5, hiredate);//sb의 다섯 번째 물음표에 데이터 추가
pstmt.setInt(6, sal);//sb의 여섯 번째 물음표에 데이터 추가
pstmt.setInt(7, comm);//sb의 일곱 번째 물음표에 데이터 추가
pstmt.setInt(8, deptno);//sb의 여덟 번째 물음표에 데이터 추가
pstmt.executeUpdate();//update, insert, delete문은 executeQuery가 아닌 executUpdate를 사용한다.
}catch(SQLException e) {
e.printStackTrace();
}finally {
try {
pstmt.close();
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}