Java 기반의 DB액세스 기술(JDBC)

hun·2023년 11월 17일

Spring Boot을 사용하여 개발하다보면
심심치 않게 DB관련 개발을 할때 JPA, Hibernate, JDBC등 들어봤을 것이다.
정확한 차이를 알고 사용하고 싶어서 기록한다.

1. JDBC

  • 1-1 JDBC이 무엇인가?

    JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.
    -위키백과

    즉, JDBC는 DBMS에 종속되지 않는 API를 제공해 준다.
    JDBC Driver는 각 DBMS 회사에서 제공해주는 라이브러리 파일이다.

  • 1-2 JDBC API

  • 1. JDBC 드라이버 Load

Class.forName("JDBC 드라이버 이름");
  • 2. Connection 객체 생성

String db_Url = jdbc:[DBMS]:[데이터베이스식별자];
String db_Id = "Id";
String db_Pw = "pw";

Connection con = DriverManager.getConnection(db_Url, db_Id, db_Pw);
  • 3. Statement 객체 생성

    Statement 객체 생성에는 2가지 방법이 있다.
  1. Statement/PreparedStatement

     PreparedStatement 와 Statement의 가장 큰 차이점은 캐시(cache) 사용여부이다.
    1) 쿼리 문장 분석
    2) 컴파일
    3) 실행
    Statement를 사용하면 매번 쿼리를 수행할 때마다 1) ~ 3) 단계를 거치게 되고, PreparedStatement는 처음 한 번만 세 단계를 거친 후 캐시에 담아 재사용을 한다는 것이다. 만약 동일한 쿼리를 반복적으로 수행한다면 PreparedStatment가 DB에 훨씬 적은 부하를 주며, 성능도 좋다.
    출처: https://devbox.tistory.com/entry/Comporison

// Statement를 사용하는 경우
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM employees");

// PreparedStatement를 사용하는 경우
String sql = "SELECT * FROM employees WHERE department = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "IT");
ResultSet resultSet = preparedStatement.executeQuery();

/*
* PreparedStatement의 경우 sql 변수에 지정된 쿼리가 미리 컴파일되고,
나중에 setString과 같은 메서드를 사용하여 파라미터를 설정한 후에 실행됩니다. 
이로 인해 동일한 쿼리가 여러 번 실행되더라도 최적화된 형태로 실행될 수 있습니다.
*/
  • 4. Query 수행

    executeUpdate() / executeQuery()
    executeUpdate()는 Query문이 INSERT, DELETE, UPDATE의 경우에 사용합니다.(반환되는 데이터들이 없으므로 ResultSet 객체가 필요없음)
    반환값은 몇 개의 row가 영향을 미쳤는지를 int형 반환

    executeQuery()는 Query문이 SELECT의 경우에 사용, 반환값 타입은 ResultSet

String sql = "SELECT * FROM employees WHERE department = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "IT");
ResultSet resultSet = preparedStatement.executeQuery();
profile
짧더라도 확실한 기록

0개의 댓글