본문 바로가기

수업내용

[Day28][Java] HashMap / HashSet / LinkedHashSet / properties / Eclipse와 sqldeveloper 연결(JDBC) / Sequence

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();
			}
		}
	}
}