JDBC 원리

oyeon·2021년 1월 3일
0
post-custom-banner

JDBC 개요

  • Java가 제공하는 표준 인터페이스
  • Java 프로그램 내에서 SQL문을 실행하기 위한 자바 API
  • DB 벤더(mysql, oracle 등)에 관계없이 똑같은 방법으로 사용하면 된다.
    (=인터페이스의 특성)

JDBC 프로그래밍 방법

  1. import java.sql.*;
  2. 드라이버를 로드
    (각각의 벤더가 제공하는 라이브러리를 사용할 수 있게 한다.)
  3. Connection 객체 생성한다.
    (DB가 접속될 때 얻을 수 있는 객체. Connection = 인터페이스. 객체 = 각각의 벤더가 구현해 놓음)
  4. Statement 객체 생성
    (Statement 객체 생성 = 쿼리문 생성. Statement = 인터페이스. 객체 = 각각의 벤더가 구현해 놓음)
  5. 질의 수행
  6. SQL문에 결과물이 있다면 ResultSet 객체를 생성
    (결과물은 쿼리문에 따라 다름. ex. select -> 컬럼 출력, insert -> OK)
  7. 모든 객체를 닫는다.
    (연결을 하면 마지막에 반드시 닫아야 한다. 여러 클라이언트가 있을 수 있는데 DB는 무한이 아니기 때문에 썼으면 닫아야 한다.)

JDBC 클래스의 생성관계

  • 모두 사용하고 닫을 때는 열었던 반대 순서로 닫는다!
    (ResultSet -> Statement -> Connection -> DriverManager)

JDBC 사용 - 단계별 설명

  1. import
import java.sql.*;
  1. 드라이버 로드
// Class 클래스의 forName 메서드가 com.mysql.jdbc.Driver 객체를 메모리에 올린다.
Class.forName("com.mysql.jdbc.Driver"); // 객체 이름은 DB 벤더마다 다름
  1. Connection 얻기
String dburl = "jdbc:mysql://localhost/dbName"; // dburl 이름은 DB 벤더마다 다름
// DriverManager를 이용해서 Connection 인스턴스를 얻는다.
Connection con = DriverManager.getConnection(dburl, ID, PWD);
// 소스코드 예제
public static Connection getConnection() throws Exception{
	String url = "jdbc:oracle:thin:@117.16.46.111:1521:xe";	// oracle
	String user = "smu";
	String password = "smu";
	Connection conn = null;
	Class.forName("oracle.jdbc.driver.OracleDriver");
	conn = DriverManager.getConnection(url, user, password);
	return conn;
}
  1. Statement 생성
// con(Connection)을 통해서 Statement를 얻는다.
Statement stmt = con.createStatement();
  1. 질의 수행
ResultSet rs = stmt.executeQuery("select no from user");

// 참고
stmt.execute("query");		// any SQL
stmt.executeQuery("query");	// select
stmt.executeUpdate("query");	// insert, update, delete
  1. ResultSet으로 결과 받기
// DB로부터 한 건씩 결과 값을 읽어온다.
while(rs.next())
    System.out.println(rs.getInt("no"));
  1. Close
rs.close();
stmt.close();
con.close();

앞으로 Spring JDBC를 배우기 앞서 JDBC의 원리에 대해 배웠다. 만약 Spring과 같은 framework이 없다면 다음과 같은 JDBC 코드를 직접 작성해야 할 것이다.

public List<GuestBookVO> getGuestBookList(){
		List<GuestBookVO> list = new ArrayList<>();
		GuestBookVO vo = null;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			conn = DBUtil.getConnection();
			String sql = "select * from guestbook";
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()){
				vo = new GuestBookVO();
				vo.setNo(rs.getInt(1));
				vo.setId(rs.getString(2));
				vo.setTitle(rs.getString(3));
				vo.setConetnt(rs.getString(4));
				vo.setRegDate(rs.getString(5));
				list.add(vo);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally {
			DBUtil.close(conn, ps, rs);
		}		
		return list;		
	}
public int addGuestBook(GuestBookVO vo){
		int result = 0;
		Connection conn = null;
		PreparedStatement ps = null;
		try{
			conn = DBUtil.getConnection();
			String sql = "insert into guestbook values("
					+ "guestbook_seq.nextval,?,?,?,sysdate)";
			ps = conn.prepareStatement(sql);
			ps.setString(1, vo.getId());
			ps.setString(2, vo.getTitle());
			ps.setString(3, vo.getConetnt());
			result = ps.executeUpdate();
		}catch(Exception e){
			e.printStackTrace();
		}finally {
			DBUtil.close(conn, ps);
		}
		
		return result;
	}
public static void close(Connection conn, PreparedStatement ps){
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {e.printStackTrace(); }
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {e.printStackTrace();}
		}
	}
profile
Enjoy to study
post-custom-banner

0개의 댓글