티스토리 뷰

KH

230322 JDBC TEST

十月 2023. 3. 22. 17:41

Member(model.vo)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package com.kh.model.vo;
 
import java.sql.Date;
 
public class Member {
    String memberId;
    String memberPwd;
    String memberName;
    char gender;
    String email;
    String phone;
    String address;
    int age;
    Date enrollDate; // (java.sql으로 import)
 
    public Member() {
    }
 
    public Member(String memberId, String memberPwd, String memberName, char gender, String email, String phone,
            int age, String address, Date enrollDate) {
        this.memberId = memberId;
        this.memberPwd = memberPwd;
        this.memberName = memberName;
        this.gender = gender;
        this.email = email;
        this.phone = phone;
        this.address = address;
        this.age = age;
        this.enrollDate = enrollDate;
    }
 
    public Member(String memberId, String memberPwd, String memberName, char gender, String email, String phone,
            int age, String address) {
        this.memberId = memberId;
        this.memberPwd = memberPwd;
        this.memberName = memberName;
        this.gender = gender;
        this.email = email;
        this.phone = phone;
        this.age = age;
        this.address = address;
    }
 
    public String getMemberId() {
        return memberId;
    }
 
    public void setMemberId(String memberId) {
        this.memberId = memberId;
    }
 
    public String getMemberPwd() {
        return memberPwd;
    }
 
    public void setMemberPwd(String memberPwd) {
        this.memberPwd = memberPwd;
    }
 
    public String getMemberName() {
        return memberName;
    }
 
    public void setMemberName(String memberName) {
        this.memberName = memberName;
    }
 
    public char getGender() {
        return gender;
    }
 
    public void setGender(char gender) {
        this.gender = gender;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    public String getPhone() {
        return phone;
    }
 
    public void setPhone(String phone) {
        this.phone = phone;
    }
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public Date getEnrollDate() {
        return enrollDate;
    }
 
    public void setEnrollDate(Date enrollDate) {
        this.enrollDate = enrollDate;
    }
 
    @Override
    public String toString() {
        return memberId + ", " + memberPwd + ", " + memberName + ", " + gender + ", " + email + ", " + phone + ", "
                + address + ", " + age + ", " + enrollDate;
    }
}
 
cs

JDBCTemplate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.kh.common;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class JDBCTemplate {
 
    private static Connection conn = null;
    // 싱글톤 패턴
    // : 프로그램 구동 시 메모리에 객체를 딱 한 개만 기록되게 하는 디자인 패턴으로써
    //      모든 필드와 메소드를 static으로 선언, 생성자는 private으로 만듦        ▷ 싱글톤을 좀 따오자.
    //      static 영역에 공용으로 사용할 수 있는 단 하나의 객체를 만드는 셈)
    
    public JDBCTemplate() {}
 
    // JDBC 드라이버 등록
    // DB연결 Connection 객체 생성
    public static Connection getConnection() {
        
        if(conn == null) { // 연결되지 않았으면
            try {                                // 드라이버 등록
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl""JDBC""JDBC");
                conn.setAutoCommit(false);                            // 계정 연결
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            
        }
        return conn;
    }
 
    // commit, rollback
    public static void commit(Connection conn) {
        try {
            if(conn != null && !conn.isClosed()) {
                conn.commit();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    public static void rollback(Connection conn) {
        try {
            if(conn != null && !conn.isClosed()) {
                conn.rollback();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    // close
    public static void close(Connection conn) {
        
        try {
            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();
        }
    }
    
    public static void close(ResultSet rset) {
        try {
            if(rset != null && !rset.isClosed()) {
                rset.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
 
cs

Menu(View)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
package com.kh.view;
 
import java.util.ArrayList;
import java.util.Scanner;
 
import com.kh.controller.MemberController;
import com.kh.model.vo.Member;
 
public class MemberMenu {
 
    private Scanner sc = new Scanner(System.in);
 
    public void mainMenu() {
 
        MemberController mc = new MemberController(); // 컨트롤러 객체 생성
        int select = 0;
 
        do {
            System.out.println("\n *** 회원 관리 프로그램 ***\n");
            System.out.println("1. 새 회원 등록");
            System.out.println("2. 모든 회원 조회");
            System.out.println("3. 특정 조건 회원 조회");
            System.out.println("4. 회원 정보 수정");
            System.out.println("5. 회원 탈퇴");
            System.out.println("0. 프로그램 종료");
            System.out.print("번호 선택 : ");
 
            select = Integer.parseInt(sc.nextLine());
 
            switch (select) {
            case 1:
                mc.insertMember();
                break;
            case 2:
                mc.selectAll();
                break;
            case 3:
                mc.selectMember();
                break;
            case 4:
                mc.updateMember();
                break;
            case 5:
                mc.deleteMember();
                break;
            case 0:
                System.out.println("프로그램을 종료합니다."); mc.exitProgram();
                break;
            default:
                System.out.println("잘못된 번호입니다. 다시 입력해주세요.");
            }
        } while (select != 0); // 입력받은 번호가 0이면 false = 멈춤
 
    }
 
    public void displayMember(ArrayList<Member> list) {
//        for(int i = 0; i < list.size(); i++) {
//            System.out.println(list.get(i));
//        }
        System.out.printf("%-10s %-10s %-5s %-5s %-20s %-15s %-4s %-24s %-15s\n""ID""PWD""NAME""GENDER",
                "EMAIL""PHONE""AGE""ADDRESS""ENROLLDATE");
 
        for (Member m : list) {
            System.out.printf("%-10s %-10s %-5s %-5c %-20s %-15s %-4d %-20s %-15s\n", m.getMemberId(), m.getMemberPwd(),
                    m.getMemberName(), m.getGender(), m.getEmail(), m.getPhone(), m.getAge(), m.getAddress(),
                    m.getEnrollDate());
        }
    }
 
    public void displayError(String string) {
        System.out.println("서비스 요청 실패 : " + string);
    }
 
    public Member insertMember() { // 반환 타입을 적었기 때문에 Member로 나옴.
        System.out.print("회원 아이디 : ");
        String memberId = sc.nextLine();
 
        System.out.print("회원 비밀번호 : ");
        String memberPwd = sc.nextLine();
 
        System.out.print("회원 이름 : ");
        String memberName = sc.nextLine();
 
        System.out.print("성별(M/F) : ");
        char gender = sc.nextLine().toUpperCase().charAt(0);
 
        System.out.print("이메일 : ");
        String email = sc.nextLine();
 
        System.out.print("전화번호(-포함) : ");
        String phone = sc.nextLine();
 
        System.out.print("주소 : ");
        String address = sc.nextLine();
 
        System.out.print("나이 : ");
        int age = Integer.parseInt(sc.nextLine());
 
        Member m = new Member(memberId, memberPwd, memberName, gender, email, phone, age, address);
 
        return m;
    }
 
    public void displaySuccess(String string) {
        System.out.println("서비스 요청 성공 : " + string);
    }
 
    public int selectMember() {
        int sel = 0;
 
        while (true) { // 제대로 입력할 때까지 돌아감
            System.out.println("1. 아이디로 회원 조회");
            System.out.println("2. 성별로 회원 조회");
            System.out.println("0. 메인 메뉴로 돌아가기");
            System.out.print("번호 선택 : ");
            sel = Integer.parseInt(sc.nextLine());
 
            switch (sel) {
            case 1:
            case 2:
            case 0:
                return sel; // ?
            default:
                System.out.println("잘못 입력했습니다. 다시 입력해주세요.");
            }
        }
    }
 
    public String inputMemberId() {
        System.out.print("회원 아이디 : ");
        String id = sc.nextLine();
        return id;
    }
 
    public char inputGender() {
        System.out.print("성별(M/F) : ");
        char gen = sc.nextLine().toUpperCase().charAt(0);
        return gen;
    }
 
    public int updateMember() {
        System.out.println("\n *** ID가 확인되었습니다. ***\n");
 
        int sel = 0;
        while (true) {
            System.out.println("1. 비밀번호 변경");
            System.out.println("2. 이메일 변경");
            System.out.println("3. 전화번호 변경");
            System.out.println("4. 주소 변경");
            System.out.println("0. 메인 메뉴로 돌아가기");
            System.out.print("번호 선택 : ");
            sel = Integer.parseInt(sc.nextLine());
 
            switch (sel) { // controller로 반환
            case 1:
            case 2:
            case 3:
            case 4:
            case 0:
                return sel;
            default:
                System.out.println("잘못 입력하셨습니다. 다시 입력해주세요.");
            }
 
        }
    }
 
    public String inputUpdate() {
        System.out.print("수정 값 입력 : ");
        String input = sc.nextLine();
        return input;
    }
 
    public char deleteMember() {
        System.out.println("\n ♥♡♥ ID가 확인되었습니다. ♥♡♥\n");
        
        while(true) {
            System.out.print("정말 탈퇴하시겠습니까?(Y/N) : ");
            char yesNo = sc.nextLine().toUpperCase().charAt(0);
            if(yesNo == 'Y' || yesNo == 'N') {
                return yesNo;
            } else {
                System.out.println("잘못 입력하셨습니다. 재입력하세요.");
            }
        }        
    }
 
}
 
cs

Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package com.kh.controller;
 
import java.util.ArrayList;
 
import com.kh.model.service.MemberService;
import com.kh.model.vo.Member;
import com.kh.view.MemberMenu;
 
public class MemberController {
    private MemberMenu menu = new MemberMenu(); // controller와 연결될 것들
    private MemberService mService = new MemberService(); // service (Controller ⇔ service ⇔ dao)
 
    public void selectAll() {
        // 회원 조회 성공 했을 때는 MemberMenu에 displayMember()로
        // 회원 조회 실패 했을 때는 MemberMenu에 displayError()로
 
        ArrayList<Member> list = mService.selectAll();
        // 여러 명(Member)의 객체를 담을 ArrayList
 
        if (list.isEmpty()) {
            menu.displayError("조회 결과가 없습니다.");
        } else {
            menu.displayMember(list); // 조회 성공 : list 담아 보내기
        }
    }
    // 앞으로는 미리 반환 값을 예측하면서 진행해보기 !!
    // 1. 반환타입 예측
    // 2. 지금 필요한 객체가 무엇인지 (쿼리 생각해보기)
 
    public void insertMember() {
        Member m = menu.insertMember(); // 누굴 출력할지 정보 받아오려고
        // member 객체 반환 받을 것임
 
        int result = mService.insertMember(m);
 
        // 만약 ! 회원가입 후 바로 해당 계정으로 로그인이 되려면
        // insert를 했지만 한 번 더 select를 해야 하기 때문에
        // 그 메소드에 대한 반환 값은 Member일 수 있다.
        // (반환 타입은 언제든지 달라질 수 있다는 것을 유의)
 
        if (result > 0) {
            menu.displaySuccess(result + "개 행이 추가되었습니다.");
        } else {
            menu.displayError("데이터 삽입 과정 중 오류 발생.");
        }
 
        // 삽입에 성공한 경우 MemberMenu의 displaySuccess()로
        // 삽입에 실패한 경우 MemberMenu의 displayError()로
    }
 
    public void selectMember() {
        // 뭘로 검색할 건지 view에서 받아올 것
        int sel = menu.selectMember();
 
        ArrayList<Member> list = null;
        // id랑 gen으로 조회한 것 중 하나만 있어도 되니까! (Member가 들어옴)
        // 둘 다 반환 값이 같고, 둘 중에 하나만 선택해서 실행
 
        switch (sel) {
        case 1// 아이디로 조회하기 (부분 검색 가능하게)
            String id = menu.inputMemberId();
            list = mService.selectMemberId(id);
            break;
        case 2// 성별로 조회하기 (M이면 남자, F이면 여자만)
            char gen = menu.inputGender();
            list = mService.selectGender(gen);
            break;
        case 0:
            return;
        // 메인 메뉴로 돌아갈 것이라 return하면 됨
        }
 
        if (!list.isEmpty()) {
            menu.displayMember(list);
        } else {
            menu.displayError("조회 결과가 없습니다...^_ㅠ 쩝");
        }
 
        // 조회 결과가 비어있지 않을 경우 MemberMenu의 displayMember()로
        // 조회 결과가 비어있을 경우 MemberMenu의 displayError()로
    }
 
    public void updateMember() {
        // 아이디 받아왔던 메소드 활용
        String memberId = menu.inputMemberId();
 
        // 1. 아이디가 있는지 먼저 체크하고 수정
        int check = mService.checkMember(memberId);
//        System.out.println(check);    // 내가 값을 잘 받아왔는지 확인
 
        // 2. 수정 단계
        if (check != 1) { // 회원 없음 : 수정 X
            menu.displayError("입력한 아이디가 존재하지 않습니다.");
        } else {
            // view에서 값 받아오기
            int sel = menu.updateMember();
 
            if (sel == 0) { // 메인 화면으로
                return;
            }
 
            String input = menu.inputUpdate(); // 수정 값
 
            String upStr = null;
            switch (sel) { // 데이터 가공 (Controller의 역할 중 하나)
            case 1:
                upStr = "MEMBER_PWD";
                break;
            case 2:
                upStr = "EMAIL";
                break;
            case 3:
                upStr = "PHONE";
                break;
            case 4:
                upStr = "ADDRESS";
            }
 
            int result = mService.updateMember(memberId, upStr, input);
 
            if (result > 0) {
                menu.displaySuccess(result + "개 행이 수정되었습니다.ㅋㅋ");
            } else {
                menu.displayError("데이터 수정 과정 중 오류 발생...(^.ㅠ)..。");
            }
        }
    }
 
    public void deleteMember() {
        // 사용자에게 탈퇴할 아이디를 입력 받고 입력 받은 아이디가 존재하는지 확인
        // 존재하지 않으면 "입력한 아이디가 존재하지 않습니다" 출력
        // 존재한다면 정말 탈퇴할 것인지 물어봄
        // 탈퇴하지 않겠다고 하면 메인 메뉴로 돌아가고
        // 탈퇴하겠다고 하면 데이터베이스에서 해당 회원 삭제
        // 삭제에 성공하면 "n개의 행이 삭제되었습니다" 출력
        // 삭제에 실패하면 "데이터 삭제 과정 중 오류 발생" 출력
 
//        1. 탈퇴할 아이디 입력받기
        String memberId = menu.inputMemberId();
//        2. 아이디 존재 여부 체크
        int check = mService.checkMember(memberId);
//        3. 탈퇴 여부 물어보기
        if (check != 1) {
            menu.displayError("입력한 아이디가 존재하지 않습니다.");
        } else {
            char result = menu.deleteMember();
 
            if (result == 'N') { // N이면 메인화면
                return;
            }
 
            // Y면 삭제 혹은 오류 발생
            int delete = mService.deleteMember(memberId);
            if (delete > 0) {
                menu.displaySuccess(delete + "개의 행이 삭제되었습니다.");
            } else {
                menu.displayError("데이터 삭제 과정 중 오류 발생!!!");
            }
        }
    }
 
    public void exitProgram() {
        mService.exitProgram(); // conn 닫는 건 service로 넘기기
    }
}
 
cs

Service(model.service)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package com.kh.model.service;
 
//import static com.kh.common.JDBCTemplate.commit;
//import static com.kh.common.JDBCTemplate.rollback;
//import static com.kh.common.JDBCTemplate.getConnection;
import static com.kh.common.JDBCTemplate.*// 전체 가져오는 법
 
import java.sql.Connection;
import java.util.ArrayList;
 
import com.kh.common.JDBCTemplate;
import com.kh.model.dao.MemberDAO;
import com.kh.model.vo.Member;
 
public class MemberService {
    /*
     * Service클래스에서 메소드 작성 방법 
     * 1) Controller로부터 인자 전달 받음 
     * 2) JDBCTemplate으로부터getConnection() 호출해 Connection객체 생성 
     * 3) DAO 객체 생성 
     * 4) DAO에 생성된 Connection객체와 인자 전달
     * 5) 트랜잭션 관리
     */
    private MemberDAO mDAO = new MemberDAO(); // Service가 DAO를 도와주는 보조 역할
 
    public ArrayList<Member> selectAll() {
        Connection conn = getConnection(); // 계정 연결해서 Connection 객체 생성
        ArrayList<Member> list = mDAO.selectAll(conn);
                                              // └ 계정 연결한 Connection 객체 담김
 
        // Select 라서 트랜잭션 필요 없음
        return list;
    }
 
    public int insertMember(Member m) {
        Connection conn = getConnection();
        int result = mDAO.insertMember(conn, m);
        // 방금 만든 conn, m 매개변수도 전달
 
        if (result > 0) {
            commit(conn);
        } else {
            rollback(conn);
        }
 
        return result;
    }
 
    public ArrayList<Member> selectMemberId(String id) {
        Connection conn = getConnection();
        ArrayList<Member> list = mDAO.selectMemberId(conn, id);
 
        return list;
 
    }
 
    public ArrayList<Member> selectGender(char gen) {
        Connection conn = getConnection();
        ArrayList<Member> list = mDAO.selectMemberGender(conn, gen);
 
        return list;
    }
 
    public int checkMember(String memberId) {
        Connection conn = getConnection();
        int check = mDAO.checkMember(conn, memberId);
        // SELECT 할 예정
        return check;
    }
 
    public int updateMember(String memberId, String upStr, String input) {
        Connection conn = getConnection();
        int result = mDAO.updateMember(conn, memberId, upStr, input);
 
        if (result > 0) {
            commit(conn);
        } else {
            rollback(conn);
        }
 
        return result;
    }
 
    public int deleteMember(String memberId) {
        Connection conn = getConnection();
        int result = mDAO.deleteMember(conn, memberId);
 
        if (result > 0) {
            commit(conn);
        } else {
            rollback(conn);
        }
 
        return result;
    }
 
    public void exitProgram() {
        Connection conn = getConnection();
        close(conn);
    }
}
 
cs

DAO(model.dao)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
package com.kh.model.dao;
 
import static com.kh.common.JDBCTemplate.close;
 
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
 
import com.kh.model.vo.Member;
 
public class MemberDAO {
    // 타입
    public ArrayList<Member> selectAll(Connection conn) {
        Statement stmt = null;
        ResultSet rset = null// 먼저 필요한 객체들 생각해보기
        ArrayList<Member> list = null;
        try {
            // 1. 쿼리문 작성
            String query = "SELECT * FROM MEMBER";
 
            // 2. Statement, PreparedStatement를 통한 쿼리문 전달 후 반환값 받기
            // executeQuery(), executeUpdate()
            stmt = conn.createStatement();
            rset = stmt.executeQuery(query); // 비어있는 거 없어서 바로 보내기
 
            list = new ArrayList<Member>();
 
            while (rset.next()) {
                String memberId = rset.getString("MEMBER_ID");
                String memberPwd = rset.getString("MEMBER_PWD");
                String memberName = rset.getString("MEMBER_NAME");
                char gender = rset.getString("GENDER").charAt(0);
                String email = rset.getString("EMAIL");
                String phone = rset.getString("PHONE");
                int age = rset.getInt("AGE");
                String address = rset.getString("ADDRESS");
                Date enrollDate = rset.getDate("ENROLL_DATE");
 
                // 3. 활용할 수 있는 객체에 옮겨담기
                Member mem = new Member(memberId, memberPwd, memberName, gender, email, phone, age, address,
                        enrollDate);
 
                list.add(mem);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(rset);
            close(stmt);
        }
        return list;
    }
 
    public int insertMember(Connection conn, Member m) {
        PreparedStatement pstmt = null;
        int result = 0;
 
        try { // SYSDATE는 알아서 저장됨
            String query = "INSERT INTO MEMBER VALUES(?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";
            pstmt = conn.prepareStatement(query);
 
            pstmt.setString(1, m.getMemberId());
            pstmt.setString(2, m.getMemberPwd());
            pstmt.setString(3, m.getMemberName());
            pstmt.setString(4, m.getGender() + ""); // 가장 간단히 문자열 만드는 방법
            pstmt.setString(5, m.getEmail()); // ★ insert에서는 테이블 컬럼 순서대로
            pstmt.setString(6, m.getPhone());
            pstmt.setString(7, m.getAddress());
            pstmt.setInt(8, m.getAge());
            result = pstmt.executeUpdate();
 
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(pstmt);
        }
        return result;
    }
 
    public ArrayList<Member> selectMemberId(Connection conn, String id) {
//        Statement stmt = null;
        PreparedStatement pstmt = null;
        ResultSet rset = null;
        ArrayList<Member> list = null;
 
        try { // ★ 문자열 받을 거라 '로 리터럴 감싸기, ""도!
//            String query = "SELECT * FROM MEMBER WHERE MEMBER_ID LIKE '%" + id + "%'";
//            stmt = conn.createStatement();
//            rset = stmt.executeQuery(query);
            // ★ PreparedStatement로 위치 홀더 ?를 쓸 때는 ''를 안 써도 됨
            String query = "SELECT * FROM MEMBER WHERE MEMBER_ID LIKE ?"// 알아서 '' 붙여줌!
            pstmt = conn.prepareStatement(query);
            pstmt.setString(1"%" + id + "%"); // → '%id%' 가 되는 것
            rset = pstmt.executeQuery();
 
            list = new ArrayList<Member>();
 
            // ★ Member 클래스의 생성자 순서를 보면서 하는 것
            while (rset.next()) { // 안의 컬럼 명은 rset의 컬럼명 순서
                Member member = new Member(rset.getString("MEMBER_ID"), rset.getString("MEMBER_PWD"),
                        rset.getString("MEMBER_NAME"), rset.getString("GENDER").charAt(0), rset.getString("EMAIL"),
                        rset.getString("PHONE"), rset.getInt("AGE"), // 오라클에서는 숫자/문자의 형변환이 자유로워서 '' 상관 없음
                        rset.getString("ADDRESS"), rset.getDate("ENROLL_DATE"));
                list.add(member);
            }
//            while (rset.next()) {
//                String memberId = rset.getString("MEMBER_ID");
//                String memberPwd = rset.getString("MEMBER_PWD");
//                String memberName = rset.getString("MEMBER_NAME");
//                char gender = rset.getString("GENDER").charAt(0);
//                String email = rset.getString("EMAIL");
//                String phone = rset.getString("PHONE");
//                String address = rset.getString("ADDRESS");
//                int age = rset.getInt("AGE");
//                Date enrollDate = rset.getDate("ENROLL_DATE");
//
//                Member member = new Member(memberId, memberPwd, memberName, gender, email, phone, address, age,
//                        enrollDate);
 
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(rset);
//            close(stmt);
            close(pstmt);
        }
        return list;
    }
 
    public ArrayList<Member> selectMemberGender(Connection conn, char gen) {
//        Statement stmt = null;
        PreparedStatement pstmt = null;
        ResultSet rset = null;
        ArrayList<Member> list = new ArrayList<Member>();
 
        try {
//            String query = "SELECT * FROM MEMBER WHERE GENDER = '" + gen + "'";
//            stmt = conn.createStatement();
//            rset = stmt.executeQuery(query);
 
            String query = "SELECT * FROM MEMBER WHERE GENDER = ?";
            pstmt = conn.prepareStatement(query);
            pstmt.setString(1, gen + "");
            rset = pstmt.executeQuery();
 
            while (rset.next()) {
                list.add(new Member(rset.getString("member_id"), rset.getString("member_pwd"),
                        rset.getString("member_name"), rset.getString("gender").charAt(0), rset.getString("email"),
                        rset.getString("phone"), rset.getInt("age"), rset.getString("address"),
                        rset.getDate("enroll_date")));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(rset);
            close(pstmt);
        }
 
        return list;
    }
 
    public int checkMember(Connection conn, String memberId) {
        PreparedStatement pstmt = null;
        ResultSet rset = null// SELECT 할 것
        int result = 0;
        // 그래서 int result 사용
        try { // 결과 1개 행(값은 int) // PK
            String query = "SELECT COUNT(*) FROM MEMBER WHERE MEMBER_ID = ?";
            pstmt = conn.prepareStatement(query);
            pstmt.setString(1, memberId); // 첫 번째 ? 위치 = memberId
 
            rset = pstmt.executeQuery();
 
            if (rset.next()) {
                result = rset.getInt(1); // → 컬럼 순번대로 가지고 오는 것 (int columnIndex)
//                result = 1;                          // 0으로 시작했으니까 id가 있을 때만 1 반환
//                result = rset.getInt("count(*)"); // → ResultSet의 컬럼 명으로 가져오는 것
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(rset);
            close(pstmt);
        }
 
        return result;
    }
 
    public int updateMember(Connection conn, String memberId, String upStr, String input) {
        PreparedStatement pstmt = null;
        int result = 0;
 
        try {
//            String query = "UPDATE MEMBER SET " + upStr + " = '" + input + "' WHERE MEMBER_ID = '" + memberId + "'";
//            pstmt = conn.prepareStatement(query);
//            result = pstmt.executeUpdate();
 
            String query = "UPDATE MEMBER SET " + upStr + "= ? WHERE MEMBER_ID = ?";
            pstmt = conn.prepareStatement(query);
            pstmt.setString(1, input);
            pstmt.setString(2, memberId);
            result = pstmt.executeUpdate();
 
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(pstmt);
        }
        return result;
    }
    // String query = "UPDATE MEMBER SET ? = ? WHERE MEMBER_ID = ?"; 가 안 되는 이유 ▼
    // ex. "UPDATE MEMBER SET 'MEMBER_PWD' = '1234' WHERE MEMBER_ID = 'user01';
    //                              └ 컬럼명이 아니라 ''로 인해 리터럴로 들어가기 때문에 열로 인식 불가
    //                              ≫ PreparedStatement는 위치홀더 ? 쓸 때 '' 알아서 붙여줌.
 
    public int deleteMember(Connection conn, String memberId) {
        PreparedStatement pstmt = null;
        int result = 0;
 
        try {
//            String query = "DELETE FROM MEMBER WHERE MEMBER_ID = '" + memberId + "'";
            String query = "DELETE FROM MEMBER WHERE MEMBER_ID = ?";
            pstmt = conn.prepareStatement(query);
            pstmt.setString(1, memberId);
            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(pstmt);
        }
        return result;
    }
}
 
cs

run

1
2
3
4
5
6
7
8
9
10
package com.kh.run;
 
import com.kh.view.MemberMenu;
 
public class Run {
    public static void main(String[] args) {
        new MemberMenu().mainMenu();
    }
}
 
cs

'KH' 카테고리의 다른 글

230323 DB 모델링 (Chap02. 개념적 모델링)  (0) 2023.03.23
230323 DB 모델링 (Chap01. DB 모델링 개요)  (0) 2023.03.23
230321 (DAO의 역할 분리 : JDBCTemplate + Service)  (0) 2023.03.21
230320 (JDBC)  (0) 2023.03.20
230317 (TRIGGER)  (0) 2023.03.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함