본문 바로가기
Back-End/Java

JDBC(1)

by newny 2023. 3. 27.
반응형

도메인 창에 홈디렉토리를 그대로 나타내지 않고 Context root로 나타냄
 
PreparedStatement.executeQuery() → SELECT문에서 사용
PreparedStatement.executeUpdate() → INSERT, UPDATE or DELETE문에서 사용
 

JDBC

DB연결

1. JDBC Driver 등록
JDBC Driver 클래스를 path에서 찾고, 메모리 로딩
→ 이 과정에서 JDBC Driver 클래스의 static 블록이 실행되면서 DriverManager에 JDBC객체를 등록하게됨

Class.forName("oracle.jdbc.OracleDriver");

2. 클래스를 찾지 못할경우 ClassNotFoundException 예외가 발생할 수 있기 때문에 예외처리 해야함
3. getConnection() 메소드로 DB와 연결

Connection conn = DriverManager.getConnection("연결 문자열", "사용자", "비밀번호")
// 연결문자열
// jdbc:oracle:thin:@IP주소:포트번호/DB명

4. 연결이 실패할 경우 SQLException이 발생하므로 예외처리를 해야함
 
[전체 코드]

package oracle;

import java.sql.*;

public class ConnectionExample {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            Class.forName("oracle.jdbc.OracleDriver");

            conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@IP주소:포트번호/DB명",
                    "사용자",
                    "비밀번호"
            );

            System.out.println("연결 성공");
 
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("연결끊기");
                } catch (SQLException e) {}
            }
        }
    }
}

 

INSERT문, UPDATE문, DELETE문 실행

1. String 타입으로 INSERT문 준비하기
→ ?(물음표)를 사용하여 매개변수화된 INSERT문으로 변경할 수도 있음

String sql = new StringBuilder();
sql.append("INSERT INTO users (userid, username, userpassword, userage, useremail)")
.append("VALUES (?, ?, ?, ?, ?)")
.toString();

// 또는 -----------------------------------------------------------------------------

String sql = "" +
"INSERT INTO users (userid, username, userpassword, userage, useremail)" +
"VALUES (?, ?, ?, ?, ?)"

2. Connection 클래스의 prepareStatement() 메소드에 매개변수로 INSERT문을 넣은 PreparedStatement 타입의 변수 생성

PreparedStatement pstmt = conn.prepareStatement(sql);

3. PreparedStatement 클래스의 Setter메소드를 이용해 ?(물음표) 에 들어갈 값을 지정
→ ?(물음표)는 순서에따라 1번부터 번호가 부여됨

pstmt.setString(1, "winter");
pstmt.setString(2, "한겨울");
pstmt.setString(3, "12345");
pstmt.setInt(4, 25);
pstmt.setString(5, "winter@mycompany.com");

4. 값을 지정한 후 executeUpdate() 메소드를 호출하여 SQL 문을 실행
→ executeUpdate() 메소드의 리턴값은 저장된 행 수(int) 임

int rows = pstmt.executeUpdate();
System.out.println("저장된 행 수:" + rows);

5. PreparedStatement를 더이상 사용하지 않을 경우에는 close()메소드를 호출해서 메모리 해제 시켜줌

pstmt.close();

6. UPDATE문, DELETE문도 같은 방법으로 진행
[전체 코드]

package oracle;

import java.sql.*;

public class ConnectionExample {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            Class.forName("oracle.jdbc.OracleDriver");

            conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@IP주소:포트번호/DB명",
                    "사용자",
                    "비밀번호"
            );

            System.out.println("연결 성공");
            /*
            String sql = ""
                        + "INSERT INTO users (userid, username, userpassword, userage, useremail) "
                        + "VALUES (?, ?, ?, ?, ?)";
            */
            String sql = new StringBuilder()
                    .append("INSERT INTO users (userid, username, userpassword, userage, useremail) ")
                    .append("VALUES (?, ?, ?, ?, ?)")
                    .toString();

            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "winter");
            pstmt.setString(2, "한겨울");
            pstmt.setString(3, "12345");
            pstmt.setInt(4, 25);
            pstmt.setString(5, "winter@mycompany.com");

            int rows = pstmt.executeUpdate();
            System.out.println("저장된 행 수:" + rows);

            pstmt.close();
 
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("연결끊기");
                } catch (SQLException e) {}
            }
        }
    }
}

 

SELECT문 실행

  • ResultSet 인터페이스 : select문을 실행한 결과(테이블)을 저장할 수 있게 해주는 자료형
  • 1개의 행만 조회할 때 → if문 사용
  • 여러개의 행을 조회할 때 → while문 사용

 
ResultSet 인터페이스의 next()메소드 원리

  1. 최초 커서는 값이 없는 첫줄에 커서가 위치함(beforeFirst 행)
  2. next()메소드를 사용하여 다음 줄(First 행)에 커서를 옮기고 그 곳에 값이 있는지 확인
  3. 읽을 값이 없을 때 까지 반복함
  4. 값이 없는 마지막 줄(afterLast 행)에 도달시 반복문 해제

[전체 코드]

import java.sql.*;

public class Test09_selectAll {
    public static void main(String[] args) {
        Connection conn = null; //db 연결
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(
                            "jdbc:oracle:thin:@IP주소:포트번호/DB명",
                            "사용자",
                            "비밀번호"
						);

            System.out.println("연결 성공");
            String sql = new StringBuilder()
                    .append("SELECT sno, uname, kor, eng, mat, tot, aver, addr, wdate ")
                    .append("FROM sungjuk ")
                    .append("ORDER BY sno desc")
                    .toString();

            PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();

            /* 한줄조회
            if(rs.next()) {
                System.out.print(rs.getInt("sno") + ", ");
                System.out.print(rs.getString("uname") + ", ");
                System.out.print(rs.getInt("kor") + ", ");
                System.out.print(rs.getInt("eng") + ", ");
                System.out.print(rs.getInt("mat") + ", ");
                System.out.print(rs.getInt("tot") + ", ");
                System.out.print(rs.getInt("aver") + ", ");
                System.out.print(rs.getString("addr") + ", ");
                System.out.println(rs.getString("wdate"));
                }
            */

            //여러행 조회
            while (rs.next()) {
                System.out.print(rs.getInt("sno") + ", ");
                System.out.print(rs.getString("uname") + ", ");
                System.out.print(rs.getInt("kor") + ", ");
                System.out.print(rs.getInt("eng") + ", ");
                System.out.print(rs.getInt("mat") + ", ");
                System.out.print(rs.getInt("tot") + ", ");
                System.out.print(rs.getInt("aver") + ", ");
                System.out.print(rs.getString("addr") + ", ");
                System.out.println(rs.getString("wdate"));
            }

            rs.close();
            pstmt.close();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) try {conn.close();} catch (SQLException e) {}
            System.out.println("연결 종료");
        }
    }
}
반응형

'Back-End > Java' 카테고리의 다른 글

JDBC(2)  (0) 2023.03.28
Java 복습, 예습  (0) 2023.03.26
Java 과제 - 성적표 파일 입출력  (0) 2023.03.23

댓글