JDBC
JDBC란?
- Java Database Connectivity
- 자바에서 데이터베이스를 연결해주는 자바 API
준비물
- DB 벤더별 커넥터 필요
- MariaDB : https://mariadb.com/kb/en/about-mariadb-connector-j/
- MySQL : https://dev.mysql.com/downloads/connector/j/
- Oracle : https://www.oracle.com/kr/database/technologies/appdev/jdbc.html
- 인텔리제이의 경우, Project Structure → Libraries → 다운받은 커넥터 추가 해주면 된다.
- 후에 Maven이나 Gradle 쓰면 굳이 사이트 들어가서 다운받고 라이브러리 넣을 필요없이 저장소 검색해서 다운받으면 된다. 일단 여기서는 기본으로 설명
JDBC 순서
- JDBC 드라이버 로드
- Class.forName(”드라이버 경로”)
- Java Reflection에서 제공하는 기능 중 하나
- JVM에 파라미터로 주어진 이름과 같은 클래스를 JVM에 로딩시킨다.
- 드라이버 경로는 벤더별로 드라이버가 저장된 경로가 다르기 때문에 확인해보고 사용
- MariaDB : org.mariadb.jdbc.Driver
- MySQL : com.mysql.cj.jdbc.Driver
- Oracle : oracle.jdbc.driver.OracleDriver
- Class.forName(”드라이버 경로”)
- DB Connection 생성
- DriverManager.getConnection(”url”,”id”,”password”)
- DriverManager
- DB 드라이버들을 관리,로딩하고, DB에 연결을 책임지는 클래스
- 사용할 드라이버는 드라이버 매니저가 드라이버를 구동하기 전에 등록되어야 한다.
- new Driver() 없이도 DriverManager가 드라이버를 구동할 수 있는 이유는 Class.forName으로 드라이버를 로드할 때, 이미 DriverManager에 등록되기 때문이다.
- DriverManager
- DriverManager.getConnection(”url”,”id”,”password”)

- SQL을 위한 Statement 객체 생성
- Statement
- 쿼리를 담아 전달한 그릇
- 종류
- Statement
- 단일로 사용할 때 빠른 속도를 지님
- 매번 컴파일을 수행해야 함
- 쿼리에 인자를 부여할 수 없음
- 취약점이 있어서 사용하지 않는 것이 권고되어짐
String sql = "SELECT name, class FROM player"; Statement stmt = conn.createStatement(); ResultSet rs = s.executeQuery(sql);
- PreparedStatement
- 주로 사용하는 statement
- 여러번 수행될 때 빠른 속도를 지님
- 처음 프리 컴파일 된 후, 컴파일을 수행하지 않음
- 쿼리에 인자 부여 가능 ( = 동적 쿼리 가능)
- sql문에 ?를 이용해서 setXXX()를 통해 원하는 값을 넣을 수 있음
- ?는 앞에서부터 1,2,3~ 으로 인덱스를 가짐
String sql = "UPDATE player SET name = ?, position = ? where name = ?; "; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "토리"); pstmt.setString(2, "공격수"); pstmt.setString(3, "초코"); ps.executeQuery();
- CallableStatement
- PreparedStatement + 프로시저 호출 가능
- Statement
- Statement
- SQL 문장 실행
- Execute
- execute()
- 모든 구문 수행 가능
- Boolean 값 반환
- 쿼리 수행 결과가 ResultSet 일 경우 true, 아닐 경우 false
- executerQuery()
- 쿼리 수행 결과를 ResultSet에 담아서 반환
- 주로 Select 문에 사용
- executeUpdate()
- INSERT, UPDATE, DELETE 나 CREATE, DROP 등을 실행하는데 사용
- 영향을 받은 행 수를 반환
- execute()
- Execute
- SQL 실행 결과 처리
- ResultSet
- 검색 결과를 테이블 형식으로 저장한 인스턴스
- 데이터가 여러행일 경우 한번에 가져올 수 없기 때문에, 내부적으로 커서를 이용해서 가져온다.
- ResultSet.next()
- 커서를 다음행으로 이동하는 메소드
- 반환값은 Boolean (커서 위치에 처리할 행이 있으면 true, 없으면 false)
- ResultSet.getXXX(int 컬럼 위치), ResultSet,getXXX(String 컬럼명)
- 커서 위치의 값을 반환하는 메소드
- 보통 컬럼명을 매개변수로 하는 것을 사용한다.
- ResultSet.next()
- ResultSet
- JDBC 객체 연결 해제
- ResultSet 해제
- Statement 해제
- Connection 해제
예시
import java.sql.*;
public class JDBC {
public static void main(String[] args) {
String url = "jdbc:mariadb://localhost:3306/practice";
String user = "admin";
String password = "test";
try {
// 1. 드라이버 로드
Class.forName("org.mariadb.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 도중에 오류 등으로 try문이 종료되더라도 finally에서 jdbc객체들을 해제할 수 있도록 외부에서 객체를 미리 선언
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 2. Connection 객체 생성
conn = DriverManager.getConnection(url, user, password);
// 3. Statement 객체 생성
String sql = "SELECT * FROM player WHERE position = ?;";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "공격수");
// 4. 쿼리 실행
rs = pstmt.executeQuery();
// 5. 결과 수행
while (rs.next()) {
String name = rs.getString("name");
String pos_name = rs.getString("position");
System.out.println(name + " / " + pos_name);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
// 6. JDBC 객체 연결 해제
if (rs != null && !rs.isClosed()) {
rs.close();
}
if (pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}'JAVA > JAVA 기초' 카테고리의 다른 글
| JDBC) 대량 쿼리문 실행 for SQLite (0) | 2022.05.21 |
|---|---|
| 자바 8 람다를 이용한 다중 조건 정렬 (0) | 2022.04.07 |
| 스트림 (Stream) (0) | 2022.03.29 |
| 람다식 (0) | 2022.03.29 |
| 컬렉션 프레임워크 (Collection Framework) (0) | 2022.03.29 |
댓글