JDBC(PreparedStatement,ResultSet,드라이버 로딩,Connection,Insert 문 실행)

최동민·2022년 5월 24일
0

Spring 수업정리

목록 보기
4/47

JDBC

JDBC(Java Database Connectivty)란 자바에서 제공하는 데이터베이스와 연결하여 데이터를 주고 받을 수 있도록 하는 인터페이스다.
우리는 자바를 통해서 일관된 방법으로 여러가지 데이터베이스에 접속할 수 있다.

Class.forName() 을 이용해서 드라이버 로드
DriverManager : 로드된 드라이버를 통해서 Connection을 활성화 해주는 객체
DriverManager.getConnection() 으로 연결 얻기
Connection : 데이터베이스와의 연결. Connection 인스턴스를 이용해서 Statement 객체 생성
Statement 객체의 결과를 ResultSet 이나 int에 받기.
Statement : SQL을 실행하는 객체

Statement, PreparedStatement

쿼리를 실행하기 위해서 우리는 위의 두 클래스를 사용한다. 두 객체에는 서로 장단점이 있지만, 자바는 주로 웹개발을 위해서 사용된다. 웹 개발에서는 보안문제(SQL 인젝션) 때문에 PreparedStatement를 사용한다.
(PreparedStatement는 Statement의 서브클래스.)

두 클래스의 가장 큰 차이점은 Statement는 SQL문을 실행할 때 마다 SQL구문을 매 번 새로 작성해야하고 (Statement 객체들은 자체에 SQL문을 포함하지 않기 때문)해석해야 해서 오버헤드가 있는 반면, PreparedStatement는 이름에서 볼 수 있듯이 선처리 방식을 사용한다.
준비된 statement, (이미 이전에 컴파일 된 SQL문을 포함)즉 SQL문을 미리 준비해 놓고 바인딩 변수 차례 번호, 값을 이용해서 반복되는 비슷한 SQL문을 쉽게 처리할 수 있다.
두 클래스의 주요 메소드는 다음과 같다.

PreparedStatement의 객체 생성

PreparedStatement 객체명 = Connection 객체.prepareStatement("SQL문");

PreparedStatement는 SQL문을 작성할 때 컬럼 값을 실제로 지정하지 않고, 변수 처리 함으로써 DBMS를 효율적으로 사용한다.
PreparedStatement의 SQL문은 SQL의 구조는 같은데 조건문의 조건이 수시로 변할 때 조건의 변수처리를 "?"문자로 처리한다. 이를 "바인딩 변수" 라고 한다. 바인딩 변수는 반드시 컬럼 명이 아닌 컬럼 값이 와야 한다. 바인딩 변수의 순서는 "?"의 개수에 의해 결정이 되는데 시작 번호는 1이다.
PreparedStatement 객체에 지정된 SQL문을 실행하기 전에 SQL문에서 사용한 바인딩 변수의 값을 설정해야 한다. 바인딩 변수 값 저장 메서드는 ResultSet의 getXXX() 메서드와 유사하다.

ex) preparedStatement.setString(1, user.getEmail());

PreparedStatement 인터페이스에는 바인딩 변수에 값을 저장하는 setXXX() 메서드를 제공하고 있다. 바인딩 변수에 지정한 데이터가 String이라면 사용할 메서드는 setString()메서드가 된다. setXXX() 메서드는 두 개의 인자를 요구한다. setXXX(바인딩 변수의 순서번호, 값);


ResultSet 인터페이스

ResultSet 클래스는 Select문을 executeQuery()메소드를 사용하여 얻은 레코드의 값들을 가상의 데이터베이스 테이블의 형태로 받아 저장할 수 있는 객체다.
SQL문 실행 후 데이터를 받는 객체

Select문을 통해 데이터를 가져오는 경우 ResultSet 객체에 데이터를 저장해야 한다. executeQuery : ResultSet 객체에 결과값을 담는다.

모든 데이터를 한번에 가져올 수 없기 때문에 cursor의 개념을 가지는데, 커서(cursor)란 ResultSet 객체가 가져올 수 있는 행의 위치를 지정해 준다. 처음 커서의 위치는 결과물(필드)에 위치하지 않기 때문에 cursor를 이동해주어야 하는데, 이 역할은 ResultSet의 next() 메서드가 수행한다.

next(): 커서를 다음 위치로 이동.
next()메서드의 리턴 타입은 boolean인데 이는 다음 행의 결과물(필드)이 있으면 true. 없으면 false를 리턴한다.
즉 next()메서드는 ResultSet의 현재 레코드를 가리키는 포인터인 커서를 이동시킬 뿐이고 커서가 가리키고 있는 현재 레코드로부터 필드 값을 읽어오려면 필드값의 유형에 따라 getXXX()메서드를 사용해야 한다.

ResultSet.get.XXX()

ResultSet 객체가 결과물(필드)을 가져올 수 있는 행으로 이동이 되었다면 해당 행의 실제 결과물(필드)을 가져와야 하는데. 이 역할을 getXXX() 메서드가 제공한다. 자료형 타입에 따라 호출하면 되는데, 예를 들어 id컬럼이 varchar2 타입이면 getString(). age컬럼이 number 타입이면 getInt() 메서드를 사용하면 된다.

getXXX()메서드는 정수로 인자를 받는 것과 String 타입으로 인자를 받는 메서드 두 가지를 제공한다. 첫 번째 정수를 받는 타입은 SELECT문 다음에 쓰는 컬럼명의 인덱스를 지정하는데 인덱스의 처음번호는 1부터 시작한다. 두 번째 String 타입은 SELECT 문의 다음에 오는 컬럼명으로 지정해야 한다.
즉, getXXX()메서드를 사용하여 필드(Column)값을 읽어올 때 필드 이름이나 정의된 필드 순서(1부터 시작)에 따라 정수값을 지정해 줄 수 있다.


JDBC 드라이버 로딩과 Connection 생성

1. JDBC 드라이버 로딩

MySQL의 JDBC Driver Class를 로딩한다.
Class.forName(“driver”)을 이용해서 Driver Class를 로딩하면 객체가 생성되고, DriverManager에 등록된다.
ex) Class.forName(“com.mysql.jdbc.Driver”)
Driver 클래스를 찾지 못할 경우, ClassNotFoundException 예외가 발생 한다.

2. Connection 생성

Connection - 데이터베이스와 연결하는 객체이다.
DriverManager.getConnection(연결문자열, DB_ID, DB_PW) 으로 Connection 객체를 생성한다.
연결문자열(Connection String) - “jdbc:Driver 종류://IP:포트번호/DB명”
ex) jdbc:mysql://localhost:3306/test_db
DB_ID : MySQL 아이디
DB_PW : MySQL 비밀번호

DriverManager.getConnection()은 실제 자바프로그램과 데이터베이스를 네트워크상에서 연결을 해주는 메소드이다. 연결에 성공하면 DB와 연결 상태를 Connection 객체로 표현하여 반환한다. Connection은 네트워크상의 연결 자체를 의미한다. 자바프로그램과 DB사이의 길로 볼 수 있다. 보통 Connection하나당 트랜잭션 하나를 관리한다.

2.1 DriverManager 클래스

DriverManager 클래스는 JDBC 드라이버를 통하여 Connection을 만드는 역할을 합니다.
DriverManager는 Class.forName( ) 메소드를 통해서 생성됩니다.


Insert 문 실행

  1. JDBC 드라이버를 로딩
    Class.forName(“com.mysql.jdbc.Driver”)
  2. Connection 객체를 생성
    con = DriverManager.getConnection(url, user, pw)

위 과정 해결 - StandardDao 를 상속하고 getConnection()을 불러옴.

  1. PreparedStatement 객체 생성, 객체 생성시 SQL 문장 저장
    PreparedStatement - SQL문을 데이터베이스에 보내기위한 객체입니다.
    PreparedStatement preparedStatement = connection.prepareStatement(“SQL 문장”)
  2. preparedStatement.set<데이터타입>(순서, 값)
    매개변수에 값을 지정합니다.
    ex) preparedStatement.setString(1, 값),
    preparedStatement.setInt(2, 값)
  3. SQL 문장을 실행하고 결과를 리턴

SQL 문장 실행 후, 변경된 row 수를 int type 으로 리턴합니다.
변경된 row 수가 0 이면 삭제된 행이 없습니다.
preparedStatement.excuteUpdate()

profile
코드를 두드리면 문이 열린다

0개의 댓글