코코무의 코딩캔버스
[JDBC] JDBC 사용을 위한 코드 작성 방법 본문
자바와 데이터베이스 또는 JSP와 데이터베이스가 연동되기 위해서는 단계를 거쳐 접속과 해제를 진행해야 한다.
일반적으로 JDBC를 이용하는 프로그램을 작성하려면 5단계의 과정으로 작성한다.
java 파일과 jsp 파일에서 사용 가능하다. 하지만 jsp에서 사용하는 것은 공부할 때 배우고 넘어가는 MVC1 모델 방식이다.
1단계: JDBC 드라이버 로드
프로그램에서 데이터베이스에 연결하기 위해서는 데이터베이스별 제조사(Vendor)가 제공하는 드라이버가 필요하다.
드라이버를 설정하는 방법은 다음과 같다.
Class.forName("드라이버명");
데이터베이스 종류별로 드라이버명이 다르다.
드라이버 소환술이다.
- 드라이버 종류
종류 | 사용 방법 |
Access(ODBC) | Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") |
MS-SQL | Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver") |
Oracle | Class.forName("oracle.jdbc.driver.OracleDriver"); |
MySQL | Class.forName("com.mysql.jdbc.Driver") |
2단계: 데이터베이스 연결 객체 생성
1단계에서 사용할 드라이버를 설정했다면 2단계에서는 Connection 클래스로 연결 객체를 생성해야 한다.
작성 방법은 다음과 같다.
Connection 객체
Connection conn = null;
try {
Class.forName("드라이버명");
conn = DriverManager.getConnection("URL", "USER명", "패스워드");
// 쿼리문 관련 코드 삽입
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
url, user, password는 DB 관리 도구에서 DBMS와 연결할 때 설정되는 정보를 사용한다.
- 데이터베이스별 URL
종류 | 사용 방법 |
Access(ODBC) | jdbc:odbc:ODBC명 |
MS-SQL | jdbc:mysql://localhost:3306/DB명 |
Oracle | jdbc:oracle://localhost:1521:SID |
MySQL | jdbc:Microsoft:sqlserver://localhost:1433:databasename=DB명 |
3단계: SQL문 실행
프로그램에서 데이터베이스에 쿼리문을 전송하고 결괏값을 반환하는 단계이다.
Statement 객체 또는 PreparedStatement 객체를 이용하여 SQL 구문을 전송할 수 있다.
선택문 executeQuery(); : ResultSet → select
변환문 executeUpdate(); : int → insert, update, delete, create
DB 관리 도구의 실행(alt+x)같은 것이라고 여기면 된다.
1. Statement 객체의 작성 방법
Statement 객체
Statement stmt = null;
stmt = conn.createStatement();
String sql = "SQL구문 작성";
int n = stmt.executeUpdate(sql);
1) stmt = conn.createStatement()는 데이터베이스로 SQL문을 보내기 위한 연결 객체를 만든다.
2) 연결 객체가 완성되었으면 stmt.executeUpdate(sql)를 이용해서 데이터베이스에 쿼리문을 전송한다.
3) 처리에 따른 결괏값을 반환 받는다(이때 반환받을 객체(또는 변수)는 ResultSet 또는 int).
4) Statement는 쿼리문 사이사이에 데이터를 연결해서 작성한다. Statement는 보안에 취약하다는 단점을 가지고 있다.
2. Statement의 SQL구문 작성 방법
String sql =
"insert into book(isbn, title, author, price) values(101, 'HTML5', '강둘리', 25000)";
String sql =
"insert into book(isbn, title, author, price) values("+ a +",'"+ b +"','"+ c + "'," + d + ")";
3. PreparedStatement 객체의 작성 방법
PreparedStatement 객체
PreparedStatement pstmt = null;
String sql = "SQL구문 작성";
pstmt = conn.preparedStatement(sql);
pstmt.setString(index번호, 데이터);
pstmt.setString(index번호, 데이터);
pstmt.setString(index번호, 데이터);
int n = pstmt.executeUpdate();
4. PreparedStatement의 SQL구문 작성 방법
String sql =
"insert into book(isbn, title, author, price) values(101, 'HTML5', '강둘리', 25000");
String sql =
"insert into book(isbn, title, author, price) values(?,?,?,?)";
pstmt.setInt(1,a); // a = 101
pstmt.setString(2,b); // b = "HTML5"
pstmt.setString(3,c); // c = "강둘리"
pstmt.setInt(4,d); // d = 25000
a는 ISBN, b는 TITLE, c는 AUTHOR, d는 PRICE
4단계: 결과 반환
ResultSet 객체와 int
ResultSet rs = stmt.executeQuery();
int n = stmt.executeUpdate();
ResultSet rs = executeQuery()는 select 쿼리문의 결과 집합(테이블)을 가져온다. Cursor의 위치를 이동해서 행(Row)을 가리킨다.
데이터는 getter 메서드를 이용해서 가져온다.
int n = executeUpdate()는 처리된 결과의 개수를 반환한다(입력된 결과의 개수, 수정된 결과의 개수, 삭제된 결과의 개수).
따라서, executeUpdate()는 쿼리문 중 insert, update, delete, create에 적용하는 메서드(select문 제외)이다.
5단계: 데이터베이스와 연결 해제
프로그램에서 데이터베이스와 모든 작업이 끝나면 연결을 해제한다.
가장 최근에 열었던 연결부터 순서대로 닫아준다.
rs.close();
stmt.close();
conn.close();
이렇게 함으로써 리소스 누수를 방지하고, 데이터베이스 성능을 최적화하며, 보안 문제를 최소화한다.
쿼리문 예시
1. SELECT
SELECT문을 사용할 때는 ResultSet 객체를 사용한다.
사용할 쿼리문을 담은 PreparedStatement 객체를 실행하기 위해 executeQuery() 메서드를 호출하여 ResultSet 객체에 담는다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelectExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase"; // 데이터베이스 URL
String username = "root"; // 데이터베이스 사용자명
String password = "password"; // 데이터베이스 비밀번호
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1. JDBC 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 데이터베이스 연결
conn = DriverManager.getConnection(url, username, password);
// 3. SQL 쿼리 실행
String sql = "SELECT id, name, email FROM users WHERE id = ?";
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 1); // 첫 번째 파라미터로 id 값을 설정 (예: 1)
rs = preparedStatement.executeQuery();
// 4. 결과 처리
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 5. 리소스 해제
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
결과 처리 부분을 유의깊게 봐야 한다.
2. INSERT문
여기서부터는 쿼리문 실행 시 executeQuery() 메서드가 아닌 executeUpdate() 메서드를 사용한다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCInsertExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase"; // 데이터베이스 URL
String username = "root"; // 데이터베이스 사용자명
String password = "password"; // 데이터베이스 비밀번호
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 1. JDBC 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 데이터베이스 연결
connection = DriverManager.getConnection(url, username, password);
// 3. SQL 쿼리 준비
String sql = "INSERT INTO PRODUCT (PRODUCT_CD, PRODUCT_NM, PRICE) VALUES (?, ?, ?)";
preparedStatement = connection.prepareStatement(sql);
// 4. 파라미터 설정
preparedStatement.setString(1, "P001"); // 제품 코드
preparedStatement.setString(2, "Product Name"); // 제품 이름
preparedStatement.setDouble(3, 100.0); // 제품 가격
// 5. SQL 쿼리 실행
int rowsAffected = preparedStatement.executeUpdate();
System.out.println("Rows affected: " + rowsAffected);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 6. 리소스 해제
try {
if (preparedStatement != null) preparedStatement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3. UPDATE문
UPDATE문에서는 특히 콤마(,) 실수가 많았다. 주의하도록 하자!
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCUpdateExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase"; // 데이터베이스 URL
String username = "root"; // 데이터베이스 사용자명
String password = "password"; // 데이터베이스 비밀번호
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 1. JDBC 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 데이터베이스 연결
connection = DriverManager.getConnection(url, username, password);
// 3. SQL 쿼리 준비
String sql = "UPDATE PRODUCT SET PRODUCT_NM = ?, PRICE = ? WHERE PRODUCT_CD = ?";
preparedStatement = connection.prepareStatement(sql);
// 4. 파라미터 설정
preparedStatement.setString(1, "Updated Product Name"); // 변경할 제품 이름
preparedStatement.setDouble(2, 150.0); // 변경할 제품 가격
preparedStatement.setString(3, "P001"); // 대상 제품 코드
// 5. SQL 쿼리 실행
int rowsAffected = preparedStatement.executeUpdate();
System.out.println("Rows affected: " + rowsAffected);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 6. 리소스 해제
try {
if (preparedStatement != null) preparedStatement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4. DELETE문
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCDeleteExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase"; // 데이터베이스 URL
String username = "root"; // 데이터베이스 사용자명
String password = "password"; // 데이터베이스 비밀번호
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// 1. JDBC 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 데이터베이스 연결
connection = DriverManager.getConnection(url, username, password);
// 3. SQL 쿼리 준비
String sql = "DELETE FROM PRODUCT WHERE PRODUCT_CD = ?";
preparedStatement = connection.prepareStatement(sql);
// 4. 파라미터 설정
preparedStatement.setString(1, "P001"); // 삭제할 제품 코드
// 5. SQL 쿼리 실행
int rowsAffected = preparedStatement.executeUpdate();
System.out.println("Rows affected: " + rowsAffected);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 6. 리소스 해제
try {
if (preparedStatement != null) preparedStatement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
'JDBC' 카테고리의 다른 글
[JDBC&JSP/MySQL] mysql-connector를 사용한 이클립스 연동 및 세팅 (0) | 2024.07.22 |
---|---|
[JDBC] Statement와 PreparedStatement의 차이점 (0) | 2024.07.16 |
[JDBC/Oracle] ojdbc를 사용한 이클립스 연결 및 셋팅 순서 (0) | 2024.01.17 |
[JDBC/Oracle] Eclipse에서의 JDBC 사용을 위한 사전 준비(오라클) (0) | 2024.01.16 |