JDBC & Spring JDBC

2020. 11. 11. 21:37공부 정리/spring

1. JDBC(Java Database Connectivity)


자바를 이용한 데이터베이스 접속과 SQL 문장의 실행

실행 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약

 

  • 자바 프로그램 내에서 SQL문을 실행하기 위한 자바 API
  • SQL과 프로그래밍 언어의 통합 접근 중 한 형태
  • JAVA는 표준 인터페이스인 JDBC API를 제공
  • 데이터베이스 벤더, 또는 기타 써드파티에서는 JDBC 인터페이스를 구현한 드라이버(driver)를 제공

 

a. JDBC를 이용한 프로그래밍 방법


  1. import java.sql.*;
  2. 드라이버를 로드한다.
  3. Connection 객체를 생성한다.
  4. Statement 객체를 생성 및 질의 수행
  5. SQL문에 결과물이 있다면 ResultSet 객체를 생성한다.
  6. 모든 객체를 닫는다.

출처: https://cphinf.pstatic.net/mooc/20180201_49/1517475141729UGWfv_PNG/2_11_1_JDBC_.PNG

 

b. 소스 예제


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

public class RoleDao {
	private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
	private static String dbUser = "connectuser";
	private static String dbpasswd = "connect123!@#";

	public Role getRole(Integer roleId) {
		Role role = null;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
        	/*드라이버 로드*/
			Class.forName("com.mysql.jdbc.Driver");
            /*Connection 얻기*/
			conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
			String sql = "SELECT description,role_id FROM role WHERE role_id = ?";
            /*statement 생성*/
			ps = conn.prepareStatement(sql);
			ps.setInt(1, roleId);
            /*질의 수행 & ResultSet으로 결과 받기*/
			rs = ps.executeQuery();
		
			if (rs.next()) {
				String description = rs.getString(1);
				int id = rs.getInt("role_id");
				role = new Role(id, description);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
        
        /*Close*/
        finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}

		return role;
	}
}

statement 생성으로 prepareStatement를 사용하였는데 둘의 차이점은 Statement는 쿼리문을 미리 생성하지 않으나 PrepareStatement는 쿼리문을 미리 생성하여 실행시마다 쿼리를 생성하지 않기 때문에 Statement에 비해 반복 실행 시 속도가 더 빠르다.

 

2. Spring JDBC


JDBC프로그래밍의 반복되는 개발 요소에서 저수준 세부사항을 스프링 프레임워크가 처리해준다.

출처: https://cphinf.pstatic.net/mooc/20180205_176/1517797019977L6ygq_PNG/2_11_2_springJDBC.PNG

 

a. JDBC Template


"JDBC를 위한 틀"로 SQL연산을 수행할 수 있게 도와주는 툴이다.

 

SQL 조회, 업데이트, 저장 프로시저 호출, ResultSet 반복호출 등을 실행한다.

스테이먼트(Statement)의 생성과 실행을 처리한다.

리소스 생성, 해지를 처리해서 연결을 닫는 것을 잊어 발생하는 문제 등을 피할 수 있도록 한다.

org.springframework.jdbc.core에서 가장 중요한 클래스이다. 

JDBC 예외가 발생할 경우 org.springframework.dao패키지에 정의되어 있는 일반적인 예외로 변환시킨다.

 

b. datasource


데이터소스(datasource)는 서버로부터 데이터베이스에 대해 연결을 구축하기 위해 사용하는 이름이다.

이 이름은 데이터베이스에 쿼리를 만들 때 공통적으로 사용된다.

출처: https://loopback.io/pages/en/lb4/imgs/datasource.png

  • DataSource는 커넥션 풀을 관리하는 목적으로 사용되는 객체다.
  • DataSource를 이용해 커넥션을 얻어오고 반납하는 등의 작업을 수행한다.

c. Spring JDBC 패키지


org.springframework.jdbc.core

  • JdbcTemplate 및 관련 Helper 객체 제공

org.springframework.jdbc.datasource

  • DataSource를 쉽게 접근하기 위한 유틸 클래스, 트랜젝션매니져 및 다양한 DataSource 구현을 제공

org.springframework.jdbc.object

  • RDBMS 조회, 갱신, 저장등을 안전하고 재사용 가능한 객제 제공

org.springframework.jdbc.support

  • jdbc.core 및 jdbc.object를 사용하는 JDBC 프레임워크를 지원

 

d. 소스 예제


Actor actor = this.jdbcTemplate.queryForObject(
  "select first_name, last_name from t_actor where id = ?",
  new Object[]{1212L},

  new RowMapper<Actor>() {
    public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
      Actor actor = new Actor();
      actor.setFirstName(rs.getString("first_name"));
      actor.setLastName(rs.getString("last_name"));
      return actor;
    }
  });

 

 

출처 & 참고

'공부 정리 > spring' 카테고리의 다른 글

Spring MVC - Dispatcher Servlet(2)  (0) 2021.08.26
Spring MVC - Dispatcher Servlet(1)  (0) 2021.08.23