HashMap에서 모든 회원 정보 조회 두 번째 방법
HashMapTest
while(it.hasNext()) {
String key = it.next();
System.out.println(key);
}
-- hasNext() : it에서 현재 it가 가지고 있는 여러 String 데이터 중 하나를 끄집어내서 존재하는지를 알아보는 것이다.
만약 존재하면 true, 존재하지 않으면 false이다.
-- next() : 실제로 키값인 String 값을 끄집어낸다.
-- 한 번 실행할 때 it에서 다 끄집어내서 key에 저장했기 때문에 it에는 더이상 남아있지 않게 되고, 다시 한 번 실행을 하게 되면 아무것도 출력되지 않는다.
HashMapTest
Iterator<String> it2 = keySets2.iterator();
while(it2.hasNext()) {
String key = it2.next();
mbrMap.get(key).memberInfo();
}
-- 다시 사용하고 싶다면 다시 처음부터 해 주어야 한다.
key값이 kimth인 Member를 삭제
HashMapTest
mbrMap.remove("kimth");
for(String key : keySets) {
Member m = mbrMap.get(key);
m.memberInfo();
}
-- Map의 경우 key값만 알면 삭제하기가 용이하다.
Ⅰ. Set
-- Package(my.day16.collection)에 Class(SetTest, main method 포함) 생성
1. HashSet
1) Member 클래스의 객체만을 저장할 수 있는 HashSet 객체 mbrHashSet를 생성한다.
SetTest
Set<Member> mbrHashSet = new HashSet<Member>();
2) Member 클래스의 객체 6개를 생성하여 mbrHashSet에 저장한다.
SetTest
mbrHashSet.add(new Member("youjs", "qwer1234$", "유재석"));
mbrHashSet.add(new Member("eom", "qwer1234$", "엄정화"));
mbrHashSet.add(new Member("kanghd", "qwer1234$", "강호동"));
mbrHashSet.add(new Member("leess", "qwer1234$", "이순신"));
mbrHashSet.add(new Member("kimth", "qwer1234$", "김태희"));
mbrHashSet.add(new Member("kangkc", "qwer1234$", "강감찬"));
3) mbrHashSet에 저장되어진 모든 회원들의 정보를 출력하시오.
-- Set 계열은 저장된 데이터를 조회하려면 반드시 Iterator를 통해서만 볼 수 있다.
SetTest
Iterator<Member> it = mbrHashSet.iterator();
while(it.hasNext()) {
Member m = it.next();
m.memberInfo();
}
SetTest
mbrHashSet.add(new Member("leess", "qwer1234$", "이순신"));
-- 중복된 값을 허용하지 않는다고 했는데 중복된 값을 저장한 후 출력하면 중복된 값이 출력되는 것을 확인할 수 있다.
SetTest
Member mbr1 = new Member("suji", "abcd1234", "수지");
Member mbr2 = new Member("suji", "abcd1234", "수지");
mbrHashSet.add(mbr1);
mbrHashSet.add(mbr2);
SetTest
Member mbr3 = new Member("chaew", "abcd1234", "차은우");
Member mbr4 = new Member("car", "abcd0070", "차금우");
mbr3 = mbr4;
mbrHashSet.add(mbr3);
mbrHashSet.add(mbr4);
-- 차금우만 출력된다.
-- mbr3과 mbr4는 동일한 객체를 가지게 된다. 그러므로 아래와 같이 하면 이미 mbr3이 mbrHashSet에 저장되어 있으므로 mbr3과 동일한 mbr4는 저장될 수 없다.
mbrHashSet에 저장된 회원들 중 userid가 "leess"인 회원의 정보를 출력하세요.
SetTest
it = mbrHashSet.iterator();
while(it.hasNext()) {
Member m = it.next();
if(m.getUserid().equals("leess"))
m.memberInfo();
}
mbrHashSet에 저장되어진 회원들 중 usrid가 "leess"인 회원을 삭제하세요.
SetTest
// 제거
it = mbrHashSet.iterator();
while(it.hasNext()) {
Member m = it.next();
if(m.getUserid().equals("leess"))
it.remove();
}
// 확인
it = mbrHashSet.iterator();
while(it.hasNext()) {
it.next().memberInfo();;
}
-- mbrHashSet에 저장된 요소(Element)를 삭제하려면 Iterator를 이용한 it.remove();을 사용하여 삭제한다.
2. LinkedHashSet
1) Member 클래스의 객체만을 저장할 수 있는 LinkedHashSet 객체 mbrLinkedHashSet를 생성한다.
SetTest
Set<Member> mbrLinkedHashSet = new LinkedHashSet<Member>();
2) Member 클래스의 객체 6개를 생성하여 mbrLinkedHashSet에 저장한다.
SetTest
mbrLinkedHashSet.add(new Member("youjs", "qwer1234$", "유재석"));
mbrLinkedHashSet.add(new Member("eom", "qwer1234$", "엄정화"));
mbrLinkedHashSet.add(new Member("kanghd", "qwer1234$", "강호동"));
mbrLinkedHashSet.add(new Member("leess", "qwer1234$", "이순신"));
mbrLinkedHashSet.add(new Member("kimth", "qwer1234$", "김태희"));
mbrLinkedHashSet.add(new Member("kangkc", "qwer1234$", "강감찬"));
mbrLinkedHashSet.add(new Member("leess", "qwer1234$", "이순신"));
Member mbr11 = new Member("suji", "abcd1234", "수지");
Member mbr22 = new Member("suji", "abcd1234", "수지");
mbrLinkedHashSet.add(mbr11);
mbrLinkedHashSet.add(mbr22);
Member mbr33 = new Member("chaew", "abcd1234", "차은우");
Member mbr44 = new Member("car", "abcd0070", "차금우");
mbr33 = mbr44;
mbrLinkedHashSet.add(mbr33);
mbrLinkedHashSet.add(mbr44);
3) mbrLinkedHashSet에 저장되어진 모든 회원들의 정보를 출력하시오.
SetTest
Iterator<Member> itr = mbrLinkedHashSet.iterator();
while(itr.hasNext()) {
Member m = itr.next();
m.memberInfo();
}
mbrLinkedHashSet에 저장된 회원들 중 userid가 "leess"인 회원의 정보를 출력하세요.
SetTest
itr = mbrLinkedHashSet.iterator();
while(itr.hasNext()) {
Member m = itr.next();
if(m.getUserid().equals("leess"))
m.memberInfo();
}
mbrLinkedHashSet에 저장되어진 회원들 중 usrid가 "leess"인 회원을 삭제하세요.
SetTest
// 삭제
itr = mbrLinkedHashSet.iterator();
while(itr.hasNext()) {
Member m = itr.next();
if(m.getUserid().equals("leess"))
itr.remove();
}
// 조회
itr = mbrLinkedHashSet.iterator();
while(itr.hasNext()) {
itr.next().memberInfo();
}
-- HashSet과 동일하고 출력되는 순서만 다르다.
Ⅱ. Properties
properties란?
-- HashMap의 구버전인 Hashtable을 상속받아 구현한 것으로, Hashtable 은 키와 값(Object, Object)의 형태로 저장하는데 비해서 Properties 는 (String 키, String 밸류값)의 형태로 저장하는 단순화된 컬렉션 클래스이다.
-- 키는 고유해야 하며 중복을 허락하지 않는다. 중복된 값을 넣으면 마지막에 넣은 값으로 덮어씌운다.
-- 주로 어플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용되며, 데이터를 파일로 부터 읽고 쓰는 편리한 기능을 제공한다.
-- Package(my.day16.collection)에 Class(PropertiesTest)를 생성한다.
PropertiesTest
Properties prop = new Properties();
prop.setProperty("jdk", "http://www.oracle.com/technetwork/java/javase/downloads/index.html");
prop.setProperty("eclipse", "http://www.iei.or.kr");
prop.setProperty("eclipse", "http://www.eclipse.org/downloads/eclipse-packages/");
prop.setProperty("oracle", "http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html");
String url = prop.getProperty("eclipse");
System.out.println(url);
System.out.println("\n=========================\n");
@SuppressWarnings("unchecked")
Enumeration<String> en = (Enumeration<String>) prop.propertyNames();
while(en.hasMoreElements()) {
String key = en.nextElement();
System.out.print(key);
System.out.print("=");
System.out.println(prop.getProperty(key));
}
Ⅲ. Eclipse와 sqldeveloper 연결(JDBC)
-- New-Java Project(JDBC) 생성
-- JavaProject(JDBC)에 Folder(SQL) 생성
-- Folder(SQL)에 File(jdbc_myorauser에서작업한것.sql) 생성
-- 'sqldeveloper.exe - 바로가기' 열기
-- eclipse에서 jdbc_myorauser에서작업한것.sql을 더블클릭하면 sqldeveloper가 열린다.
(SQL)SYS
create user myorauser identified by eclass
default tablespace users;
grant CREATE VIEW
, UNLIMITED TABLESPACE
, CREATE DATABASE LINK
, CREATE SEQUENCE
, CREATE SESSION
, ALTER SESSION
, CREATE SYNONYM
to myorauser;
grant RESOURCE, CONNECT to myorauser;
alter user myorauser quota unlimited on users;
▷ 결과
User MYORAUSER이(가) 생성되었습니다.
Grant을(를) 성공했습니다.
Grant을(를) 성공했습니다.
User MYORAUSER이(가) 변경되었습니다.
-- sqldeveloper를 끄고 eclipse를 통해 다시 켠 후 연결한다.
Ⅳ. Sequence(시퀀스)
Sequence(시퀀스)란?
: 어떤 컬럼에 숫자값을 부여하고자 할 때 숫자값이 입력할 때마다 자동증가되어지도록 할 때 사용되어지는 것
(SQL)HR
create table tbl_waiting
(waitingno number
,name varchar2(20)
);
create sequence seq_waiting
start with 1
increment by 1
nomaxvalue
nominvalue
nocycle
nocache;
insert into tbl_waiting(waitingno , name) values(seq_waiting.nextval, '한석규');
insert into tbl_waiting(waitingno , name) values(seq_waiting.nextval, '두석규');
insert into tbl_waiting(waitingno , name) values(seq_waiting.nextval, '세석규');
insert into tbl_waiting(waitingno , name) values(seq_waiting.nextval, '네석규');
insert into tbl_waiting(waitingno , name) values(seq_waiting.nextval, '오석규');
commit;
select *
from tbl_waiting;
생성되어진 sequence 조회하기
(SQL)HR
select *
from user_sequences;
sequence 삭제하기
(SQL)HR
drop sequence seq_waiting;
순환하는 sequence 생성
(SQL)HR
create table tbl_circle
(circleno number
,name varchar(20)
);
create sequence seq_circle
start with 1
increment by 1
maxvalue 5
minvalue 2
cycle
nocache;
-- minvalue는 start with 값보다 같거나 작아야 한다.
(SQL)HR
create sequence seq_circle
start with 1
increment by 1
maxvalue 5
minvalue 0
cycle
nocache;
▷ 결과
Sequence SEQ_CIRCLE이(가) 생성되었습니다.
(SQL)HR
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
insert into tbl_circle(circleno, name) values(seq_circle.nextval, '똘똘이');
commit;
select * from tbl_circle;
-- Java Project(JDBC)에 Package(jdbc.day01.sql), Class(JdbcTest01DDL, main method 포함) 생성
-- Class 2개(JdbcTest02Insert, JdbcTest03Select) JdbcTest01DD복사하여 생성
1. 오라클 드라이버 로딩
오라클 드라이버의 역할
1) OracleDriver를 메모리에 로딩시켜 준다.
2) OracleDriver 객체를 생성해 준다.
3) OracleDriver 객체를 DriverManager에 등록시켜 준다.
→ DriverManager는 여러 드라이버들을 Vector에 저장하여 관리해 주는 클래스이다.
package jdbc.day01.sql;
import java.sql.*;
public class JdbcTest01DDL {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// >>> 1. OracleDriver(오라클 드라이버) 로딩 <<<
Class.forName("oracle.jdbc.driver.OracleDriver");
// >>> 2. 어떤 오라클 서버와 연결을 할래? <<<
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");
// >>> 3. 연결한 오라클서버에 SQL문(편지)을 전달할 Statement 객체(우편배달부) 생성하기 <<<
stmt = conn.createStatement();
// >>> 4. SQL문을 작성한다. <<<
String sql1 = "create table jdbc_tbl_memo\n"+
"(no number(4)\n"+
",name Nvarchar2(20)\n"+
",msg Nvarchar2(200)\n"+
",writeday date default sysdate\n"+
",constraint PK_jdbc_tbl_memo_no primary key(no)\n"+
")";
String sql2 = " create sequence jdbc_seq_memo "
+" start with 1 "
+" increment by 1 "
+" nomaxvalue "
+" nominvalue "
+" nocycle "
+" nocache ";
String sql3 = "insert into jdbc_tbl_memo(no, name, msg) values(jdbc_seq_memo.nextval, '이순신', '안녕하세요? 이순신 인사드립니다.')";
// >>> 5. Statement stmt(우편배달부)가 작성된 SQL문(편지)을 오라클 서버에 보내서 실행이 되어지도록 한다. <<<
boolean isSQL1 = stmt.execute(sql1);
boolean isSQL2 = stmt.execute(sql2);
boolean isSQL3 = stmt.execute(sql3);
System.out.println("확인용 isSQL1 => " + isSQL1);
System.out.println("확인용 isSQL2 => " + isSQL2);
System.out.println("확인용 isSQL3 => " + isSQL3);
} catch (ClassNotFoundException e) {
System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// >>> 6. 사용하였던 자원 반납하기 <<<
try {
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
-- sql developer에서 확인하면 myorauser 계정에 jdbc_tbl_memo 테이블과 jdbc_seq_memo 시퀀스가 생성되었고, '이순신'이 입력한 '안녕하세요? 이순신 인사드립니다.'가 입력되어 있는 것을 확인할 수 있다.
package jdbc.day01.sql;
import java.sql.*;
import java.util.Scanner;
public class JdbcTest02Insert {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
Scanner sc = new Scanner(System.in);
try {
// >>> 1. OracleDriver(오라클 드라이버) 로딩 <<<
Class.forName("oracle.jdbc.driver.OracleDriver");
// >>> 2. 어떤 오라클 서버와 연결을 할래? <<<
System.out.print("▷ 연결할 오라클 서버의 IP주소 : ");
String IP = sc.nextLine();
System.out.print("▷ 오라클 사용자명 : ");
String userName = sc.nextLine();
System.out.print("▷ 암호 : ");
String passwd = sc.nextLine();
conn = DriverManager.getConnection("jdbc:oracle:thin:@"+IP+":1521:xe", userName, passwd);
// >>> 3. 연결한 오라클서버에 SQL문(편지)을 전달할 Statement 객체(우편배달부) 생성하기 <<<
stmt = conn.createStatement();
// >>> 4. SQL문을 작성한다. <<<
System.out.print("▷ 작성자명 : ");
String name = sc.nextLine();
System.out.print("▷ 내용 : ");
String msg = sc.nextLine();
String sql = "insert into jdbc_tbl_memo(no, name, msg) \n" + " values(jdbc_seq_memo.nextval, '"+name+"', '"+msg+"')";
// >>> 5. Statement stmt(우편배달부)가 작성된 SQL문(편지)을 오라클 서버에 보내서 실행이 되어지도록 한다. <<<
int n = stmt.executeUpdate(sql);
System.out.println(n+"개 행이 입력됨.");
} catch (ClassNotFoundException e) {
System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// >>> 6. 사용하였던 자원 반납하기 <<<
try {
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
sc.close();
}
}
}
-- 다른 사람의 IP, 오라클 사용자명, 암호를 맞게 입력(Scanner) 후 작성자명과 내용을 입력하여 상대방 memo 테이블에 데이터를 입력할 수 있다.
-- 상대방의 컴퓨터에서 방화벽 허용이 되어 있어야 한다.
package jdbc.day01.sql;
import java.sql.*;
public class JdbcTest03Select {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
// >>> 2. 어떤 오라클 서버와 연결을 할래? <<<
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");
// >>> 3. 연결한 오라클서버에 SQL문(편지)을 전달할 Statement 객체(우편배달부) 생성하기 <<<
stmt = conn.createStatement();
// >>> 4. SQL문을 작성한다. <<<
String sql = "select no, name, msg\n"+
" ,to_char(writeday, 'yyyy-mm-dd hh24:mi:ss') AS WRITEDAY\n"+
"from jdbc_tbl_memo\n"+
"order by no desc";
// >>> 5. Statement stmt(우편배달부)가 작성된 SQL문(편지)을 오라클 서버에 보내서 실행이 되어지도록 한다. <<<
rs = stmt.executeQuery(sql);
System.out.println("--------------------------------------------------------");
System.out.println("글번호\t글쓴이\t글내용\t작성일자");
System.out.println("--------------------------------------------------------");
while(rs.next()) {
int no = rs.getInt(1);
String name = rs.getString(2);
String msg = rs.getString(3);
String writeday = rs.getString(4);
System.out.println(no+"\t"+name+"\t"+msg+"\t"+ writeday);
}
} catch (ClassNotFoundException e) {
System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// >>> 6. 사용하였던 자원 반납하기 <<<
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
-- 자신의 데이터베이스에 입력되어있는 데이터를 eclipse에서 확인할 수 있다.
문제 ▷▷ 다른 사람의 IP, 오라클 사용자명, 암호를 맞게 입력(Scanner) 후 상대방 memo 테이블에 있는 데이터를 조회해 보세요.
package jdbc.day01.sql;
import java.sql.*;
import java.util.Scanner;
public class JdbcTest03Select2 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
Scanner sc = new Scanner(System.in);
try {
// >>> 1. OracleDriver(오라클 드라이버) 로딩 <<<
Class.forName("oracle.jdbc.driver.OracleDriver");
// >>> 2. 어떤 오라클 서버와 연결을 할래? <<<
System.out.print("▷ 연결할 오라클 서버의 IP주소 : ");
String IP = sc.nextLine();
System.out.print("▷ 오라클 사용자명 : ");
String userName = sc.nextLine();
System.out.print("▷ 암호 : ");
String passwd = sc.nextLine();
conn = DriverManager.getConnection("jdbc:oracle:thin:@"+IP+":1521:xe", userName, passwd);
// >>> 3. 연결한 오라클서버에 SQL문(편지)을 전달할 Statement 객체(우편배달부) 생성하기 <<<
stmt = conn.createStatement();
// >>> 4. SQL문을 작성한다. <<<
String sql = "select no, name, msg\n"+
" ,to_char(writeday, 'yyyy-mm-dd hh24:mi:ss') AS WRITEDAY\n"+
"from jdbc_tbl_memo\n"+
"order by no desc";
// >>> 5. Statement stmt(우편배달부)가 작성된 SQL문(편지)을 오라클 서버에 보내서 실행이 되어지도록 한다. <<<
rs = stmt.executeQuery(sql);
System.out.println("--------------------------------------------------------");
System.out.println("글번호\t글쓴이\t글내용\t작성일자");
System.out.println("--------------------------------------------------------");
while(rs.next()) {
int no = rs.getInt(1);
String name = rs.getString(2);
String msg = rs.getString(3);
String writeday = rs.getString(4);
System.out.println(no+"\t"+name+"\t"+msg+"\t"+ writeday);
}
} catch (ClassNotFoundException e) {
System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// >>> 6. 사용하였던 자원 반납하기 <<<
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close(); // 초기치에 null을 주었으므로 nullpointerexception이 나올 수 있기 때문에 null이 아닌 값만 받도록 한다.
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}