Java

[Java] DAO(Data Access Object) / VO(Value Object) - MemberDAO

소댓 2023. 4. 5. 00:29

- [memberdao]에 데이터 추가, 업데이트

SQL> col motive format a10
SQL> col id format a8
SQL> col pw format a8
SQL> col name format a8
SQL> col id format a15
SQL> select * from member;

        NO ID              PW       NAME     GENDER     MOTIVE
---------- --------------- -------- -------- ---------- ----------
         7 ccc             ddd      eee      남         fff
         8 mero            gumi     haha     여         after
        10 agcde           abd      ffe      남         dfaw
         6 aaa             bbb      hong     남         친구추천
         9 faa
> 데이터 보기 편하게

 

 

- MemberDAO

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
package dao;
 
import java.lang.reflect.Member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
 
import vo.MemberVO;
 
public class MemberDAO {
    
        // 1. 환경변수
        String driver = "oracle.jdbc.driver.OracleDriver";
        String url =  "jdbc:oracle:thin:@localhost:1521:orcl"
        String username = "scott";
        String password = "tiger";
                            
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        
        public MemberDAO() { // 생성자에서 1번~3번
//            super(); // 부모 생성자 생략됨 (자바의 모든 개체는 object의 후손)
            try {
                Class.forName(driver);
                conn = DriverManager.getConnection(url, username, password);
            
            } catch (ClassNotFoundException e) {
                System.out.println("드라이버 로딩 실패");
                e.printStackTrace();
            } catch (SQLException e) {
                System.out.println("db 연결 실패");
                e.printStackTrace();
            }
            System.out.println("conn : "+conn);
        }
    
        
        // id가 aaa인 데이터 가져오기
        public MemberVO getOneById(String id) { // 4번 ~ 7번
            
            
            // 4. sql문장
            StringBuffer sb = new StringBuffer(); // String에 buffer 기능이 있어 사이즈 조절이 가능
            sb.append("SELECT no, id, pw, name, gender, motive ");
            sb.append("FROM MEMBER ");
            sb.append("WHERE id = ? ");
            
            System.out.println(sb.toString());
            
            MemberVO vo = null// 멤버변수 선언
            
            try {
                // 5. sql문장 객체
                pstmt = conn.prepareStatement(sb.toString());
                pstmt.setString(1, id);
                // 6. 실행 (select ==> ResultSet)
                rs = pstmt.executeQuery();
                // 7. 레코드별 로직 처리
                while(rs.next()) {
                    int no = rs.getInt("no");
                    String pw = rs.getString("pw");
                    String name = rs.getString("name");
                    String gender = rs.getString("gender");
                    String motive = rs.getString("motive");
                    vo = new MemberVO(no, id, pw, name, gender, motive); // vo 객체
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return vo; // 값 전달 필수!
        } // getOnebyId end
        
        public ArrayList<MemberVO> getAll() {
            ArrayList<MemberVO> list = new ArrayList<MemberVO>();
            
            StringBuffer sb = new StringBuffer();
            sb.append("SELECT * FROM member ");
            
            System.out.println(sb.toString());
            
            try {
                pstmt = conn.prepareStatement(sb.toString());
                rs = pstmt.executeQuery();
                // NO ID    PW    NAME    GENDER    MOTIVE
                while(rs.next()) {
                    int no = rs.getInt("no");
                    String id = rs.getString("id");
                    String pw = rs.getString("pw");
                    String name = rs.getString("name");
                    String gender = rs.getString("gender");
                    String motive = rs.getString("motive");
                    MemberVO vo = new MemberVO(no, id, pw, name, gender, motive); // 만들어둔 생성자로
//                    MemberVo vo = new MemberVO();// 기본 생성자로
//                    vo.setId(id);
//                    vo.setPw(pw);
//                    vo.setMotive(motive);
//                    vo.setName(name);
                    list.add(vo);
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return list;
        } // arraylist end
        
        public void addMember(MemberVO vo) {
            // 4번. sql 문장
            StringBuffer sb = new StringBuffer();
            sb.append("INSERT INTO member ");
            sb.append("VALUES (mem_no_seq.nextval, ?, ?, ?, ?, ?)");
            
            System.out.println("SQL문 확인 : "+sb.toString());
            
            try {
                pstmt = conn.prepareStatement(sb.toString());
                String id = vo.getId();
                String pw = vo.getPw();
                String name = vo.getName();
                String Gender = vo.getGender();
                String Motive = vo.getMotive();
                
                pstmt.setString(1, id);
                pstmt.setString(2, pw);
                pstmt.setString(3, name);
                pstmt.setString(4, Gender);
                pstmt.setString(5, Motive);
                
                pstmt.executeUpdate();
                
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }    
        } // addmember end
        
        public void updateMember(MemberVO vo) {
            StringBuffer sb = new StringBuffer();
            sb.append("UPDATE member ");
            sb.append("SET name = ? ");
            sb.append("WHERE no = 12");
            
            System.out.println("SQL문 확인 : "+sb.toString());
            
            try {
                pstmt = conn.prepareStatement(sb.toString());
//                pstmt.setString(1, vo.getId());
//                pstmt.setString(2, vo.getPw());
                pstmt.setString(1, vo.getName());
//                pstmt.setString(4, vo.getGender());
//                pstmt.setString(5, vo.getMotive());
                
                pstmt.executeUpdate();
                
                
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
 
        } // updatemember end
        
        public void deleteMember(int no) {
            StringBuffer sb = new StringBuffer();
            sb.append("DELETE FROM member ");
            sb.append("WHERE no = ?");
            
            System.out.println("SQL문 확인 "  + sb.toString());
            
            try {
                pstmt = conn.prepareStatement(sb.toString());
                pstmt.setInt(1, no);
                pstmt.executeUpdate();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
        } // delete end
        
        public void close() {
            
                try {
                    if(rs!= null) rs.close();
                    if(pstmt!= null) pstmt.close();
                    if(conn!= null) conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            
        }
        
// class end
 
cs

 

 

- [testmain2] 

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
package dao;
 
import java.util.ArrayList;
 
import vo.MemberVO;
 
public class TestMain2 {
    public static void main(String[] args) {
        
        MemberDAO dao = new MemberDAO();
        
        // conn : oracle.jdbc.driver.T4CConnection@3745e5c6
 
        MemberVO vo = new MemberVO();
        vo.setId("aaa");
        System.out.println("id : "+vo.getId()); // id : aaa
        
        System.out.println("--------------------------");
        
        
        MemberVO vo2 = dao.getOneById("aaa"); // 멤버 테이블 객체(vo2) 생성하고 아이디가 aaa인 데이터 반환
        System.out.println("id : "+vo2.getId());
        System.out.println("pw : "+vo2.getPw());
        System.out.println("name : "+vo2.getName());
        
        System.out.println("--------------------------");
        
        ArrayList<MemberVO> list = dao.getAll();
        
        System.out.println("list : "+list);
        
        for(MemberVO vo3 : list) {
            System.out.println(vo3.getId()+" : "+vo3.getPw()+" : "+vo3.getName());
        }
        
        System.out.println("---------------------------------------");
        
        
        // 추가
        MemberVO vo4 = new MemberVO(0"bbb""ccc""둘리""남""인터넷검색" );
        dao.addMember(vo4);
        
        vo4.setName("고길동");
        vo4.setNo(12); // 방금 전에 추가했던 둘리의 번호를 지정
        
        
        // 업데이트
        MemberVO vo5 = new MemberVO(); // ..
        dao.updateMember(vo5); 
        
        dao.deleteMember(12);
        
    }
}
 
cs

 

 

 

 


- [DeptDAO] 에 addOne추가

SQL> SELECT * FROM dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> CREATE SEQUENCE DEPT_DEPTNO_SEQ
  2  START WITH 1
  3  INCREMENT BY 1
  4  NOCACHE
  5  NOCYCLE;

시퀀스가 생성되었습니다.
>> DEPT에 먼저, 시퀀스 만듦


- cmd 데이터 업데이트
SQL> UPDATE DEPT
  2  SET DNAME = '영업2', LOC = '강릉'
  3  WHERE DEPTNO = 1;

1 행이 갱신되었습니다.

SQL> SELECT * FROM dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
         1 영업2          강릉
         2 기획           제주
         3 기획           제주
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

7 개의 행이 선택되었습니다.

 

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
package dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
 
import vo.DeptVO;
// * DAO : Data Access Object
// db 처리하는 순서가 같으니, 중복된 부분을 객체로 만들어 활용하는 것
 
public class DeptDAO {
 
    // 1. 환경변수
    String driver = "oracle.jdbc.driver.OracleDriver";
    String url =  "jdbc:oracle:thin:@localhost:1521:orcl"
    String username = "scott";
    String password = "tiger";
                        
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    
    public DeptDAO() {
        // 2. 드라이버 로딩
        try {
            Class.forName(driver);
            // 3. Connection
            conn = DriverManager.getConnection(url, username, password);
            System.out.println("conn : "+conn);
        } catch (ClassNotFoundException e) {
            System.out.println("드라이버 로딩 실패");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("db 연결 실패");
            e.printStackTrace();
        }
        
    }
    
    // 부서 전체 목록
    public ArrayList<DeptVO> getAll() {// public 리턴타입 메서드명(매개변수) > 다 가져오면 매개변수 필요 x
        // DeptVO만 담는 전용 ArrayList가 됨
        ArrayList<DeptVO> list = new ArrayList<DeptVO>();
        
        // 4. sql문장
        String sql = "SELECT * FROM dept";
        
        try {
            // 5. sql문장 객체
            pstmt = conn.prepareStatement(sql);
            // 6. 실행 (select ==> ResultSet)
            rs = pstmt.executeQuery();
            while(rs.next()) { 
                int deptno = rs.getInt("deptno");
                String dname = rs.getString("dname");
                String loc = rs.getString("loc");
                System.out.println(deptno+" : "+dname+" : "+loc);
                DeptVO vo = new DeptVO(deptno, dname, loc); // 자바의 객체로 만듦
                list.add(vo);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
        
    }
    
    // 10부서 정보 가져오기
    public DeptVO getOne(int deptno) { // public 리턴타입 메소드이름(int 부서번호)
        DeptVO vo = null;
        // 4. sql문장
        String sql = "SELECT * FROM dept WHERE deptno = ?"// 내가 주는 부서번호(?)를 갖는 데이터
        // 5. sql문장 객체
         // 밑에서 오류 터지면 null이 되기 때문에, 밖의 변수로 지정
        try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, deptno); // 첫번째 부서번호에는 내가 준 번호 전달
        // 6. 실행 (select ==> ResultSet)
        rs = pstmt.executeQuery(); // resultset 받아오기
        // 7. 레코드별 로직 처리
        while(rs.next()) {
            String dname = rs.getString("dname");
            String loc = rs.getString("loc");
//            System.out.println("dname : "+dname+", loc : "+loc);
            vo = new DeptVO(deptno, dname, loc);
        
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return vo; // vo 리턴
    } // getOne end
 
    // 8. 자원 반납
    
    // addOne(DeptVO vo) : 데이터 추가
    public void addOne(DeptVO vo) {
        // 위에서 1~3번은 처리됨
        // 4번.
        StringBuffer sb = new StringBuffer();
        sb.append("INSERT INTO dept "); // append는 공백 없이 붙기 때문에 문자열에 공백 넣어주기
        sb.append("VALUES (dept_deptno_seq.nextval, ?, ?)");
        
        System.out.println("SQL문 확인 : " + sb.toString());
        
        try {
            // 5번. 문장 객체
            pstmt = conn.prepareStatement(sb.toString());
            String dname = vo.getDname();
            String loc = vo.getLoc(); // 변수 설정
            pstmt.setString(1, dname);
            pstmt.setString(2, loc);
//            pstmt.setString(2, vo.getLoc()); > 변수 설정 생략하고 한번에 써도 ㄱㅊ
            
            pstmt.executeUpdate();
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    } // addOne end
    
    public void updateOne(DeptVO vo) {
        
        StringBuffer sb = new StringBuffer();
        sb.append("UPDATE dept ");
        sb.append("SET DNAME = ?, LOC = ? "); 
        sb.append("WHERE DEPTNO = ?");
        System.out.println("SQL문 확인 : "+sb.toString());
        
        
        try {
            // 문장 객체
            pstmt = conn.prepareStatement(sb.toString());
            pstmt.setString(1,  vo.getDname());
            pstmt.setString(2, vo.getLoc());
            pstmt.setInt(3, vo.getDeptno());
            
            pstmt.executeUpdate();
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } // updateOne end
    
    public void deleteOne(int deptno) { // TestMain에서 dao.deleteOne에 숫자 3을 줬기 때문에 int로 변수 생성
        
        StringBuffer sb = new StringBuffer();
        sb.append("DELETE FROM dept ");
        sb.append("WHERE deptno = ?");
        
        System.out.println("SQL문 확인 : "+sb.toString());
        
        try {
            pstmt = conn.prepareStatement(sb.toString());
            pstmt.setInt(1, deptno);
            
            pstmt.executeUpdate();
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    } // deleteOne end
    
    // 자원반납 > 한번에 몰아서
    public void close() {
        try {
            if(rs!= null) rs.close();
            if(pstmt!= null) pstmt.close();
            if(conn!= null) conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    
    
// class end
 
cs

 

 

- [testmain]

 

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
package dao;
 
import java.util.ArrayList;
 
import vo.DeptVO;
 
public class TestMain {
    public static void main(String[] args) {
        DeptDAO dao = new DeptDAO(); // db연결할 때 이 한줄이면 끝남!
        
        DeptVO vo = dao.getOne(10); // 10번 부서에 대한 정보 호출
 
        System.out.println("vo : "+vo);
        System.out.println("부서번호 : "+vo.getDeptno());
        System.out.println("부서명 : "+vo.getDname());
        System.out.println("부서위치 : "+vo.getLoc());
        System.out.println("-------------------------");
        
        // 전체 목록(네 개의 부서 정보가 하나에 출력)
//        dao.getAll();
        
        ArrayList<DeptVO> list = dao.getAll();
        
        for(DeptVO vo2 : list) {
            System.out.println(vo.getDeptno()+" : "+vo.getDname()+" : "+vo.getLoc());
        }
        
        System.out.println("-------------------");
    
        
        // 추가
        DeptVO vo3 = new DeptVO();
        vo3.setDname("기획");
        vo3.setLoc("제주");
        // db에 데이터를 추가 > deptDAO에 메서드 만들기
        dao.addOne(vo3);
        
        
        // 변경
        DeptVO vo4 = new DeptVO(10"영업1""인천");
        dao.updateOne(vo4);
//        dao.updateOne(0, "영업1", "인천"))// 매개변수를 변수로 줄 수도 있음
        
        
        // 삭제
        dao.deleteOne(3); // 3번 부서를 삭제
    }
}
 
 
cs