JDBC(Java DataBase Connectivity)
자바에서 데이터베이스와 연결하여 데이터를 다룰 수 있게 해주는 것을 말한다.
그래서 우리는 자바에서 데이터베이스의 데이터를 다루고 싶다면 JDBC 드라이버가 필요하다.
JDBC 드라이버는 각각의 DB에 맞는 드라이버를 설치해주도록 해야한다.
JDBC와 데이터베이스 연결하는 법
1) JDBC 드라이버 로드하기
Class.forName("org.mariadb.jdbc.Driver");
Class.forName() 메소드를 이용해서 드라이버를 로드할 수 있는데
데이터베이스에 따라 () 안의 내용은 변경될 수 있다.
예를 들어서 오라클 DB는 "oracle.jdbc.driver.OracleDriver"가 된다.
2) 데이터베이스 연결하기
String jdbc_url = "jdbc:mariadb://localhost:3306/practice";
String user = "root";
String password = "mariadb";
Connection con = DriverManager.getConnection(jdbc_url, user, password);
jdbc_url의 의미는 "jdbc:서버주소:포트번호:DB경로" 뜻한다.
이제 DriverManager의 getConnection() 메소드로 Connection 객체를 생성해줄 수 있다.
Connection 객체는 자바에서 DB와 연결하기 위해 사용하는 객체이다.
3) SQL 명령어를 전송하는 Statement 객체 생성하기
Statement stmt = con.createStatement();
Statement 객체는 쿼리 작업을 실행하기 위한 객체라고 할 수 있다.
Statement 객체를 생성하기 위해서는 Connection이 먼저 연결되어야 하고,
createStatement() 메소드를 이용해서 생성할 수 있다.
4) SQL 문장 실행하여 ResultSet 타입으로 반환하기
String sql = "SELECT * FROM member";
ResultSet rs = stmt.executeQuery(sql);
쿼리문을 처리하는 메소드가 2가지 있다. 1) executeQuery()와 2) executeUpdate()이다.
executeQuery()는 SELECT 구문을 수행할 때 사용하는 메소드로 ResultSet 객체의 값을 결과로 반환한다.
executeUpdate()는 SELECT를 제외한 CREATE, INSERT, UPDATE, DELETE, DROP 구문 등을 수행할 때
사용하는 메소드로 Int 타입의 값을 결과로 반환한다.
5) 결과 출력하기
while(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String addr = rs.getString("addr");
}
ResultSet을 통해서 결과를 받아올 때는 한 줄씩 받아올 수 있다.
ResultSet이 가르키는 곳을 커서라고 하는데 이 커서가 처음에는 값이 있는 레코드를 카르키는 것이 아니라
값이 있는 레코드의 전 부분을 가르킨다. 그래서 next() 메소드를 통해서 인덱스 0부터 값이 있는 레코드를
순서대로 가르킬 수 있도록 한다. 커서가 가르키는 행이 존재한다면 true를 반환하고,
존재하지 않는다면 false를 반환한다. 예를 들어 아래의 사진을 보도록하자.
이런 테이블이 있다고 가정해보자. 처음에 커서는 id, name, age, addr이 있는 행을 가르키게 되는 것이고,
next() 메소드를 통해서 다음 행들인 우리가 실제로 원하는 데이터의 값들을 얻을 수 있게 되는 것이다.
이때 ResultSet의 커서가 있는 행에서 컬럼의 값을 얻기 위해 getInt(), getString() 등의 메소드를 사용한다.
getInt()나 getString() 등의 () 안에는 컬럼 이름 또는 컬럼 순번을 넣어 컬럼의 데이터를 읽을 수 있다.
예를 들자면 getString("id") 또는 getString(1)의 형식으로 사용한다는 뜻이다.
참고로 컬럼의 이름으로 사용하는 것은 getXXX()만 가능하고 setXXX()는 불가능하다.
setXXX() 메소드를 사용하는 것은 다음글에서 사용해보도록 하겠다.
SELECT 구문 전체 코드(executeQuery())
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo {
// main에서 사용할 수 있도록 static
// 데이터의 내용이 고쳐지면 안되므로 final
// 상수는 대문자로 표기
static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
static final String JDBC_URL = "jdbc:mariadb://localhost:3306/practice";
static final String USER = "root";
static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(JDBC_DRIVER);
System.out.println("JDBC 드라이버 로드 성공");
con = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
stmt = con.createStatement();
String selectSQL = "SELECT * FROM member";
rs = stmt.executeQuery(selectSQL);
while(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String addr = rs.getString("addr");
System.out.print("id : " + id + ", ");
System.out.print("name : " + name + ", ");
System.out.print("age : " + age + ", ");
System.out.println("addr : " + addr);
}
stmt.close();
con.close();
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException se) {
se.printStackTrace();
}
try {
if (con != null) {
con.close();
}
} catch (SQLException se) {
se.printStackTrace();
}
}
}
}
데이터베이스를 닫는 순서는 ResultSet 객체 → Statement 객체 → Connection 객체 형식으로 닫아야 함을 잊지말자.
INSERT 구문 전체 코드(executeUpdate())
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo {
// main에서 사용할 수 있도록 static
// 데이터의 내용이 고쳐지면 안되므로 final
// 상수는 대문자로 표기
static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
static final String JDBC_URL = "jdbc:mariadb://localhost:3306/practice";
static final String USER = "root";
static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(JDBC_DRIVER);
System.out.println("JDBC 드라이버 로드 성공");
con = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
stmt = con.createStatement();
String insertSQL = """
INSERT INTO member
(id, name, age, addr)
VALUES
(6, "이지훈", 18, "광주")""";
int insertCount = stmt.executeUpdate(insertSQL);
System.out.println(insertCount + "개의 자료가 추가되었습니다.");
String selectSQL = "SELECT * FROM member";
rs = stmt.executeQuery(selectSQL);
while(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String addr = rs.getString("addr");
System.out.print("id : " + id + ", ");
System.out.print("name : " + name + ", ");
System.out.print("age : " + age + ", ");
System.out.println("addr : " + addr);
}
stmt.close();
con.close();
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException se) {
se.printStackTrace();
}
try {
if (con != null) {
con.close();
}
} catch (SQLException se) {
se.printStackTrace();
}
}
}
}
UPDATE나 DELTE 구문도 쿼리 부분만 바꿔주면 된다.
하지만 이 전체 코드들은 좋은 코드라고 할 수 없으므로 개념을 이해하는데에만 사용하도록 하자.
마지막으로 제일 중요한 점은 이 코드를 작성한 후 이클립스에서 드라이버 연결해야함을 명심하자.
자세한 내용은 아래의 글을 참고하면 된다.
2023.05.19 - [IDE 에러 해결하기] - [STS] java.lang.ClassNotFoundException 오류
[STS] java.lang.ClassNotFoundException 오류
h2 데이터베이스와 JDBC를 연결할 때 발생하는 오류 중 하나이다. 위와 같은 오류가 발생한다면 아래와 같이 해보자. 해결 방법 드라이버가 프로젝트 안에 있는지 확인해보도록 한다. 1) 프로젝트
myblog1128.tistory.com
'국비 지원 > JDBC' 카테고리의 다른 글
[JDBC] 간단한 게시판 구현해보기 (0) | 2023.06.11 |
---|---|
[JDBC] 트랜잭션 (0) | 2023.06.05 |
[JDBC] PreparedStatement를 사용한 데이터 추가, 삭제, 읽기, 수정하기 (0) | 2023.06.05 |