ORACLE SQL

SQL JDBC 회원 관리 프로그램 _ INSERT

최종군 2024. 7. 31. 20:00

 

 

 

 

Model  getter/setter toString 포함 

public class Member {
    // 필드부  => 변수
    //  --> DB 테이블의 컬럼명과 매칭시켜서 정의
    private int userNo;    
    private String userId;     
    private String userPw;     
    private String userName;
    private String gender;  
    private int age;       
    private String email;   
    private String address; 
    private String phone;   
    private String hobby;   
    private Date enrollDate

 

 

 

시작 

1. 호출용 Run 메소드 

 

new MemberMenu().mainMenu();

 

 

 View  class 작성

 

 

View : 사용자가 보게 될 화면 (시각적인 요소들)

입력 및 출력을 담당 

 

필드부 : 

private Scanner sc = new Scanner(System.in);

private MemberController mc = new MemberController();

 

 

입력을 위한 Scanner 생성과 

 

사용자 요청을 처리하기 위한 

Controller 객체 생성  

 

메소드부 :

ppublic void mainMenu() {

    while(true) {

        System.out.println("========= 회원 관리 프로그램 =========");
        System.out.println("1. 회원 추가");       
        System.out.println("2. 전체 회원 조회");     
        System.out.println("3. 회원 아이디로 검색");    
        System.out.println("4. 회원 정보 수정");     
        System.out.println("5. 회원 탈퇴");       
        System.out.println("6. 회원 이름으로 키워드 검색");
        System.out.println("9. 프로그램 종료");

        System.out.print(">> 메뉴 번호: ");
        int menu = sc.nextInt();
        sc.nextLine();

        switch(menu) {
            case 1:
                addMenu();
                break;
            case 2:
                mc.selectList();
                break;
            case 3:
                searchById();
                break;
            case 4:
                updateMenu();
                break;
            case 5:
                deleteMember();
                break;
            case 6:
                searchByName();
                break;
            case 9:
                System.out.println("프로그램 종료합니다...");
                return;
        }
    }

}

 

 

 

 

입력 1번을 입력을 하면 

addMenu()  메소드로 이동을 한다. 

 

public void addMenu() {

    System.out.print("아이디 : ");
    String userId = sc.nextLine();

    System.out.print("비밀번호 : ");
    String userPw = sc.nextLine();

    System.out.print("이름 : ");
    String name = sc.nextLine();

    System.out.print("성별 (M/F) : ");
    String gender = sc.nextLine().toUpperCase();

    // 회원 추가 요청 --> Controller에게 요청
    mc.insertMember(userId, userPw, name, gender);
}

 

 

유저 아이디, 비밀번호, 이름, 성별을 입력을 받으면 

Controller에 있는 insertMember() 메소드로 매개변수 전달 

 

public void insertMember(String userId, String userPw, String name, String gender) {
    
    Member m = new Member(userId, userPw, name, gender);

    int result = new MemberService().insertMember(m);
    
    if (result > 0) {
        new MemberMenu().displaySuccess("회원 추가 성공!");
    } else {
        new MemberMenu().displayFailed("회원 추가 실패!");
    }
}

 

1. Member 클래스의 매개변수 생성자를 통해서

아이디, 비밀번호, 이름, 성별 매개변수를 전달 

 

 

2.int 형 변수 result에 MemberService 생성자를 통해서

insertMember() 메서드를 초기화 시켜준다 

Member 클래스의 객체변수 m을

insertMember() 매개변수로 넣어준다 

public Member(String userId, String userPw, String userName, String gender2) {
       this.userId = userId;
       this.userPw = userPw;
       this.userName = userName;
       this.gender = gender2;
   }

 

3. 해당 int형 변수는 

해당 작업이 정상적으로 완료가 되면 1을 

실패 시 0 혹은 -1을 반환하게 된다. 

 

1을 반환 시 if문 조건은 참이 되므로

MemberMenu메뉴에 있는 

displaySuccess에 문자열을 전달하게 된다

public void displaySuccess(String message) {
    System.out.println("서비스 요청 성공 : " + message);
}

 

 

0 혹은 -1을 반환 받게 될 경우 

 

new MemberMenu().displayFailed("회원 추가 실패!");

 

 

public void displayFailed(String message) {
    System.out.println("서비스 요청 실패 : " + message);
}

 

 


 

 

JDBCTemplate 클래스 : 

 

 

매번 반복적으로 사용한 코드들을 메소드 호출로 정의하기 위한 클래스이다 

(공용 템플릿) 

 

객체를 매번 생성하지 않고 메소드를 호출할 수 있도록

모든 메소드를 Static 메소드로 정의한다. 

 

- 싱클톤 패턴 : 메모리영역에 한 번만 올려두고 매번 재사용하는 패턴이다 

 

 

 

1. getConnection 메소드

public static Connection getConnection(){}

 

반환타입을 Connection을 준다. 

 

    public static Connection getConnection() {
        Connection conn = null;

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
                    ,"C##JDBC"
                    ,"JDBC");
         
            conn.setAutoCommit(false);
            
        }catch(ClassNotFoundException e) {
            e.printStackTrace();
        }catch(SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }



}

 

Class.forName()메서드를 사용하여

런타임에 클래스를 동적으로 저장한다 

 

OracleDriver가 클래스가 로드되면

이 클래스는 자체적으로 DriverManager에 등록이 된다 

 

conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
,"C##JDBC"
,"JDBC");

 

conn = DriverManager.getConnection(URL,사용자명계정,비밀번호)

 

DriverManager 드라이버 목록을 유지하며 목록을 사용하여 데이터베이스 연결 

 

conn.setAutoCommit(false);

기본적으로 자동관리이므로 수동관리를 위하여 꺼둔다 

 

} catch(ClassNotFoundException e) {
   e.printStackTrace();
} catch(SQLException e) {
  e.printStackTrace();
}
  return conn;
}

 

public static void commit(Connection conn){
    
    try {
        if(conn != null && !conn.isClosed()) {
            conn.commit();
        }

    }catch(SQLException e) {
        e.printStackTrace();
    }
}

 

if(conn != null && !conn,isClosed)

 

Connection 참조변수 conn이 null이 아니고 conn이 닫혀있지 않다면 

conn을 commit 해준다. 주로 DML 작업 시 사용된다. 

 

public static void rollback(Connection conn){

    try {

        //Connection 객체가 생성되어 있고 (null이 아니고) 닫혀있지 않을 떄  

        if(conn != null && !conn.isClosed()) {
            conn.rollback();
        }

    }catch(SQLException e) {
        e.printStackTrace();
    }
}

 

 

 

 

 

public static void close(Connection conn) {

    try {
        //Connection 객체가 생성되어 있고 (null이 아니고) 닫혀있지 않을 떄  

        if(conn != null && !conn.isClosed()) {
            conn.close();
        }

    }catch(SQLException e) {
        e.printStackTrace();
    }
}


public static void close(Statement stmt) {
    try {

        if(stmt != null && !stmt.isClosed()) {
            stmt.close();
        }
    }catch(SQLException e) {

        e.printStackTrace();
    }
}

/** ResultSet 객체를 close 처리해주는 메소드 
 */
public static void close(ResultSet rset) {
    try {

        if(rset != null && !rset.isClosed()) {
            rset.close();
        }
    }catch(SQLException e) {


    }       e.printStackTrace();
    }
}

 

 

자원해제를 위한 

메소드 생성 

 


 

 

MemberService 클래스 : 

 

 

 

 

MemberService는 기존 DAO 클래스에서 처리를 해주던

DB접속과 트랜잭션 처리를 해준다 

 

 

[1] Connection 객체 생성
   - jdbc driver 등록
 - Connection 객체 생성

 [2] DML문 실행 시 트랜잭션 처리
    - commit
- rollback

 [3] Connection 객체 반납
    - close

 

 

첫번째로

Service 클래스 작업은 

기존 DAO 클래스에서 해주던 작업을 대신 처리해준다 

 

 

 

public int insertMember(Member m){
    Connection conn = JDBCTemplate.getConnection();
    
    int result = new MemberDao().insertMember(conn,m);

    if(result > 0) {
        JDBCTemplate.commit(conn);
    }else {
        JDBCTemplate.rollback(conn);
    }
    JDBCTemplate.close(conn);

    return result;
}

 

1) Connection 객체 생성

Connection conn = JDBCTemplate.getConnection();

 

 

2)  DAO 클래스에 전달 받은 데이터(Member m)와 

Connection 객체를 전달하여 DB 처리 결과를 받기 

int result = new MemberDao().insertMember(conn,m);

 

 

3) DML(INSET) 실행 후 트랜잭션 처리

 

if(result > 0) {
JDBCTemplate.commit(conn);
}else {
JDBCTemplate.rollback(conn);
}

 

 

 4) Connection 객체 반납 
JDBCTemplate.close(conn);

 

return result;

 

 


 

MemberDao 클래스

 

public int insertMember(Connection conn, Member m) {


    String sql = "INSERT INTO MEMBER VALUES (SEQ_USERNO.NEXTVAL,"
            + "?, ?, ?, ?, ?, ?, ?, ?, ?,SYSDATE)";

    PreparedStatement pstmt = null;
    int result = 0;

    try {

        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, m.getUserId());
        pstmt.setString(2, m.getUserPw());
        pstmt.setString(3, m.getUserName());
        pstmt.setString(4, m.getGender());
        pstmt.setInt(5, m.getAge());
        pstmt.setString(6, m.getEmail());
        pstmt.setString(7, m.getAddress());
        pstmt.setString(8, m.getPhone());
        pstmt.setString(9, m.getHobby());

        result = pstmt.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        JDBCTemplate.close(pstmt);
    }


    return result;
}

 

 

1)  sql 구문 생성 : 

 

String sql = "INSERT INTO MEMBER VALUES (SEQ_USERNO.NEXTVAL,"
+ "?, ?, ?, ?, ?, ?, ?, ?, ?,SYSDATE)";

 

 

PreparedStatement 객체를 사용함으로 Statement 메소드의 setString메소드를 활용하므로 

?를 sql 구문에 삽입 

 

2) preparedStatement 객체 생성과 반환해줄 int 형 result try문 외부에 선언  

PreparedStatement pstmt = null;
int result = 0;

 

pstmt = null;로 선언

result = 0으로 선언을 한다 . 

 

 

try {

        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, m.getUserId());
        pstmt.setString(2, m.getUserPw());
        pstmt.setString(3, m.getUserName());
        pstmt.setString(4, m.getGender());
        pstmt.setInt(5, m.getAge());
        pstmt.setString(6, m.getEmail());
        pstmt.setString(7, m.getAddress());
        pstmt.setString(8, m.getPhone());
        pstmt.setString(9, m.getHobby());

        result = pstmt.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        JDBCTemplate.close(pstmt);
    }


    return result;
}

 

 

해당 메소드에서 

ResultSet을 사용하지 않는 이유

 

ResultSet 클래스는 주로 SELECT 쿼리의 결과를 처리할 때 사용이 된다 

UPDATE, INSERT, DELETE와 같은 데이터 수정 작업에서는 ResultSet이 필요하지 않다

 

1) pstmt = conn.prepareStatement() 에 sql 구문을 삽입 

2) 순서에 맞게 setXXX 타입 적용

3) result = pstmt.executeUpdate() 메소드 사용 

executeUpdate() 데이터를 추가하므로 executeUpdate(); 를 사용한다. 

 

 

'ORACLE SQL' 카테고리의 다른 글

SQL 아침 복습 자료 문제 풀이_2  (0) 2024.08.01
SQL 아침 복습 자료 문제 풀이  (1) 2024.08.01
ORACLE SQL DCL/TCL , view  (0) 2024.07.31
ORACLE SQL JAVA 적용 시키기  (0) 2024.07.30
ORACLE SQL DDL 복습 내용 정리  (0) 2024.07.30