1. Statement 방식
package com.test01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class MTest03 {
public static void main(String[] args) {
try {
selectOne();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void selectOne() throws ClassNotFoundException, SQLException {
Scanner sc = new Scanner(System.in);
System.out.println("부서번호를 입력하세요 : ");
int deptno = sc.nextInt();
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "cine";
String password = "cine";
Connection con = DriverManager.getConnection(url, user, password);
String sql = " SELECT * FROM DEPT WHERE DEPTNO = " + deptno;
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getInt("DEPTNO") + " \t " + rs.getString(2) + " \t " + rs.getString(3));
}
rs.close();
stmt.close();
con.close();
}
}
우선 JDBC에서 예외처리는 필수입니다!
위의 코드에서는 throws했지만 사실try/catch를 하는게 조금더 좋다고해요!
그래서 이왕이면 try/catch 해주세요!
또 selectOne메소드를 보면 전체 데이터를 출력하는 코드와 JDBC의 5가지 단계는 똑같습니다.
Scanner sc = new Scanner(System.in);
System.out.println("부서번호를 입력하세요 : ");
int deptno = sc.nextInt();
Driver연결전 출력할 데이터의 deptno를 먼저 입력받아주었네요!
// 1. Driver 연결
Class.forName("oracle.jdbc.driver.OracleDriver");
Driver 연결입니다. Class.forName(""); 꼭 기억하셔야합니다!
//2. 계정 연결
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "cine";
String password = "cine";
Connection con = DriverManager.getConnection(url, user, password);
url과 사용자 패스워드는 pc마다 차이가있으니 각자의 것을 입력해주세요!
지금은 throws를 하였기에 Connection 과정을 한번에 했습니다.
//3. Query준비
String sql = " SELECT * FROM DEPT WHERE DEPTNO = " + deptno;
Statement stmt = con.createStatement();
sql에서 부서번호에 따른 모든 데이터를 출력하기 위한 명령이 SELECT * FROM DEPT WHERE DEPTNO = 10과 같았습니다.
* 표시는 JDBC에서 기능은 하지만 이후 코드를 볼때 알아보기 힘들수 있으니 컬럼이름을 적는것을 추천드립니다!
위 코드에서는 Statement 방식을 사용하였습니다!
//4. Query실행 및 리턴
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getInt("DEPTNO") + " \t " + rs.getString(2) + " \t " + rs.getString(3));
}
ResultSet은 출력을 위해 사용한다고 볼 수 있습니다.
select이외의 insert, update, delete 명령에서는 출력이 필요없이 명령의 내용만 수행하기 때문에 select명령에서는 ResultSet이 반드시 필요합니다!
해당 과정은 준비된 Query문을 실행하고 결과를 리턴 받게됩니다.
rs.close();
stmt.close();
con.close();
마지막 단계로 DB를 역순으로 순차적 종료합니다.
2. PreparedStatement 방식
package com.test01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class MTest03 {
public static void main(String[] args) {
try {
selectOne();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void selectOne() throws ClassNotFoundException, SQLException {
Scanner sc = new Scanner(System.in);
System.out.println("부서번호를 입력하세요 : ");
int deptno = sc.nextInt();
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "cine";
String password = "cine";
Connection con = DriverManager.getConnection(url, user, password);
String sql = " SELECT * FROM DEPT WHERE DEPTNO = ? ";
PreparedStatement pstm = con.prepareStatement(sql);
pstm.setInt(1, deptno);
ResultSet rs = pstm.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("DEPTNO") + " \t " + rs.getString(2) + " \t " + rs.getString(3));
}
rs.close();
pstm.close();
con.close();
}
}
PreparedStatement방식도 Driver연결과 계정연결은 Statement방식과 차이가 없습니다.
// 3. Query 준비
String sql = " SELECT * FROM DEPT WHERE DEPTNO = ? ";
PreparedStatement pstm = con.prepareStatement(sql);
pstm.setInt(1, deptno);
쿼리 준비 단계에서 sql 명령문을 보면 ?가 있고 pstm.setInt로 값을 넣어주었습니다.
(1, deptno)의 뜻은 1번째 ?에 입력받았던 deptno를 넣어주겠다라는 뜻으로 해석할수 있습니다.
만약 Scanner로 20이라는 숫자를 deptno 변수에 입력을 받았다면 sql문의 명령은
SELECT * FROM DEPT WHERE DEPTNO = 20;
이 됩니다.
// 4. Query 실행 및 리턴
ResultSet rs = pstm.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("DEPTNO") + " \t " + rs.getString(2) + " \t " + rs.getString(3));
}
Select명령이 아니라 다른 명령이었다면 쿼리를 실행만 하고 리턴 받을 필요가 없습니다,
하지만 select 명령에서는 쿼리를 실항하고 원하는 값을 리턴받기위해 ResultSet을 사용합니다.
// 5. DB 종료
rs.close();
pstm.close();
con.close();
DB종료 단계는 Statement방식과 마찬가지로 실행된 순서의 역순으로 종료해줍니다.
'Java 관련 > JDBC' 카테고리의 다른 글
[JDBC] MVC 패턴(Model View Controller) (0) | 2022.03.06 |
---|---|
[JDBC] delete(데이터 삭제) (0) | 2022.03.05 |
[JDBC] update(데이터 수정) (0) | 2022.03.04 |
[JDBC] Statement & PreparedStatement (0) | 2022.03.01 |
[JDBC] JDBC(Java DataBase Connectivity)연결순서 (0) | 2022.02.28 |