JDBC/Oracle_JAVA DB 연동

zooyeong·2023년 4월 29일
0

13주차

목록 보기
5/7
post-thumbnail

드라이브 로드

Java에서 DB를 연결하기 위해 우선 드라이브를 로드해야 한다.

>>> Project(로드할 프로젝트) > properties > Java Build Path > Add External JARs > ojdbc8.jar
>>> 파일 열기를 통해 JDBC 드라이버 로딩을 완료했다.


Connection DB 연결

Class.forName("oracle.jdbc.driver.OracleDriver");
			
String db_url = "jdbc:oracle:thin:@localhost:1521:orcl";
String db_id = "scott";
String db_pw = "tiger";
			
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_url, db_id, db_pw를 매개변수로 갖는다


Statement SQL쿼리 실행

Connection conn = null; //DB 연결을 위한 Connection 객체
PreparedStatement psmt = null; //Connection을 통해 sql 명령을 실행 객체
ResultSet rs = null; //sql 쿼리 실행 후 반환된 결과 값을 저장하는 객체

try {
	conn = DBConnectionManager.getConnection();

	//쿼리문!
	String sql = "insert into t_person_info "
			+ " values ( (select NVL(MAX(id),0)+1 FROM t_person_info), ?)";

	psmt = conn.prepareStatement(sql);
			//psmt.setInt(1, 23); //쿼리문 where절 ?를 변수에 값 세팅
	psmt.setString(1, name); 

	int cnt = psmt.executeUpdate();
			
	System.out.println("처리결과:" + cnt);

	//DB에 쿼리문 실행
	//쿼리 결과를 반환 -> 활용

} catch (SQLException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} finally {
	DBConnectionManager.close(rs, psmt, conn);
}

>>> PreparedStatement() 메서드는 sql문을 전달해 PreparedStatement 객체를 생성한다. PreparedStatement는 SQL문을 실행하고 결과를 반환하는 기능들을 캡슐화한 인터페이스이다. PreparedStatement는 Statement를 상속받고 있다.

>>> SQL문의 ?setString() 메서드로 값을 넣어줄 수 있다. setString(n, 변수(or 값)) 의 매개변수로 n은 SQL문의 물음표(?)의 위치를, 변수(or 값)에는 넣어줄 값을 받을 수 있다.


ResultSet

SQL문 실행 시 출력되는 데이터베이스 결과 값을 나타내는 테이블이다.

Connection conn = null; //DB 연결을 위한 Connection 객체
PreparedStatement psmt = null; //Connection을 통해 sql 명령을 실행 객체
ResultSet rs = null; //sql 쿼리 실행 후 반환된 결과 값을 저장하는 객체
try {
	conn = DBConnectionManager.getConnection();

	//쿼리문!
	String sql = "SELECT empno, ename empname, job, mgr, hiredate, sal, comm, deptno "
					+ " FROM emp WHERE empno = ? OR ename = ?";

	psmt = conn.prepareStatement(sql);
	psmt.setInt(1, 7782); //쿼리문 where절 ?를 변수에 값 세팅
	psmt.setString(2, "FORD"); 

	rs = psmt.executeQuery(); //쿼리를 실행!!하고 저장!

	//rs.next() >>> return값이 boolean으로 넘어옴
	//ResultSet next() 메소드는 결과 데이터 다음행 다음행 다음행 이동.
	//return true/false -> 값이 있다 없다!
	while(rs.next()) {
		System.out.println(rs.getInt("empno"));
		System.out.println(rs.getString("empname")); //별칭을 지은경우 별칭으로 불러야함
		System.out.println(rs.getString("job"));
		System.out.println(rs.getInt("mgr"));
		System.out.println(rs.getDate("hiredate"));
		System.out.println(rs.getInt("sal"));
		System.out.println(rs.getInt("comm"));
		System.out.println(rs.getInt("deptno"));
	}

	//DB에 쿼리문 실행
	//쿼리 결과를 반환 -> 활용

} catch (SQLException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} finally {
	DBConnectionManager.close(rs, psmt, conn);
}

>>> executeQuery() 메서드를 사용해 SQL문을 실행 후 결과를 저장한다. next()메서드를 통해 테이블의 다음 행을 가리켜주고, 반환된 결과를 값이 있으면 true, 없으면 false로 리턴해준다. 이후 getInt(), getStrung(), getDate()등의 메서드를 통해 값을 가져올 수 있다.


close() DB 연결 해제

try {
	if(rs != null) {				
		rs.close();
	}
	if(psmt != null) {				
		psmt.close();
	}
	if(conn != null) {				
		conn.close();
	}
} catch (SQLException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} //연결을 종료

>>> 통로를 연결하고 작업을 완료한 후에는 연결했던 통로를 다시 닫아주어야 한다. 닫아야할 값이 null이면 에러가 발생하기때문에 if문으로 null이 아닌 경우에만 실행할 수 있게 조건을 걸어준다.


클래스에 static 메소드로 저장해두고 사용

DBConnectionManager라는 클래스를 생성하여 다음과 같이 Connection과 close 메소드를 생성해두면 간편하게 처리하고 사용할 수 있다.

import java.beans.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBConnectionManager {
	//DB 연결을 도와주는 기능을 가진 클래스
	
	public static Connection getConnection() {
		Connection conn = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			String db_url = "jdbc:oracle:thin:@localhost:1521:orcl";
			String db_id = "scott";
			String db_pw = "tiger";
			
			conn = DriverManager.getConnection(db_url, db_id, db_pw);
		
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return conn;
		
	}	
	
	public static void close(ResultSet rs, PreparedStatement psmt, Connection conn) {
		try {
			if(rs != null) {				
				rs.close();
			}
			if(psmt != null) {				
				psmt.close();
			}
			if(conn != null) {				
				conn.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //연결을 종료
	}
}
profile
Have a good day ⌯’▾’⌯

0개의 댓글