2022.12.05 - [Study/중앙정보처리학원과정] - 30일차. DTO(Data Tranfer Object)
2022.12.07 - [Study/중앙정보처리학원과정] - 31일차. ArrayList와 DTO
30일차부터 계속 이어지고 있다.
31일차에는 DTO 클래스를 ArrayList를 이용해서 변형해봤고, 32일차인 오늘은 DTO 클래스를 Map과 Set을 이용하여 변형해주었다.
여기서 잠깐 Collection Framwork의 대표적인 List, Set, Map에 특징들을 다시한번 짚고 넘어가겠다.
2022.11.14 - [Study/중앙정보처리학원과정] - 15일차. collection framework(컬렉션 프레임워크) ArrayList
- List - 추가된 순서가 유지된다, 중복을 허용한다
- Set - 추가된 순서유지X, 중복을 허용하지않는다. 중복값이 들어온다면 가장 마지막에 들어온 중복값 1개만 출력
- Map - Key와 Value의 한쌍으로 이루어져있다. Key는 중복을 허용하지않고 Set과 마찬가지로 중복값은 가장 마지막 1개만 출력된다. Value는 중복이 가능하다.
31일차에는 ArrayList를 이용한 전체컬럼을 조회하는 Select를 했었는데 이를 다시 HashSet과 HashMap으로 변경해보도록 하겠다.
먼저 HashSet을 이용하여 전체 Select를 해주는 메소드를 추가로 작성해보았다.
Set<NoticeBoardDTO> allSelectSet() {
//단일쓰레드라 스트링빌더 사용
StringBuilder sqlSet = new StringBuilder();
sqlSet.append("select nbno,title,contant,cre_date,writer,rcnt,empno");
sqlSet.append(" from noticeboard");
sqlSet.append(" order by cre_date desc");
//HashSet 객체 생성 Set타입의 NoticeBoardDTO를 제네릭으로 표현해준 참조변수 생성
Set<NoticeBoardDTO> dtoSet = new HashSet<NoticeBoardDTO>();
try {
stmt = con.prepareStatement(sqlSet.toString());
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
//DTO클래스에 값을 하나하나 대입
NoticeBoardDTO dto = new NoticeBoardDTO();
dto.setNbno(rs.getInt("nbno"));
dto.setTitle(rs.getString("title"));
dto.setContant(rs.getString("contant"));
dto.setCre_date(rs.getDate("cre_date"));
dto.setWriter(rs.getString("writer"));
dto.setRcnt(rs.getInt("rcnt"));
dto.setEmpno(rs.getInt("empno"));
//.ADD를 이용하여 DTO클래스의 값들을 dtoSet 변수에 대입
dtoSet.add(dto);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//HashSet의 참조변수를 리턴
return dtoSet;
}
그리고 Main클래스에서 Set형식으로 작성된 메소드를 호출해주면서 Select 실행
while(true) {
System.out.println();
System.out.println("--1.전체조회 2.상세조회 3.등록 4.수정 5.삭제 6.종료");
System.out.print("메뉴 번호를 입력하세요▶");
int input = sc.nextInt();
if(input == 1) {
//allSelectSet 메소드를 실행하면 리턴값이 Set타입의 dtoSet이 리턴된다, 따라서 받을때도 Set 타입으로 받아야한다
Set<NoticeBoardDTO> dtoSet = nbd.allSelectSet();
//ArrayList는 인덱스 번호가 주어지지만 Set은 인덱스번호같은 순번이 주어지지 않기때문에 Iterator을 이용하여 반복적으로
//Set의 요소들을 읽어온다
Iterator<NoticeBoardDTO> iter = dtoSet.iterator();
//iter가 다음요소가 없을때까지
while(iter.hasNext()) {
NoticeBoardDTO dto = iter.next();
System.out.println(dto);
}
/*ArrayList를 이용한 전체조회 Select 메소드 호출
List<NoticeBoardDTO> dto = nbd.allSelect();
for(int i=0; i<dto.size(); i++) {
System.out.println(dto.get(i).toString());
}*/
}
실행하면 결과값은 ArrayList때와 동일하다
다음은 HashMap을 이용해보겠다.
Map<Integer,NoticeBoardDTO> allSelectMap() {
//단일쓰레드라 스트링빌더 사용
StringBuilder sqlSet = new StringBuilder();
sqlSet.append("select nbno,title,contant,cre_date,writer,rcnt,empno");
sqlSet.append(" from noticeboard");
sqlSet.append(" order by cre_date desc");
//key값이 Integer이고 value값이 NoticeBoardDTO 클래스를 제네릭으로 가지고 있는 HashMap 객체 생성
Map<Integer,NoticeBoardDTO> map = new HashMap<Integer,NoticeBoardDTO>();
try {
stmt = con.prepareStatement(sqlSet.toString());
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
//DTO클래스에 값을 하나하나 대입
NoticeBoardDTO dto = new NoticeBoardDTO();
dto.setNbno(rs.getInt("nbno"));
dto.setTitle(rs.getString("title"));
dto.setContant(rs.getString("contant"));
dto.setCre_date(rs.getDate("cre_date"));
dto.setWriter(rs.getString("writer"));
dto.setRcnt(rs.getInt("rcnt"));
dto.setEmpno(rs.getInt("empno"));
//map은 값을 put으로 key와 value를 정해줘야한다 여기서 key는 글번호인 nbno, 값은 dto객체를 던져주었다
map.put(rs.getInt("nbno"), dto);
}
} catch (SQLException e) {
e.printStackTrace();
}
//map 참조변수를 리턴
return map;
}
다음은 Main에서 Map을 낱낱히 파헤쳐보겠다.
if(input == 1) {
//map 객체 생성하면서 seletMap 쿼리 실행
Map<Integer,NoticeBoardDTO> map = nbd.allSelectMap();
//map의 키값을 꺼내오기 위해 keyset을 이용, map의 키값이 Integer기때문에 Keyset은 Set<Integer>를 반환한다
Set<Integer> set = map.keySet();
Iterator<Integer> iter = set.iterator();
//while문을 이용하여 key값을 얻은후에. gey(key) 메소드로 value를 동시에 얻고 그걸 NoticeBoardDTO 클래스 타입의 dto클래스로 받는다.
while(iter.hasNext()) {
int keys = iter.next();
NoticeBoardDTO dto = map.get(keys);
System.out.println(dto);
}
}
Map의 키값과 Value 값을 확인할때 Keyset도 있지만 EntrySet도 있다. EntrySet도 알아보자.
Map<Integer,NoticeBoardDTO> entryMap = nbd.allSelectMap();
//enytySet은 리턴타입을 Set으로 준다 그리고 제네릭에 Map.Entry로 명시해준다
Set<Map.Entry<Integer,NoticeBoardDTO>> entry = entryMap.entrySet();
//Set 형식으로 받았으니 Iterator를 이용하여 반복해서 값을 받아온다
Iterator<Map.Entry<Integer, NoticeBoardDTO>> mapIter = entry.iterator();
while(mapIter.hasNext()) {
Entry<Integer, NoticeBoardDTO> getMap = mapIter.next();
int key = getMap.getKey();//EntrySet을 이용하면 getKey, getValue로 각각 key와 value를 가져올수 있다.
NoticeBoardDTO value = getMap.getValue();
System.out.println("key="+key+" value="+value);
}
결과는 비슷해보이나 Map은 Key값과 Value값을 각각 찍어주는데 구별하기위해서 출력시 key와 value를 구별하기위해
System.out.println("key="+key+" value="+value) 양식으로 출력해주었다.
Key는 nbno와 동일하니 정상적으로 수행된것을 확인할수 있다.
'Study > 중앙정보처리학원과정' 카테고리의 다른 글
34일차. HTML 이미지 삽입(img src) 그리고 링크삽입(a href) (0) | 2022.12.11 |
---|---|
33일차. HTML 그리고 Visual Studio Code 설치 (0) | 2022.12.09 |
31일차. ArrayList와 DTO (0) | 2022.12.07 |
30일차. DTO(Data Tranfer Object) (0) | 2022.12.05 |
29일차. DB 클래스화 하기(클래스 다이어그램 맛보기?) (0) | 2022.12.04 |