JDBC를 이용한 데이터 베이스 처리 순서
- 드라이버 로딩 => 라이브러리를 사용할 수 있게 메모리로 읽어 들이는 작업
Class.forName("oracle.jdbc.driver.OracleDriver"); - DB에 접속하기 => 접속이 완료되면 Connection객체가 반환된다.
DriverManager.getConnection()메서드를 이용한다
커넥션 객체 = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe",user, password); - 질의 => SQL문장을 DB서버로 보내서 처리하고, 처리한 결과를 얻어온다
(Statement객체 PreparedStatement 객체를 이용하여 작업한다)
State 객체 = 커넥션객체.createStatement(); - 결과처리 => 질의 결과를 받아서 원하는 작업을 수행한다.
1) SQL문이 select문일 경우
- select문을 처리한 결과가 ResultSet객체에 저장되어 반환한다.
ResultSet객체 = State객체.executeQuery("sql문장");
2) SQL문이 select문이 아닐 경우 (update, delete, insert 등)
- SQL문의 처리 결과가 정수값으로 반환된다. ( 이 정수 값은 실행해 성공한 레코드 수를 의미한다 )- Statement
Statement객체 = Connection객체.createStatement();
Statement객체.executeUpdate(sql); / executeQuery(sql);
(해석을 그때 그때하여 속도가 느림) - PreparedStatement
SQL문을 작성할 때 SQL문에서 데이터가 들어갈 자리를 물음표(?)로 표시해서 작성한다
PreparedStatement객체 = Connection객체.prepareStatement(sql);
PreparedStatement객체.executeUpdate() / executeQuery()
SQL문의 물음표(?)자리에 들어갈 데이터를 세팅한다
PreparedStatement객체.set자료형이름(물음표번호, 데이터);
(해석을 미리 하여 속도가 빠름, 똑같은 반복작업을 할 경우 preparedStatement를 활용하기)
excuteUpdate()의 반환값
> 작업에 성공한 레코드 수
- Statement
- 출력
- ResultSet객체.next() 이용하기
ResultSet객체의 데이터를 가르키는 포인터를 다음 번 째 레코드로 이동시키고
그곳에 데이터가 있으면 true 없으면 false 를 반환 - 자료를 가져오는 방법
ResultSet객체.get자료형이름("컬럼명" 또는 "alias명")
ResultSet객체.get자료형이름(컬럼번호) > 컬럼번호는 1부터 시작 - ResultSetMetaDate객체 활용하는법
ResultSet객체.getMetaData()를 통해 메타데이터 객체를 생성한 뒤
메타데이터를 활용하여 전체 칼럼 번호를 가져옴 > 메타데이터객체.getColumnCount();
반복문을 이용해 출력
(컬럼 이름은 메타데이터객체.getColumnName(인덱스) )
- ResultSet객체.next() 이용하기
- 사용했던 자원 반납하기 => 각 자원의 close()메서드를 이용한다.
try-catch문에 finally에 작성하기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
// JDBC( Java DataBase Connectivity )라이브러리를 이용한 DB자료 처리하기
public class JdbcTest01 {
public static void main(String[] args) {
// DB작업에 필요한 변수 선언
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2. DB연결
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","JIN96", "java");
// 3. 질의
// 3-1 SQL문 작성
String sql = "select * from lprod";
// 3-2 Statement 객체 생성 (질의를 처리하는 객체 생성)
stmt = conn.createStatement();
// 3-3. SQL문을 DB서버로 보내서 처리하고 결과를 얻어온다.
// (실행할 SQL문이 select문이기 떄문에 결과가 ResultSet객체에 저장되어 반환된다.)
rs = stmt.executeQuery(sql);
// 4. 결과 처리 => 한 레코드씩 화면에 출력하기
// ResultSet에 저장된 데이터를 차례로 꺼내오려면 반복문과 next() 메서드를 이용한다.
// ResultSet객체의 next() 메서드 => ResultSet객체의 데이터를 가르키는 포인터를
// 다음 번째 레코드로 이동시키고 그곳에 데이터가 있으면 true
// 데이터가 없으면 false를 반환한다.
while(rs.next()) {
// 포인터가 가리키는 곳의 자료를 가져오는 방법
// 형식1) ResultSet객체.get자료형이름("컬럼명" 또는 "alias명")
// 형식2) ResultSet객체.get자료형이름(컬럼번호)
// ==> 컬럼번호는 1부터 시작된다
System.out.println("Lprod_id : "+rs.getInt("lprod_id"));
System.out.println("Lprod_gu : "+rs.getString(2));
System.out.println("Lprod_nm : "+rs.getString("LPROD_NM"));
System.out.println("-------------------------------------");
}
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 5. 자원 반납
// 순서 반들어진 순서의 반대 ResultSet > State > Connection
if(rs!=null) try {rs.close(); } catch(SQLException e) {}
if(stmt!=null) try {stmt.close(); } catch(SQLException e) {}
if(conn!=null) try {conn.close(); } catch(SQLException e) {}
}
}
}
문제
사용자로부터 Lprod_id 값을 입력받아 입력한 값보다
Lprod_id가 큰 자료들을 출력하시오.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class JdbcTest02 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JIN96", "java");
System.out.print("Lprod_id >> ");
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
String sql = "select * from lprod where lprod_id > "+ num;
System.out.println();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
// 컬럼 갯수를 가져오기 위해서 ResultSetMetaDate 객체를 생성
ResultSetMetaData rsmd = rs.getMetaData();
int col = rsmd.getColumnCount();
System.out.println("lprod_id가 "+num+"보다 큰 자료들..");
System.out.println("===================================");
while(rs.next()) {
for(int i=1; i<=col; i++) { // 컬럼 인덱스는 1부터 시작!!
System.out.println(rsmd.getColumnName(i) + " : " + rs.getString(i));
}
// System.out.println("Lprod_id : " + rs.getString(1));
// System.out.println("Lprod_gu : " + rs.getString(2));
// System.out.println("Lprod_nm : " + rs.getString(3));
System.out.println("---------------------------------");
}
System.out.println("===================================");
} catch (SQLException e) {
// TODO: handle exception
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs!=null) try {rs.close();} catch(SQLException e){}
if(stmt!=null) try {stmt.close();} catch(SQLException e){}
if(conn!=null) try {conn.close();} catch(SQLException e){}
}
}
}
문제 2
lprod_id값을 2개 입력 받아서 두 값 중 작은 값부터 큰 값 사이의 자료들을 출력하시오
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Scanner;
public class JdbcTest03 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","JIN96", "java");
Scanner scan = new Scanner(System.in);
int[] num = new int[2];
System.out.print("lprod_id 번호 입력 >> ");
num[0] = scan.nextInt();
System.out.print("lprod_id 번호 입력 >> ");
num[1] = scan.nextInt();
Arrays.sort(num);
// int num1 = scan.nextInt();
// int num2 = scan.nextInt();
// int max = Math.max(num1, num2);
// int min = Math.min(num1, num2);
// Statement
/*
stmt = conn.createStatement();
// String sql = "select * from lprod where lprod_id >= "+num[0]+" and lprod_id <= "+num[1];
String sql = "select * from lprod where lprod_id between "+num[0]+" and "+num[1];
rs = stmt.executeQuery(sql);
*/
// PrepareStatement
String sql = "select * from lprod where lprod_id between ? and ?";
pstmt = conn.prepareStatement(sql);
for(int i=0; i<num.length;i++) {
pstmt.setInt(i+1, num[i]);
}
rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int col = rsmd.getColumnCount();
System.out.println("lprod_id가 "+num[0]+"이상이고 "+num[1]+"이하인 데이터..");
System.out.println("=====================================================");
while(rs.next()) {
for(int i=1; i<=col ; i++) {
System.out.println(rsmd.getColumnName(i)+" : "+rs.getString(i));
}
System.out.println("----------------------------");
}
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(rs!=null) try {rs.close();} catch(SQLException e) {}
if(stmt!=null) try {stmt.close();} catch(SQLException e) {}
if(conn!=null) try {conn.close();} catch(SQLException e) {}
}
}
}
INSERT/ UPDATE/ DELETE
executeUpdate()
반환값 int (변환된 행 갯수)
package kr.or.ddit.basic;
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 JdbcTest04 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JIN96", "java");
System.out.println("계좌 번호 정보 추가하기");
System.out.print("계좌 번호 입력 >> ");
String bankNo = scan.next();
System.out.print("은행명 입력 >> ");
String bankName = scan.next();
System.out.print("예금주 이름 입력 >> ");
String userName = scan.next();
/*
// Statement 객체를 이용하여 처리
stmt = conn.createStatement();
String sql = "insert into bankinfo(bank_no, bank_name, bank_user_name, bank_date) values('"+bankNo+"', '"+bankName+"', '"+userName+"', sysdate)";
// SQL문을 DB서버로 보내서 실행할 때 SQL문이 select문일 경우에는
// excuteQuery() 메서드를 사용했는데
// select문이 아닌 SQL문을 실행할 때는 executeUpdate()메서드를 사용한다
// excuteUpdate()메서드의 반환값 => 작업에 성공한 레코드 수
int cnt = stmt.executeUpdate(sql);
System.out.println("반환 값 cnt : "+cnt);
*/
// PreparedStatement 객체를 이용하여 처리하기
// SQL문을 작성할 때 SQL문에서 데이터가 들어갈 자리를 물음표(?)로 표시해서 작성한다
String sql = "insert into bankinfo(bank_no, bank_name, bank_user_name, bank_date) values(?, ?, ?, sysdate)";
pstmt = conn.prepareStatement(sql);
// SQL문의 물음표(?)자리에 들어갈 데이터를 세팅한다
// 형식 ) PreparedStatement객체.set자료형이름(물음표번호, 데이터)
// pstmt.setString(1, bankNo);
// pstmt.setString(2, bankName);
// pstmt.setString(3, userName);
// 배열을 사용하여 파라미터 세팅
String[] values = {bankNo, bankName, userName};
for (int i = 0; i < values.length; i++) {
pstmt.setString(i + 1, values[i]);
}
int cnt = pstmt.executeUpdate();
System.out.println("반환 값 cnt : "+cnt);
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(pstmt!=null) try {pstmt.close();} catch(SQLException e) {}
if(stmt!=null) try {stmt.close();} catch(SQLException e) {}
if(conn!=null) try {conn.close();} catch(SQLException e) {}
}
}
}
'JAVA > HIGH JAVA' 카테고리의 다른 글
[JAVA] JDBC - util생성, 활용 (0) | 2024.05.16 |
---|---|
5/13 Homework - lprod테이블 추가 (0) | 2024.05.13 |
[JAVA] 네트워킹 - UDP (0) | 2024.05.10 |
[JAVA] 멀티 채팅 (0) | 2024.05.10 |
과제 - POI 라이브러리 (0) | 2024.05.10 |