멀티캠퍼스 JAVA 백엔드 부트캠프/정리

멀티캠퍼스 백엔드 개발자 취업캠프(Java) 입과 6주차 정리

5ein 2023. 3. 13. 10:00

2023.03.06

지금까지 학습내용

-  DBMS, RDBMS

-  DM schema, relation, entity, attribute(특징, 속성), instance, constraints(제약조건(pk, fk, not null, varchar2, char ))

-  DDL(create, alter, drop)

-  DML(CRUD), DCL

-  기본함수, 집계함수, 그룹함수

-  집합, 조인(inner-join, left/right-outer-join, self-join)

 

특징 = 특성 = 속성 è property = attribute = item = field

 

엔티티 기준: 각각의 사이트를 보고 사용자가 어떤 (메뉴, 기능, 서비스) 사용할까? ex) 게시판

 

정규화

- 제 1 정규형(1NF): 원자값이어야 함.

- 제 2 정규형(2NF): 불완전종속X => 기본키(PK)에 의해 다른 항목들이 완전종속이어야 함.

- 제 3 정규형(3NF): 이행종속X => 비이행종속이어야 함. (a -> b -> c )

 

더보기

제 2 정규형

제 2 정규형

 

제 3 정규형

제 3 정규형

 

팀플 스키마 문제 1

더보기

==> 49페이지 ERD 보고, 테이블을 생성하고, pk설정, fk설정해서 ERD완성 (편집됨)

==> 테이블에 insert/delete/update 2개이상씩 해보고, 이상현상이 발생하는지 확인할 .

==> 삽입시, 많은 Null 발생시키지 않는지 확인

==> 삭제시, 의도치 않은 컬럼까지 삭제하지는 않는지 확인

==> 갱신시, 정보가 불일치하지는 않는지 확인

==> 테이블이 1NF, 2NF, 3NF 따르는지 확인

==> 테이블 만들고, 조작하는 것은, 디비버를 사용해도 되고, SQL문을 사용해도 됩니다.

 

ERD:

팀플 1 ERD
-- inner join
SELECT *
FROM SUBJECT1 s , "RECORD" r 
WHERE s.강좌이름 = r.강좌이름 

-- 이렇게 할 수도 있음
SELECT r.학생번호, si.학생이름, s.강좌이름  
FROM "RECORD" r 
INNER JOIN STUDENT_INFORMATION si ON si.학생번호 = r.학생번호 
INNER JOIN SUBJECT1 s ON s.강좌이름 = r.강좌이름 

-- 위와 똑같은 내용을 이렇게 할 수도 있음
SELECT r.학생번호, si.학생이름, s.강좌이름  
FROM "RECORD" r, STUDENT_INFORMATION si, SUBJECT1 s 
WHERE r.학생번호 = si.학생번호 AND r.강좌이름 = s.강좌이름

-- left outer JOIN 
SELECT r.학생번호, r.성적, si.학생이름, si.학과  
FROM "RECORD" r 
LEFT OUTER JOIN STUDENT_INFORMATION si 
on (r.학생번호 = si.학생번호) 

-- right outer JOIN 
SELECT d.학과, si.학생번호, si.학생이름
FROM STUDENT_INFORMATION si 
RIGHT OUTER JOIN DEPARTMENT d 
ON (si.학과 = d.학과)
두번 쨰 inner join결과

 

팀플 스키마 문제 2

더보기

1. 참고사이트 지정

2. ERD

3. 이상현상 확인

4. 조인 결과

 

사이트는 다음(카카오) 웹툰 사이트로 정했다  https://webtoon.kakao.com/original-webtoon?tab=sun

 ERD:

팀플2 ERD

 조인 결과: 

-- inner join 이용해서 아이디, 이름, 웹툰제목, 장르 출력
SELECT h.아이디, m.이름,  h.웹툰제목, w.장르  
FROM "찜한작품" h 
INNER JOIN "웹툰정보" w ON h.웹툰제목  = w.웹툰제목 
INNER JOIN "회원정보" m  ON h.아이디  = m.아이디

-- inner join 이용해서 아이디, 이름, 웹툰제목, 장르 출력 (위와 동일한 것을 다른식으로 표현)
SELECT h.아이디, m.이름,  h.웹툰제목, w.장르 
FROM "찜한작품" h, "회원정보" m, "웹툰정보" w
WHERE h.아이디 = m.아이디 AND h.웹툰제목 = w.웹툰제목

-- 이중 요일이 월 인것만 출력
SELECT h.아이디, m.이름,  h.웹툰제목, w.장르 
FROM "찜한작품" h, "회원정보" m, "웹툰정보" w
WHERE h.아이디 = m.아이디 AND h.웹툰제목 = w.웹툰제목
AND w.요일 = '월'
첫 번쨰 inner join 결과

 

강사님이 지적해준 문제점: PK로 웹툰제목을 잡았는데 웹툰제목이 같은것이 있다면 어떻게 할 것 인가요?

==> 해답: 각 웹툰마다 id를 부여해준다!

 

id부여해서 혼자 만들어 보기도 해봐야겠다!

스키마 중 영화예매, 버스예매, 항공기 예매 같은 것을 만드는것이 난이도가 높다고 하셨다.

 

정규화 셀프 체크

1.       정규화가  필요한가?

이상현상이 발생

 

2.       정규화 하지 않으면 나타나는 현상?

이상현상

 

3.       언제 이상현상이 발생하는가?

삽입이상, 갱신이상, 삭제이상

 

4.       이상현상이  나타나는가?

중복

 

5.       이상현상을 해결하는 방법은?

분할

 

6.       분할해 나가는 과정은?

정규화 과정

 

7.       정규화 순서 1)1정규화 ==> 2)2정규화 ==> 3)3정규화

                                 원자값                 완전종속            비이행종속                                                                                   

8.       데이터를 추출할 때는 분할해놓은 테이블들을 join해서 가지고 와야 한다.

          on join 기준이 되는 컬럼을 지정

          기준에 해당하는 값들이 양쪽 테이블에 있는 경우 : inner join

          기준에 해당하는 값이 없는 경우: outer join

 

지금까지 학습내용

DML, CRUD

Create : sysdate, default, sequence, unique

Read : where, distinct, order by, and, or, not, in

Update : where, cell단위()

Delete : where, record단위(),

     commit/rollback 대상(취소가능) 

     Delete <==> Truncate 비교(취소불가능)

 

 

1. VO 뭐지? (Value Object = DTO, Data Transfer Object)

● 많은 양의 데이터를 전달할 목적으로 사용하는 가방역할의 클래스

● 값들만 넣어서 전달하고, 전달된 값들을 꺼내어 사용하는 역할

● 자바에서는 여러 데이터를 전달할 때 하나씩 전달하지 않고, 데이터들을 넣어서 전달할 클래스를 만들어 사용한다.

 

2. DAO 뭐지? (Data Access Object)

● DB에 접근하여 DB관련 처리를 담당하는 클래스

● 기능별로 메서드를 구현함.

 

3. CUD 결과?

실행된 row 개수(정수)

 

4. R 결과?

실행된 테이블 형태(컬럼 + 인스턴스)


2023.03.07

기능 = function = 함수 = method ==> 동적인 처리

 

리턴값이 있다면 void 대신 리턴값의 타입을 써줘야한다.

더보기

반환값 연습!

package 자바DB연결;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Random;

public class 반환값연습 {
	// 부품은 기능을 처리하기 위해서 만든 부품.
	// ex)휴대폰의 기능 ==> 함수(메서드)
	// 자동완성 ==> 컨트롤 + 스페이스바
	public void add2() {
		System.out.println("더하기 기능을 수행합니다.");
	}

	public int add(int x, int y) {
		return x + y; // x + y 결과값은 int 이기 때문에 뒤에 public옆에 int 적기
	}

	// 자바는 입력값이 다르다면, 메서드이름을 동일하게 사용할 수 있다.
	public double add(double x, int y) {
		return x + y; // 자바에서는 하나라도 double이면 결과는 무조건 double!!
	}

	public String add(String x, String y) {
		return x + y; // +연산자인 경우 하나라도 String이면 결과는 무조건 String!!
	}

	public String add(int x, String y) {
		return x + y; // +연산자인 경우 하나라도 String이면 결과는 무조건 String!!
	}

	public int[] add() {
		int[] x = { 1, 2, 3 };
		return x; // x앖에 있는 타입(int[])을 써준다.
	}

	public Date getDate() {
		Date date = new Date(); // import java.until.Date;
		return date; // 실행했을 때: 년월일시분초요일 ==> Date로 넘김
	}

	public int getHour() {
		Date date = new Date(); // import java.until.Date;
		return date.getHours(); // 시 11 만 넘김 ==> int로 넘김
	}

	public Random getRandom() {
		Random r = new Random();
		return r; // r을 리턴하니까 r 앞에있는 Random을 public 옆에 써줌
	}

	public int getRandom2() {
		Random r = new Random();
		return r.nextInt(); // -21억~21억
		// r.nextInt() 을 리턴하니까 결과인 int를 public 옆에 써줌
	}

	public ArrayList getList() {
		ArrayList list = new ArrayList();
		list.add("감자");
		list.add("고구마");
		return list; // list를 리턴하니까 list 앞에있는 ArrayList를 public 옆에 써줌
	}

	public HashSet getSet() {
		HashSet bag = new HashSet();
		bag.add("휴지");
		bag.add("펜");
		return bag; // bag을 리턴하니까 bag 앞에있는 HashSet을 public 옆에 써줌
	}

//	public Connection getConnection(String url, String user, String password) {
//	//연결처리..
//	Connection con = 연결처리하는 커넥션..;
//	return con;
//}

}

: 뒤에 나오는 것이 반환값의 타입이다!

 

JDBC

DB연결을 배웠다. insert와 update, delete를 했다.

더보기

insert

package 자바DB연결;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class DB연결테스트2 {

	public static void main(String[] args) {
		
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공."); //1단계  확인.
			
			
			// 2.오라클 11g에 연결해보자.(java --- oracle) 
			// DBeaver에서 oracle에 오른쪽마우스 -> edit connection 누르고 정보확인
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			//String data = JOptionPane.showInputDialog("이름");//input을 string 넣어준것처럼 !!
			Connection con = DriverManager.getConnection(url, user, password); //Connection
			System.out.println("2. 오라클 연결 성공."); //2단계  확인.
			
			
			// 3. 
			//ipaddress 의 부품 ==> InetAddress
			//String url = "http://www.naver.com"; 이렇게 해도 url을 부품으로 인식 못합 
			//URL u = new URL(url); 이것도 해주어야 부품으로 인식 가능
			//자바는 부품조립식 이여서, String에 넣은 문자열을 특정한 부품으로 인식하지 못함.
			//특정한 부품으로 인식 하려면 그 부품으로 만들어 주어야 한다.
			//SQL부품으로 만들어주어야 함.
			//PreparedStatement 가 SQL부품!!
			
			String sql = "insert into hr.BBS values ('7', '화요일2', '일주 중2번째 날', 'win')";
			PreparedStatement ps = con.prepareStatement(sql);
			//con부품으로 sql스트링에 있는 것 SQL부품으로 만들어주세요.
			System.out.println("3. SQL문 부품(객체)으로 만들어주기."); //3단계  확인.
			
			
			//4. 
			ps.executeUpdate(); //insert, update, delete문만!! sql문 실행결과가 int
			System.out.println("4. SQL문 오라클로 보내기 성공."); //4단계  확인.
			
			//System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

delete

package 자바DB연결;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class DB연결테스트3_delete {

	public static void main(String[] args) {
		
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공."); //1단계  확인.
			
			
			// 2.오라클 11g에 연결해보자.(java --- oracle) 
			// DBeaver에서 oracle에 오른쪽마우스 -> edit connection 누르고 정보확인
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			//String data = JOptionPane.showInputDialog("이름");//input을 string 넣어준것처럼 !!
			Connection con = DriverManager.getConnection(url, user, password); //Connection
			System.out.println("2. 오라클 연결 성공."); //2단계  확인.
			
			
			// 3. 
			//ipaddress 의 부품 ==> InetAddress
			//String url = "http://www.naver.com"; 이렇게 해도 url을 부품으로 인식 못합 
			//URL u = new URL(url); 이것도 해주어야 부품으로 인식 가능
			//자바는 부품조립식 이여서, String에 넣은 문자열을 특정한 부품으로 인식하지 못함.
			//특정한 부품으로 인식 하려면 그 부품으로 만들어 주어야 한다.
			//SQL부품으로 만들어주어야 함.
			//PreparedStatement 가 SQL부품!!
			
			String sql = "delete from hr.MEMBER where id = 'win2'";
			PreparedStatement ps = con.prepareStatement(sql);
			//con부품으로 sql스트링에 있는 것 SQL부품으로 만들어주세요.
			System.out.println("3. SQL문 부품(객체)으로 만들어주기."); //3단계  확인.
			
			
			//4. 
			ps.executeUpdate(); //insert, update, delete문만!! sql문 실행결과가 int
			System.out.println("4. SQL문 오라클로 보내기 성공."); //4단계  확인.
			
			//System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

update

package 자바DB연결;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class DB연결테스트4_update {

	public static void main(String[] args) {
		
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공."); //1단계  확인.
			
			
			// 2.오라클 11g에 연결해보자.(java --- oracle) 
			// DBeaver에서 oracle에 오른쪽마우스 -> edit connection 누르고 정보확인
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			//String data = JOptionPane.showInputDialog("이름");//input을 string 넣어준것처럼 !!
			Connection con = DriverManager.getConnection(url, user, password); //Connection
			System.out.println("2. 오라클 연결 성공."); //2단계  확인.
			
			
			// 3. 
			//ipaddress 의 부품 ==> InetAddress
			//String url = "http://www.naver.com"; 이렇게 해도 url을 부품으로 인식 못합 
			//URL u = new URL(url); 이것도 해주어야 부품으로 인식 가능
			//자바는 부품조립식 이여서, String에 넣은 문자열을 특정한 부품으로 인식하지 못함.
			//특정한 부품으로 인식 하려면 그 부품으로 만들어 주어야 한다.
			//SQL부품으로 만들어주어야 함.
			//PreparedStatement 가 SQL부품!!
			
			String sql = "update hr.MEMBER set tel = '5555' where id = 'apple' ";
			PreparedStatement ps = con.prepareStatement(sql);
			//con부품으로 sql스트링에 있는 것 SQL부품으로 만들어주세요.
			System.out.println("3. SQL문 부품(객체)으로 만들어주기."); //3단계  확인.
			
			
			//4. 
			ps.executeUpdate(); //insert, update, delete문만!! sql문 실행결과가 int
			System.out.println("4. SQL문 오라클로 보내기 성공."); //4단계  확인.
			
			//System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

그런데 main으로 돌렸기 떄문에 다른곳에서는 쓸수가 없어 좋지 않은 코드라고 하셨다.

그래서 MemberDAO와, 회원가입,회원정보수정, 회원탈퇴 파일을 생성하고 DAO에 insert,update,delete를 모두 넣었다.

==> 그런데, 이 DAO는 넣어줄 값을 하나하나 입력해주어야 해서 Scanner에서 입력한 값으로 자동으로 들어가게 하기위해 MemberDAO2, 회원가입2 java 파일 생성 하고 수정했다.

더보기

MemberDAO2.java

package 자바DB연결;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class MemberDAO2 {
	
	//메서드를 만드는 것 ==> 메서드 정의(define)!
	//메서드를 정의했다고 실행되는 것은 아니다.!
	//메서드를 쓰는 것 => 메서드 호출(call)!

	public void delete(String id) {
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			// DBeaver에서 oracle에 오른쪽마우스 -> edit connection 누르고 정보확인
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			// String data = JOptionPane.showInputDialog("이름");//input을 string 넣어준것처럼 !!
			Connection con = DriverManager.getConnection(url, user, password); // Connection
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			// ipaddress 의 부품 ==> InetAddress
			// String url = "http://www.naver.com"; 이렇게 해도 url을 부품으로 인식 못합
			// URL u = new URL(url); 이것도 해주어야 부품으로 인식 가능
			// 자바는 부품조립식 이여서, String에 넣은 문자열을 특정한 부품으로 인식하지 못함.
			// 특정한 부품으로 인식 하려면 그 부품으로 만들어 주어야 한다.
			// SQL부품으로 만들어주어야 함.
			// PreparedStatement 가 SQL부품!!

			String sql = "delete from hr.MEMBER where id = ? ";
			PreparedStatement ps = con.prepareStatement(sql); // PreparedStatement
			ps.setString(1, id);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			ps.executeUpdate(); // insert, update, delete문만!! sql문 실행결과가 int
			System.out.println("4. SQL문 오라클로 보내기 성공.");

			// System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void update(String id, String tel) {
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			// DBeaver에서 oracle에 오른쪽마우스 -> edit connection 누르고 정보확인
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			// String data = JOptionPane.showInputDialog("이름");//input을 string 넣어준것처럼 !!
			Connection con = DriverManager.getConnection(url, user, password); // Connection
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			// ipaddress 의 부품 ==> InetAddress
			// String url = "http://www.naver.com"; 이렇게 해도 url을 부품으로 인식 못합
			// URL u = new URL(url); 이것도 해주어야 부품으로 인식 가능
			// 자바는 부품조립식 이여서, String에 넣은 문자열을 특정한 부품으로 인식하지 못함.
			// 특정한 부품으로 인식 하려면 그 부품으로 만들어 주어야 한다.
			// SQL부품으로 만들어주어야 함.
			// PreparedStatement 가 SQL부품!!

			String sql = "update hr.MEMBER set tel = ? where id = ? "; // id가 ?인(조건) tel을 ?로 바꾸어라.
			PreparedStatement ps = con.prepareStatement(sql); // PreparedStatement
			ps.setString(1, tel);
			ps.setString(2, id);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			ps.executeUpdate(); // insert, update, delete문만!! sql문 실행결과가 int
			System.out.println("4. SQL문 오라클로 보내기 성공.");

			// System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// public void add2() 형식
	public void insert(String id, String pw, String name, String tel) {
		// 다른곳에서도 사용할수 있도록 static main대신 바꾸어줌.
		// 입력받을 형식과 이름을 정의해줌
		try {
			// 1.오라클 11g와 연결할 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공."); // 1단계 확인.

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			// DBeaver에서 oracle에 오른쪽마우스 -> edit connection 누르고 정보확인
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			// String data = JOptionPane.showInputDialog("이름");//input을 string 넣어준것처럼 !!
			Connection con = DriverManager.getConnection(url, user, password); // Connection
			System.out.println("2. 오라클 연결 성공."); // 2단계 확인.

			// 3. SQL문 부품(객체)으로 만들어주기
			// ipaddress 의 부품 ==> InetAddress
			// String url = "http://www.naver.com"; 이렇게 해도 url을 부품으로 인식 못합
			// URL u = new URL(url); 이것도 해주어야 부품으로 인식 가능
			// 자바는 부품조립식 이여서, String에 넣은 문자열을 특정한 부품으로 인식하지 못함.
			// 특정한 부품으로 인식 하려면 그 부품으로 만들어 주어야 한다.
			// SQL부품으로 만들어주어야 함.
			// PreparedStatement 가 SQL부품!!

			// public void insert(String id, String pw, String name, String tel)
			// 위의 순서대로 입력받아온 값을 ?에 차례대로 넣어줌
			String sql = "insert into hr.MEMBER values (?, ?, ?, ?)"; // 물음표 연산자 사용!(따옴표X)
			PreparedStatement ps = con.prepareStatement(sql);
			// con부품으로 sql스트링에 있는 것 SQL부품으로 만들어주세요.
			// R뺴고, 인덱스 0부터 시작!!
			// 유일하게 db는 인덱스가 1부터 시작!!
			ps.setString(1, id); // ps의 1번 물음표에서 입력받은 id를 넣어줘 라는 뜻
			ps.setString(2, pw); // ps의 2번 물음표에서 입력받은 pw를 넣어줘 라는 뜻
			ps.setString(3, name);// ps의 2번 물음표에서 입력받은 name를 넣어줘 라는 뜻
			ps.setString(4, tel);// ps의 2번 물음표에서 입력받은 tel를 넣어줘 라는 뜻
			// Int 였다면 ps.setInt(1, no);
			// ==> insert into hr.MEMBER values ('a', 'a', 'a', 'a');

			System.out.println("3. SQL문 부품(객체)으로 만들어주기 성공."); // 3단계 확인.

			// 4. SQL문 오라클로 보내기
			ps.executeUpdate(); // insert, update, delete문만!! sql문 실행결과가 int
			System.out.println("4. SQL문 오라클로 보내기 성공."); // 4단계 확인.

			// System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

회원가입2.java

package 자바DB연결;

import java.util.Scanner;

public class 회원가입2 {
	public static void main(String[] args) {

		// 입력해보자.
		Scanner sc = new Scanner(System.in); // 스캐너 부풍을 사용할때 어디다 사용할지 ()안에 꼭 작성
		System.out.println("id/pw/name/tel 순으로 입력하세요."); // 어떤 형식으로 입력받을지 출력해줌

		String id = sc.next(); // scanner(스캐너)에서 입력받은 값을 string id에 넣어줌
		String pw = sc.next(); // 스캐너에서 입력받은 값을 string pw에 넣어줌
		String name = sc.next(); // 스캐너에서 입력받은 값을 string name에 넣어줌
		String tel = sc.next(); // 스캐너에서 입력받은 값을 string tel에 넣어줌

		MemberDAO2 dao = new MemberDAO2(); // MemberDAO2.java 를 dao로 사용하기 위해 생성
		dao.insert(id, pw, name, tel); // 실행했을때 스캐너로 입력받은 값을 dao로 넣어줌
	}
}

 

회원정보수정.java

package 자바DB연결;

import java.util.Scanner;

public class 회원정보수정 {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in); 
		System.out.println("id/tel 순으로 입력하세요.");

		String id = sc.next();
		String tel = sc.next();

		MemberDAO2 dao = new MemberDAO2();
		dao.update(id, tel);
	}
}

 

 회원탈퇴.java

package 자바DB연결;

import java.util.Scanner;

public class 회원탈퇴 {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		System.out.println("탈퇴할 id를 입력하세요."); 

		String id = sc.next();

		MemberDAO2 dao = new MemberDAO2(); 
		dao.delete(id); 
	}
}

정리

1.       JDBC4단계 정리

드라이버 설정 => DB연결 => SQL 객체로 만들기 => SQL 전송

 

2.       데이터를 접근해서 처리하는 클래스를 부르는 이름

Data Access Object(DAO, 다오)

 

3.       DAO 주로 넣는 기능 - 4가지

DML – CRUD – insert, select, update, delete

 

4.       DAO 주로 넣는 기능 C(insert) 사용해봄.

Create(insert)

 

5.       sql 객체를 만들었을 모르는 값을 표현하는 연산자.

? (물음표 연산자)

 

 

이후 미니 팀 문제를 주셨다.!

테이블 하나당 DAO하나! ==> CUD 완성!!

1. BbsDAO 3번에 sql 메서드 입력값을 변경

2. 게시판글쓰기.java

3. 게시판글삭제하기.java

4. 게시판수정하기.java


2023.03.08

미니 팀프로젝트를 주셨다!

-- HR.공연 definition
CREATE TABLE "HR"."공연"
(	"공연ID" VARCHAR2(100) NOT NULL ENABLE,
"제목" VARCHAR2(100) NOT NULL ENABLE,
"위치" VARCHAR2(100) NOT NULL ENABLE,
"공연시작일" DATE NOT NULL ENABLE,
"공연종료일" DATE NOT NULL ENABLE,
"가격" NUMBER(38,0) NOT NULL ENABLE,
CONSTRAINT "공연_PK" PRIMARY KEY ("공연ID")
);
CREATE UNIQUE INDEX "HR"."공연_PK" ON "HR"."공연" ("공연ID") ;
 
-- HR.예매자 definition
CREATE TABLE "HR"."예매자"
(	"전화번호" VARCHAR2(100),
"이메일" VARCHAR2(100),
"이름" VARCHAR2(100) NOT NULL ENABLE,
CONSTRAINT "예매자_PK" PRIMARY KEY ("전화번호")
) ;
CREATE UNIQUE INDEX "HR"."예매자_PK" ON "HR"."예매자" ("전화번호") ;

-- HR.예매정보 definition
CREATE TABLE "HR"."예매정보" 
   (	"예매번호" NUMBER(38,0) NOT NULL ENABLE, 
	"공연ID" VARCHAR2(100) NOT NULL ENABLE, 
	"예매전화번호" VARCHAR2(100) NOT NULL ENABLE, 
	"예매일자" DATE NOT NULL ENABLE, 
	 CONSTRAINT "예매정보_PK" PRIMARY KEY ("예매번호")
   ) ;
  
-- HR.예매정보 foreign keys
ALTER TABLE "HR"."예매정보" ADD CONSTRAINT "FK_공연" FOREIGN KEY ("공연ID")
	  REFERENCES "HR"."공연" ("공연ID") ENABLE;
ALTER TABLE "HR"."예매정보" ADD CONSTRAINT "FK_예매자" FOREIGN KEY ("예매전화번호")
	  REFERENCES "HR"."예매자" ("전화번호") ENABLE;

-- HR.관리자 definition
CREATE TABLE "HR"."관리자"
(	"ID" VARCHAR2(100),
"PW" VARCHAR2(100)
) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;

 

 


2023.03.09

필드, 항목, 속성명, 컬럼명 같은뜻 (perperty, attribute, filed, item)

 

select는 검색결과가 있을 때 항목명과, 검색결과row를 보여주고, 검색결과가 없을 때는 항목명을 보여준다. (아무것도 안보여주는 것이 아닙!)

 

자바는 변수에 들어갈 데이터타입 변수명을 써주어야 ram 저장공간이 만들어진다.

String test = null; è 선언!

자바는 선언시 변수가 만들어지고, 변수에 들어갈 타입도 함꼐 결정된다.

 

미션1 을 완료하고 로그인 기능을 구현 (로그인 실패 => 회원가입, 로그인 성공 => 게시글 쓰기)

더보기

MemberTestUI.java

package 화면DB연결;

import javax.swing.JOptionPane;

import 자바DB연결.MemberDAO3;

public class MemberTestUI {

	public static void main(String[] args) {
		String id = JOptionPane.showInputDialog("아이디 입력");
		String pw = JOptionPane.showInputDialog("패스워드 입력");
		
		MemberDAO3 dao = new MemberDAO3();
		
		//보내는 쪽
		//1. 가방만들기
		MemberVO bag = new MemberVO();
		//2. 가방에 입력값 넣기 (set() 이용)
		bag.setId(id);
		bag.setPw(pw);
			//name, tel은 null이 들어가있는 상태
		//3. 가방을 DAO에 전달하기
		int result = dao.login(bag);
		if (result == 1) { //1:성공, 0:실패
			JOptionPane.showMessageDialog(null, "로그인 성공");
			BbsUI bbs = new BbsUI();
			bbs.open();
		}else {
			JOptionPane.showMessageDialog(null, "로그인실패");
			MemberUI2 member = new MemberUI2();
			member.open();
		} 
		
	}

}

 

BbsDAO.java

package 자바DB연결;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import 화면DB연결.BbsVO;

//테이블 하나당 DAO하나! ==> CUD를 완성!!
public class BbsDAO {

	//검색
	public BbsVO one(int NO) {
		
		ResultSet rs = null;
		
		BbsVO bag = null;
		
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password); // Connection
			System.out.println("2. 오라클 연결 성공.");

			// 3.SQL문 부품(객체)으로 만들어주기
			// 물음표 연산자 사용!(따옴표X)
			String sql = "select * from hr.BBS2 where NO = ? "; // NO가 ?인(조건)것 삭제
			PreparedStatement ps = con.prepareStatement(sql); // PreparedStatement 가 SQL부품!!
			ps.setInt(1, NO); // 만약 NO가 String이면: ps.setString(1, NO);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.SQL문 오라클로 보내기
			rs = ps.executeQuery();
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (rs.next()) {
				System.out.println("검색결과 있음. 성공.");
				int no2 = rs.getInt(1);
				String title = rs.getString(2);
				String content = rs.getString(3);
				String writer = rs.getString(4);
				System.out.println(no2 + " " + title + " " + content + " " + writer);
				
				bag = new BbsVO();
				bag.setNo(no2);
				bag.setTitle(title);
				bag.setContent(content);
				bag.setWriter(writer);
			} else {
				System.out.println("검색결과 없음. 성공.");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return bag;
	}
	
	//삭제
	public int delete(int no2) {
		int result = 0;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password); // Connection
			System.out.println("2. 오라클 연결 성공.");

			// 3.SQL문 부품(객체)으로 만들어주기
			// 물음표 연산자 사용!(따옴표X)
			String sql = "delete from hr.BBS2 where NO = ? "; // NO가 ?인(조건)것 삭제
			PreparedStatement ps = con.prepareStatement(sql); // PreparedStatement 가 SQL부품!!
			ps.setInt(1, no2); // 만약 NO가 String이면: ps.setString(1, NO);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.SQL문 오라클로 보내기
			result = ps.executeUpdate(); // insert, update, delete문만!! sql문 실행결과가 int
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("게시글 삭제 성공.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(result);
		return result;
	}

	//수정
	public int update(BbsVO bag) {
		
		int result = 0;
		
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password); // Connection
			System.out.println("2. 오라클 연결 성공.");

			// 3.SQL문 부품(객체)으로 만들어주기
			// 물음표 연산자 사용!(따옴표X)
			String sql = "update hr.BBS2 set title = ?, content = ?, writer = ? where no = ? "; // NO가 ?인(조건) CONTENT를 ?로 바꾸어라.
			PreparedStatement ps = con.prepareStatement(sql); // PreparedStatement 가 SQL부품!!
			ps.setString(1, bag.getTitle());
			ps.setString(2, bag.getContent());
			ps.setString(3, bag.getWriter());
			ps.setInt(4, bag.getNo()); 
			System.out.println("3. SQL문 부품(객체)으로 만들어주기 성공.");

			// 4.SQL문 오라클로 보내기
			result = ps.executeUpdate(); // insert, update, delete문만!! sql문 실행결과가 int
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("수정 성공.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	//작성
	public int insert(BbsVO bag) {
		
		int result = 0;
		
		try {
			// 1.오라클 11g와 연결할 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password); // Connection
			System.out.println("2. 오라클 연결 성공.");

			// 3. SQL문 부품(객체)으로 만들어주기
			// 물음표 연산자 사용!(따옴표X)
			String sql = "insert into hr.BBS2 values (?, ?, ?, ?)"; // 순서대로 입력받아온 값을 ?에 차례대로 넣어줌
			PreparedStatement ps = con.prepareStatement(sql); // PreparedStatement 가 SQL부품!!
			// con부품으로 sql스트링에 있는 것 SQL부품으로 만들어주세요.
			// R뺴고, 인덱스 0부터 시작!!
			// 유일하게 db는 인덱스가 1부터 시작!!
			ps.setInt(1, bag.getNo());
			ps.setString(2, bag.getTitle());
			ps.setString(3, bag.getContent());
			ps.setString(4, bag.getWriter());
			// Int일때: ps.setInt(1, no);
			// String일때: ps.setString(1, no);

			System.out.println("3. SQL문 부품(객체)으로 만들어주기 성공.");

			// 4. SQL문 오라클로 보내기
			result = ps.executeUpdate(); // insert, update, delete문만!! sql문 실행결과가 int
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("작성 성공");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(result);
		return result;
	}

}

 

BbsVO.java

package 화면DB연결;

public class BbsVO {
	private int no;
	private String title;
	private String content;
	private String writer;

	public int getNo() {
		return no;
	}

	// Getters/Setters 만들어주세요
	public void setNo(int no) {
		this.no = no;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	// toString도 만들어 주세요
	@Override
	public String toString() {
		return "BbsVO [no=" + no + ", title=" + title + ", content=" + content + ", writer=" + writer + "]";
	}

}

 

BbsUI.java

package 화면DB연결;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import 자바DB연결.BbsDAO;

public class BbsUI {

	public static void open() {
		JFrame f = new JFrame();
		f.setTitle("나의 게시판 화면");
		f.setSize(550, 410);

		JLabel l1 = new JLabel("게시판 글쓰기 화면");
		JLabel l2 = new JLabel("----------------------");
		JLabel l3 = new JLabel("게시판  N  O");
		JLabel l4 = new JLabel("게시판 제  목");
		JLabel l5 = new JLabel("게시판 내  용");
		JLabel l6 = new JLabel("게시판 작성자");

		JTextField t1 = new JTextField(10);
		JTextField t2 = new JTextField(10);
		JTextField t3 = new JTextField(10);
		JTextField t4 = new JTextField(10);

		JButton b1 = new JButton("게시물 작성 완료");
		JButton b2 = new JButton("게시물 수정 완료");
		JButton b3 = new JButton("게시물 삭제 완료");
		JButton b4 = new JButton("게시물 검색 완료");

		// f에 위에 있는 요소들ㅇ르 add로 붙여주어야하는데, 붙이는 순서대로 물흐르듯이 붙여주고 싶음.
		// 물 흐르듯이 붙여주는 부품이 필요
		FlowLayout flow = new FlowLayout();

		// 폰트를 설정하기 위해 font 부품 필요
		Font font = new Font("굴림", Font.BOLD, 40);
		Font font1 = new Font("굴림", Font.BOLD, 30);
		Font font2 = new Font("굴림", Font.BOLD, 25);

		////// 필요한 부품(객체)를 ram에 가져다 놓고, 준비 끝 //////
		/// 조립을 시작해보자. ///
		f.setLayout(flow);

		f.add(l1);
		f.add(l2);
		f.add(l3);
		f.add(t1);
		f.add(l4);
		f.add(t2);
		f.add(l5);
		f.add(t3);
		f.add(l6);
		f.add(t4);
		f.add(b1);
		f.add(b2);
		f.add(b3);
		f.add(b4);

		l1.setFont(font);
		l2.setFont(font1);
		l3.setFont(font1);
		l4.setFont(font1);
		l5.setFont(font1);
		l6.setFont(font1);
		t1.setFont(font1);
		t2.setFont(font1);
		t3.setFont(font1);
		t4.setFont(font1);
		b1.setFont(font2);
		b2.setFont(font2);
		b3.setFont(font2);
		b4.setFont(font2);

		t1.setBackground(Color.DARK_GRAY);
		t1.setForeground(Color.white);
		t2.setBackground(Color.DARK_GRAY);
		t2.setForeground(Color.white);
		t3.setBackground(Color.DARK_GRAY);
		t3.setForeground(Color.white);
		t4.setBackground(Color.DARK_GRAY);
		t4.setForeground(Color.white);

		b1.setBackground(Color.white);
		b1.setForeground(Color.black);
		b2.setBackground(Color.white);
		b2.setForeground(Color.black);
		b3.setBackground(Color.white);
		b3.setForeground(Color.black);
		b4.setBackground(Color.white);
		b4.setForeground(Color.black);

		f.getContentPane().setBackground(Color.lightGray);

		// 게시글 작성
		b1.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				String no = t1.getText();
				String title = t2.getText();
				String content = t3.getText();
				String writer = t4.getText();

				int no2 = Integer.parseInt(no);

				if (no.equals("")) {
					JOptionPane.showMessageDialog(f, "ID는 필수입력 항목입니다.");
				}
				BbsDAO dao = new BbsDAO();
				BbsVO bag = new BbsVO();
				bag.setNo(no2);
				bag.setTitle(title);
				bag.setContent(content);
				bag.setWriter(writer);

				int result = dao.insert(bag);
				if (result == 1) {
					JOptionPane.showMessageDialog(f, "공연 추가 성공");
					t1.setText("");
					t2.setText("");
					t3.setText("");
					t4.setText("");
				} else {
					JOptionPane.showMessageDialog(f, "공연 추가 실패");
				}
			}
		});// b1

		// 게시글 수정

		b2.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				String no = t1.getText();
				String title = t2.getText();
				String content = t3.getText();
				String writer = t4.getText();

				int no2 = Integer.parseInt(no);

				BbsDAO dao = new BbsDAO();
				BbsVO bag = new BbsVO();

				bag.setNo(no2);
				bag.setTitle(title);
				bag.setContent(content);
				bag.setWriter(writer);

				int result = dao.update(bag);

				if (result == 1) {
					JOptionPane.showMessageDialog(f, "공연수정 성공");
					t1.setText("");
					t2.setText("");
					t3.setText("");
					t4.setText("");
				} else {
					JOptionPane.showMessageDialog(f, "공연수정 실패, 재입력 해주세요.");
					t2.setText("");
					t3.setText("");
					t4.setText("");
				}
			}
		});// b3

		// 게시글 삭제
		b3.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String no = t1.getText();
				int no2 = Integer.parseInt(no);

				BbsDAO dao = new BbsDAO();
				int result = dao.delete(no2);
				if (result == 1) {
					JOptionPane.showMessageDialog(f, "공연삭제 성공");
					t1.setText("");
					t2.setText("");
					t3.setText("");
					t4.setText("");
				} else {
					JOptionPane.showMessageDialog(f, "공연삭제 실패, 재입력 해주세요");
					t1.setText("");
					t2.setText("");
					t3.setText("");
					t4.setText("");
				}
			}
		});

		// 검색
		b4.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				String no = t1.getText();
				int no2 = Integer.parseInt(no);

				BbsDAO dao = new BbsDAO();
				BbsVO bag = dao.one(no2);
				if (bag != null) {
					t2.setText(bag.getTitle());
					t3.setText(bag.getContent());
					t4.setText(bag.getWriter());
					t2.setBackground(Color.pink);
					t3.setBackground(Color.pink);
					t4.setBackground(Color.pink);
				} else {
					JOptionPane.showMessageDialog(f, "검색결과 없음");
					t2.setText("");
					t3.setText("");
					t4.setText("");
				}
			}
		});

		// 맨끝으로
		f.setVisible(true);
	}

}

 

 MemberDAO.java

package 자바DB연결;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import 화면DB연결.MemberVO;

public class MemberDAO3 {

	// 메서드를 만드는 것 ==> 메서드 정의(define)!
	// 메서드를 정의했다고 실행되는 것은 아니다.!
	// 메서드를 쓰는 것 => 메서드 호출(call)!

	// 검색
	public MemberVO one(String id) {

		ResultSet rs = null; // int를 -> ResultSet로 바꿈, 0 -> null로 바꿈
		// 항목명 + 결과데이터를 담고있는 테이블
		// 기본형 정수/실수/문자/논리만 값으로 초기화
		// 나머지 데이터형(참조형) 주소가 들어있음.
		// 참조형 변수를 초기화 할 때는 null(주소가 없다는 의미)

		MemberVO bag = null;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "select * from hr.MEMBER where id = ? "; // *를 뺴면 sql문법에러가 난다.
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, id);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			rs = ps.executeQuery(); // select문 전송시 정수X,테이블O executeUpdate 대신 executeQuery
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (rs.next()) { // 검색결과가 있는지 여부는 rs.next()
				// true이면 있다라는 의미, false이면 없다라는 의미
				System.out.println("검색결과 있음. 성공.");
				String id2 = rs.getString(1); // id
				String pw = rs.getString(2); // pw
				String name = rs.getString(3); // name
				String tel = rs.getString(4); // tel
				System.out.println(id2 + " " + pw + " " + name + " " + tel);
				// 검색결과를 검색화면 UI부분에 넣어주어야 함. (여기에jop넣으면 안됨)
				bag = new MemberVO();
				bag.setId(id2);
				bag.setPw(pw);
				bag.setName(name);
				bag.setTel(tel);
			} else {
				System.out.println("검색결과 없음. 성공.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		// return id, pw, name, tel은 XXXX! ==> 파이썬만 가능
		// return 뒤에는 반드시 여러 데이터를 묶어서 리턴해주어야 함 ==> 자바는 가방을 만들어줘야함
		// 검색결과가 있을 때는 bag에 데이터가 들어있음.
		// 검색결과가 없을 때는 bag에 무엇이 들어있나? null
		return bag;
	}

	// 탈퇴
	public int delete(String id) {

		int result = 0;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "delete from hr.MEMBER where id = ? ";
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, id);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			result = ps.executeUpdate();
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) { // 원래 delete는 성공하면 1이나 1보다 큰수가 나올수도 있다. 그럴떄는 >= 1
				System.out.println("탈퇴 성공.");
			}
		} catch (Exception e) { // 얘일때는 result가 그대로 0
			e.printStackTrace();
		}
		System.out.println(result);
		return result; // result변수를 전달하는 것이 아니고 0 or 1인 값만 전달된거
	}

	// 수정
	public int update(MemberVO bag) {
		// 1. 가방을 받아서 저장해두자.
		// 2. 필요할 때 가방에서 값들을 하나씩 꺼내자.

		int result = 0;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "update hr.MEMBER set tel = ? where id = ? ";
			PreparedStatement ps = con.prepareStatement(sql);
			// 2. 필요할 때 가방에서 값들을 하나씩 꺼내자.
			ps.setString(1, bag.getId());
			ps.setString(2, bag.getTel());
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			result = ps.executeUpdate(); // sql문 실행결과가 int(실행횟수)
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("수정 성공.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result; // result변수를 전달하는 것이 아니고 0 or 1인 값만 전달된거
	}

	// 가입
	public int insert(MemberVO bag) {
		// 1. 가방을 받아서 변수에 넣어주세요.

		// 다른곳에서도 사용할수 있도록 static main대신 바꾸어줌.
		// 입력받을 형식과 이름을 정의해줌
		int result = 0; // 자신을 포함하는 가로에서 사용가능

		try {
			// 1.오라클 11g와 연결할 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3. SQL문 부품(객체)으로 만들어주기
			String sql = "insert into hr.MEMBER values (?, ?, ?, ?)";
			PreparedStatement ps = con.prepareStatement(sql);
			// 2. 가방에서 값들을 하나씩 꺼내쓰세요.
			ps.setString(1, bag.getId());
			ps.setString(2, bag.getPw());
			ps.setString(3, bag.getName());
			ps.setString(4, bag.getTel());

			System.out.println("3. SQL문 부품(객체)으로 만들어주기 성공.");

			// 4. SQL문 오라클로 보내기
			result = ps.executeUpdate(); // 성공하면 1이 나옴 //result를 이미 밖에서 선언 해줌, 값에 넣기만 하면됨
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("회원가입 성공!");
			}
		} catch (Exception e) {
			// insert가 제대로 안된 경우, 위험한 상황이라 판단하고
			// catch가 실행된다.
			// 실행된 Row수가 없으므로 Result에 0을 넣어주자.
			// result = 0; //이미 밖에서 선언 해줌
			e.printStackTrace(); // 에러를 프린트해라
		}
		System.out.println(result); // result 값 찍어보기
		return result; // void도 바꿔줘야함
		// result변수를 전달하는 것이 아니고 0 or 1인 값만 전달된거
	}

	// 로그인
	public int login(MemberVO bag) {
		// 1. 가방을 받아서 변수에 넣어주세요.

		int result = 0; //없는 경우

		try {
			// 1.오라클 11g와 연결할 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3. SQL문 부품(객체)으로 만들어주기
			String sql = "select * from hr.MEMBER where id = ? and pw = ?";
			PreparedStatement ps = con.prepareStatement(sql);
			// 2. 가방에서 값들을 하나씩 꺼내쓰세요.
			ps.setString(1, bag.getId());
			ps.setString(2, bag.getPw());
			System.out.println("3. SQL문 부품(객체)으로 만들어주기 성공.");

			// 4. SQL문 오라클로 보내기
			ResultSet rs = ps.executeQuery(); // 성공하면 1이 나옴 //result를 이미 밖에서 선언 해줌, 값에 넣기만 하면됨
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (rs.next()) {
				System.out.println("로그인 성공!");
				result = 1;
			}	
			ps.close(); 
			con.close(); 
			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result; 
	} //login

}

 

MemberUI.java

package 화면DB연결;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import 자바DB연결.MemberDAO3;

public class MemberUI2 {

	public static void open() {
		JFrame f = new JFrame();
		f.setTitle("나의 회원가입 화면");
		f.setSize(630, 480);

		JLabel l1 = new JLabel("<<<< 회원가입화면 >>>>");
		JLabel l2 = new JLabel("아이디");
		JLabel l3 = new JLabel("패스워드");
		JLabel l4 = new JLabel("이 름");
		JLabel l5 = new JLabel("전화번호");

		JTextField t1 = new JTextField(10);
		JTextField t2 = new JTextField(10);
		JTextField t3 = new JTextField(10);
		JTextField t4 = new JTextField(10);

		JButton b1 = new JButton("회원가입 처리");
		JButton b2 = new JButton("회원탈퇴 처리");
		JButton b3 = new JButton("회원수정 처리");
		JButton b4 = new JButton("회원검색 처리");
		
		// 가입기능
		b1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("회원가입처리");
				String id = t1.getText();
				String pw = t2.getText();
				String name = t3.getText();
				String tel = t4.getText(); // ""

				if (id.equals("")) { // 기본형 4가지만 == 로 값을 비교 가능!
					JOptionPane.showMessageDialog(f, "id는 필수입력항목입니다.");
				}
				MemberDAO3 dao = new MemberDAO3();

				// 1. 가방을 만들어주세요.
				MemberVO bag = new MemberVO();
				// 2. 가방에 값들을 넣어주세요.
				bag.setId(id);
				bag.setPw(pw);
				bag.setName(name);
				bag.setTel(tel);
				// 3. 값들이 들어있는 가방을 전달하자.
				int result = dao.insert(bag);// 1 or 0

				if (result == 1) {
					JOptionPane.showMessageDialog(f, "회원가입 성공");
				} else {
					JOptionPane.showMessageDialog(f, "회원가입 실패, 재입력해주세요.");
				}
			}// action
		}); // b1

		// 탈퇴기능
		b2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("회원탈퇴처리");
				String id = t1.getText();

				MemberDAO3 dao = new MemberDAO3();
				int result = dao.delete(id);
				if (result == 1) {
					JOptionPane.showMessageDialog(f, "회원탈퇴 성공");
				} else {
					JOptionPane.showMessageDialog(f, "회원탈퇴 실패, 재입력해주세요.");
				}
			}// action
		}); // b2

		// 수정기능
		b3.addActionListener(new ActionListener() {
			// 1. 가방을 만들자
			// 2. 가방에 값을 넣자.
			// 3. 가방을 전달하자.
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("회원수정처리");
				String id = t1.getText(); // 조건
				String tel = t4.getText(); // 바꾸는 항목

				MemberDAO3 dao = new MemberDAO3();

				// 1. 가방을 만들자
				MemberVO bag = new MemberVO();
				// 2. 가방에 값을 넣자.
				bag.setId(id);
				bag.setTel(tel);
				// 3. 가방을 전달하자.
				int result = dao.update(bag);

				if (result == 1) {
					JOptionPane.showMessageDialog(f, "회원수정 성공");
				} else {
					JOptionPane.showMessageDialog(f, "회원수정 실패, 재입력해주세요.");
				}
			}// action
		}); // b3
		
		// 검색기능
		b4.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("회원검색처리");
				String id = t1.getText();

				MemberDAO3 dao = new MemberDAO3();
				MemberVO bag = dao.one(id); //MemberVO
				if (bag != null) {
					t2.setText(bag.getPw());
					t3.setText(bag.getName());
					t4.setText(bag.getTel());
					t2.setBackground(Color.pink);
					t3.setBackground(Color.pink);
					t4.setBackground(Color.pink);
				} else {
					JOptionPane.showMessageDialog(f, "검색결과 없음");
					t2.setText("");
					t3.setText("");
					t4.setText("");
				}
			}// action
		}); // b4

		// f에 위에 있는 요소들을 add로 붙여주어야하는데,
		// 붙이는 순서대로 물흐르듯이 붙여주고 싶음.
		// 물흐르듯이 붙여주는 부품이 필요
		FlowLayout flow = new FlowLayout();

		// 폰트를 설정하기 위해 font부품 필요
		Font font = new Font("궁서", Font.BOLD, 40);

		//////////// 필요한 부품(객체)를 ram에 가져다 놓고, 준비 끝 ///////
		/// 조립을 시작해보자. ///
		f.setLayout(flow);

		f.add(l1);
		f.add(l2);
		f.add(t1);
		f.add(l3);
		f.add(t2);
		f.add(l4);
		f.add(t3);
		f.add(l5);
		f.add(t4);
		f.add(b1);
		f.add(b2);
		f.add(b3);
		f.add(b4);

		l1.setFont(font);
		l2.setFont(font);
		l3.setFont(font);
		l4.setFont(font);
		l5.setFont(font);
		t1.setFont(font);
		t2.setFont(font);
		t3.setFont(font);
		t4.setFont(font);
		b1.setFont(font);
		b2.setFont(font);
		b3.setFont(font);
		b4.setFont(font);

		t1.setBackground(Color.yellow);
		t1.setForeground(Color.blue);
		t2.setBackground(Color.yellow);
		t2.setForeground(Color.blue);
		t3.setBackground(Color.yellow);
		t3.setForeground(Color.blue);
		t4.setBackground(Color.yellow);
		t4.setForeground(Color.blue);

		b1.setBackground(Color.white); // 배경색
		b1.setForeground(Color.red); // 글자색
		b2.setBackground(Color.white);
		b2.setForeground(Color.red);
		b3.setBackground(Color.white);
		b3.setForeground(Color.red);
		b4.setBackground(Color.white);
		b4.setForeground(Color.red);

		f.getContentPane().setBackground(Color.green);
		// 맨 끝으로~~~~~
		f.setVisible(true);

	}

}

 

 MemeberVO.java

package 화면DB연결;

//RAM에 만드는 저장공간을 만든다.
public class MemberVO {
	// MemberVO가방에 넣은 데이터는 Member테이블에 들어갈 예정
	// 각 컬럼과 일치시켜 줌.
	private String id;
	private String pw;
	private String name;
	private String tel;

	// 하나의 변수당 set/get 하나씩 만들어줌.
	// set/get 전체 한번에 나오게 하기: 우클릭->source->generate getters and setters
	//alt + shift + sr
	
	// 가방에 하나씩 값을 넣어주어야 함. ==> setter
	// id: seti + 컨트롤 + 스페이스바 ==> 자동셍성 pw: setp
	public void setId(String id) {
		this.id = id;
	}

	// 가방에 하나씩 값을 꺼내주어야 함. ==>getter
	// id: geti + 컨트롤 + 스페이스바 ==> 자동셍성 pw: getp
	public String getId() {
		return id;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getPw() {
		return pw;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	// 가방에 어떤 값들이 들어있는지 string으로 다 찍어볼 수 있다.
	// 우클릭->source->generate toString()
	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", pw=" + pw + ", name=" + name + ", tel=" + tel + "]";
	}

}

 

 

 


2023.03.10

여러개 가져오는것을 배웠다 가방 컨테이너 역할을 할 부품인 (ArrayList)를 이용하는것을 배웠다!

 

MemeberDAO.java

package 자바DB연결;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import 화면DB연결.MemberVO;

public class MemberDAO3 {
	
	// 메서드를 만드는 것 ==> 메서드 정의(define)!
	// 메서드를 정의했다고 실행되는 것은 아니다.!
	// 메서드를 쓰는 것 => 메서드 호출(call)!

	// 여러개 가져오기
	public ArrayList<MemberVO> list() { // 검색하려면 ()안에 적어주기
		ResultSet rs = null; // 항목명 + 결과데이터를 담고있는 테이블

		// 가방들 넣어줄 큰 컨테이너 역할을 부품이 필요!
		// ArrayList
		ArrayList<MemberVO> list = new ArrayList<>(); // 앞 꺽쇠에 뭘가져올지 적는것
		// ArrayList<MemberVO> ==> MemberVO만 들어간 arraylist라는 의미

		MemberVO bag = null;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "select * from hr.MEMBER"; // 조건주지 않고 다 가져옴
			PreparedStatement ps = con.prepareStatement(sql);
			// ps.setString(1, id); //?가 없어졌기 때문에 필요없음 삭제!
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			rs = ps.executeQuery();
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			while (rs.next()) { // 검색결과가 있는지 여부는 rs.next()
				// true이면 있다라는 의미, false이면 없다라는 의미
				// 1. 검색결과가 있으면,
				//System.out.println("검색결과 있음. 성공.");
				// 2. 각 컬럼에서 가져오자
				String id2 = rs.getString(1); // id
				String pw = rs.getString(2); // pw
				String name = rs.getString(3); // name
				String tel = rs.getString(4); // tel
				//System.out.println(id2 + " " + pw + " " + name + " " + tel);
				// 검색결과를 검색화면 UI부분에 넣어주어야 함. (여기에jop넣으면 안됨)
				// 3. 가방을 만들자
				bag = new MemberVO(); // 가방만들어서
				bag.setId(id2); // 가방에다 쫙 넣자
				bag.setPw(pw);
				bag.setName(name);
				bag.setTel(tel);

				// 4. list에 bag을 추가해주자.
				list.add(bag);
			} // while로 바뀌었기 때문에 if-else의 else삭제!
			ps.close();
			rs.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		// return id, pw, name, tel은 XXXX! ==> 파이썬만 가능
		// return 뒤에는 반드시 여러 데이터를 묶어서 리턴해주어야 함 ==> 자바는 가방을 만들어줘야함
		// 검색결과가 있을 때는 bag에 데이터가 들어있음.
		// 검색결과가 없을 때는 bag에 무엇이 들어있나? null
		return list;
	}

	// 검색
	public MemberVO one(String id) {

		ResultSet rs = null; // int를 -> ResultSet로 바꿈, 0 -> null로 바꿈
		// 항목명 + 결과데이터를 담고있는 테이블
		// 기본형 정수/실수/문자/논리만 값으로 초기화
		// 나머지 데이터형(참조형) 주소가 들어있음.
		// 참조형 변수를 초기화 할 때는 null(주소가 없다는 의미)

		MemberVO bag = null;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "select * from hr.MEMBER where id = ? "; // *를 뺴면 sql문법에러가 난다.
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, id);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			rs = ps.executeQuery(); // select문 전송시 정수X,테이블O executeUpdate 대신 executeQuery
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (rs.next()) { // 검색결과가 있는지 여부는 rs.next()
				// true이면 있다라는 의미, false이면 없다라는 의미
				System.out.println("검색결과 있음. 성공.");
				String id2 = rs.getString(1); // id
				String pw = rs.getString(2); // pw
				String name = rs.getString(3); // name
				String tel = rs.getString(4); // tel
				System.out.println(id2 + " " + pw + " " + name + " " + tel);
				// 검색결과를 검색화면 UI부분에 넣어주어야 함. (여기에jop넣으면 안됨)
				bag = new MemberVO();
				bag.setId(id2);
				bag.setPw(pw);
				bag.setName(name);
				bag.setTel(tel);
			} else {
				System.out.println("검색결과 없음. 성공.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		// return id, pw, name, tel은 XXXX! ==> 파이썬만 가능
		// return 뒤에는 반드시 여러 데이터를 묶어서 리턴해주어야 함 ==> 자바는 가방을 만들어줘야함
		// 검색결과가 있을 때는 bag에 데이터가 들어있음.
		// 검색결과가 없을 때는 bag에 무엇이 들어있나? null
		return bag;
	}

	// 탈퇴
	public int delete(String id) {

		int result = 0;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "delete from hr.MEMBER where id = ? ";
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, id);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			result = ps.executeUpdate();
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) { // 원래 delete는 성공하면 1이나 1보다 큰수가 나올수도 있다. 그럴떄는 >= 1
				System.out.println("탈퇴 성공.");
			}
		} catch (Exception e) { // 얘일때는 result가 그대로 0
			e.printStackTrace();
		}
		System.out.println(result);
		return result; // result변수를 전달하는 것이 아니고 0 or 1인 값만 전달된거
	}

	// 수정
	public int update(MemberVO bag) {
		// 1. 가방을 받아서 저장해두자.
		// 2. 필요할 때 가방에서 값들을 하나씩 꺼내자.

		int result = 0;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "update hr.MEMBER set tel = ? where id = ? ";
			PreparedStatement ps = con.prepareStatement(sql);
			// 2. 필요할 때 가방에서 값들을 하나씩 꺼내자.
			ps.setString(1, bag.getId());
			ps.setString(2, bag.getTel());
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			result = ps.executeUpdate(); // sql문 실행결과가 int(실행횟수)
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("수정 성공.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result; // result변수를 전달하는 것이 아니고 0 or 1인 값만 전달된거
	}

	// 가입
	public int insert(MemberVO bag) {
		// 1. 가방을 받아서 변수에 넣어주세요.

		// 다른곳에서도 사용할수 있도록 static main대신 바꾸어줌.
		// 입력받을 형식과 이름을 정의해줌
		int result = 0; // 자신을 포함하는 가로에서 사용가능

		try {
			// 1.오라클 11g와 연결할 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3. SQL문 부품(객체)으로 만들어주기
			String sql = "insert into hr.MEMBER values (?, ?, ?, ?)";
			PreparedStatement ps = con.prepareStatement(sql);
			// 2. 가방에서 값들을 하나씩 꺼내쓰세요.
			ps.setString(1, bag.getId());
			ps.setString(2, bag.getPw());
			ps.setString(3, bag.getName());
			ps.setString(4, bag.getTel());

			System.out.println("3. SQL문 부품(객체)으로 만들어주기 성공.");

			// 4. SQL문 오라클로 보내기
			result = ps.executeUpdate(); // 성공하면 1이 나옴 //result를 이미 밖에서 선언 해줌, 값에 넣기만 하면됨
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("회원가입 성공!");
			}
		} catch (Exception e) {
			// insert가 제대로 안된 경우, 위험한 상황이라 판단하고
			// catch가 실행된다.
			// 실행된 Row수가 없으므로 Result에 0을 넣어주자.
			// result = 0; //이미 밖에서 선언 해줌
			e.printStackTrace(); // 에러를 프린트해라
		}
		System.out.println(result); // result 값 찍어보기
		return result; // void도 바꿔줘야함
		// result변수를 전달하는 것이 아니고 0 or 1인 값만 전달된거
	}

	// 로그인
	public int login(MemberVO bag) {
		// 1. 가방을 받아서 변수에 넣어주세요.

		int result = 0; // 없는 경우

		try {
			// 1.오라클 11g와 연결할 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3. SQL문 부품(객체)으로 만들어주기
			String sql = "select * from hr.MEMBER where id = ? and pw = ?";
			PreparedStatement ps = con.prepareStatement(sql);
			// 2. 가방에서 값들을 하나씩 꺼내쓰세요.
			ps.setString(1, bag.getId());
			ps.setString(2, bag.getPw());
			System.out.println("3. SQL문 부품(객체)으로 만들어주기 성공.");

			// 4. SQL문 오라클로 보내기
			ResultSet rs = ps.executeQuery(); // 성공하면 1이 나옴 //result를 이미 밖에서 선언 해줌, 값에 넣기만 하면됨
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (rs.next()) {
				System.out.println("로그인 성공!");
				result = 1;
			}
			ps.close();
			con.close();
			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	} // login

}

 

MemberUI.java

package 화면DB연결;

import java.awt.FlowLayout;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import 자바DB연결.MemberDAO3;

public class MemberUI5 {

	public static void main(String[] args) {
		// 프로그램 시작하자 마자 db에서 데이터를 가지고 와서 화면을 만들어주고 싶음.
		JFrame f = new JFrame();
		f.setSize(500, 700);
		
		MemberDAO3 dao = new MemberDAO3();
		ArrayList<MemberVO> list = dao.list();
		
		String[] header = {"아이디", "패스워드", "이름", "전화번호"};
		Object[][] all = new String[list.size()][4]; //타입이 섞여있으면 string대신 object 넣으면됨
		
		if (list.size() == 0) {
			System.out.println("검색결과 없음.");
		} else {
			System.out.println("검색결과는 전체 " + list.size() + "개 입니다.");
			for (int i = 0; i < all.length; i++) { //13개의 가방, 13개의 행
				all[i][0] = list.get(i).getId();
				all[i][1] = list.get(i).getPw();
				all[i][2] = list.get(i).getName();
				all[i][3] = list.get(i).getTel();
			}
		}//else
		
		JTable table = new JTable(all, header);
		JScrollPane scroll = new JScrollPane(table);
		f.setLayout(new FlowLayout());
		f.add(scroll);
		
		f.setVisible(true);
	}//main

}

 

MemberVo.java

package 화면DB연결;

//RAM에 만드는 저장공간을 만든다.
public class MemberVO {
	// MemberVO가방에 넣은 데이터는 Member테이블에 들어갈 예정
	// 각 컬럼과 일치시켜 줌.
	private String id;
	private String pw;
	private String name;
	private String tel;

	// 하나의 변수당 set/get 하나씩 만들어줌.
	// set/get 전체 한번에 나오게 하기: 우클릭->source->generate getters and setters
	//alt + shift + sr
	
	// 가방에 하나씩 값을 넣어주어야 함. ==> setter
	// id: seti + 컨트롤 + 스페이스바 ==> 자동셍성 pw: setp
	public void setId(String id) {
		this.id = id;
	}

	// 가방에 하나씩 값을 꺼내주어야 함. ==>getter
	// id: geti + 컨트롤 + 스페이스바 ==> 자동셍성 pw: getp
	public String getId() {
		return id;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getPw() {
		return pw;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	// 가방에 어떤 값들이 들어있는지 string으로 다 찍어볼 수 있다.
	// 우클릭->source->generate toString()
	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", pw=" + pw + ", name=" + name + ", tel=" + tel + "]";
	}

}

이후 나머지 시간에는

미니 팀프로젝트로 짰던 SQL 스토리를 변형하여 자신의 self 미니 프로젝트를 하는것이 미션이었다.

너무 거창하게 하지 않아도 된다고 하셨다!


2023.03.11

mlp에서 이러닝 강의들어야하는것 5강을 들었다 배웠던것을 다시 복습하는것같아 좋았고, 그와중에 몰랐던것과 까먹은 것도 있었다. 이번엔 정말 잊지 말아야지!

 

미니 팀프로젝트 계획을 짜봤다.(공연 목록)

공연정보[ID PK, 이름, 장소, 가격, 공연시작일, 공연종료일]
(ui 공연정보 검색 등을 화면에 다 보여줌)
(공연추가, 공연삭제, 공연수정, 공연검색 버튼)
(공연이름, 장소, 가격, 공연시작일, 공연종료 적는 칸)


2023.03.12

으앙 ㅠㅠ 분명 오늘 코딩했는데 깃허브에 올리는것을 까먹어 버렸다 ㅠㅠㅠ 너무 아쉬워 ㅠㅠ 한칸이 텅 비어 버렸다 ㅠㅠ

다음부터는 안까먹게 알람을 맞춰놓았다. 잊지말자!!

 

Result set은 RS

 

- Setbounds xy좌표 정할 수 있대

- 버튼 사이즈 변경하는법

JButton btn1=new JButton("test");

btn1.setPreferredSize(new Dimension(150, 20));

add(btn1);

 

어제 계획 짰던것을 만들어 보았다. 

그런데 공연테이블을 불러오는데 그것을 새로고침 하고싶은것에서 막혔다. 구글링도 해보고, 강사님께 여쭈어도 보며 해결할수 있었다. 뿌듯했다!

이름을 한글로 하지 않고 영어로 만들도록 해야겠다.

 

공연정보UI.java

package Project01;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class 공연정보UI {
	private static JTable table;
	private static JScrollPane scroll;

	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setTitle("공연정보");
		f.setSize(530, 600);
		f.setLayout(new FlowLayout());
		f.getContentPane().setBackground(Color.LIGHT_GRAY);

		Font font1 = new Font("나눔스퀘어", Font.BOLD, 40);
		Font font2 = new Font("나눔스퀘어", Font.BOLD, 20);

		JLabel title = new JLabel("공연정보");
		JLabel l1 = new JLabel("공연ID");
		JLabel l2 = new JLabel("제   목");
		JLabel l3 = new JLabel("위   치");
		JLabel l4 = new JLabel("가   격");
		JLabel l5 = new JLabel("시작일");
		JLabel l6 = new JLabel("종료일");

		JTextField t1 = new JTextField(10);
		JTextField t2 = new JTextField(10);
		JTextField t3 = new JTextField(10);
		JTextField t4 = new JTextField(10);
		JTextField t5 = new JTextField(10);
		JTextField t6 = new JTextField(10);

		JButton b1 = new JButton("공연 추가");
		JButton b2 = new JButton("공연 검색");
		JButton b3 = new JButton("공연 수정");
		JButton b4 = new JButton("공연 삭제");

		b1.setPreferredSize(new Dimension(200, 50));
		b2.setPreferredSize(new Dimension(200, 50));
		b3.setPreferredSize(new Dimension(200, 50));
		b4.setPreferredSize(new Dimension(200, 50));

		title.setFont(font1);
		l1.setFont(font2);
		l2.setFont(font2);
		l3.setFont(font2);
		l4.setFont(font2);
		l5.setFont(font2);
		l6.setFont(font2);
		t1.setFont(font2);
		t2.setFont(font2);
		t3.setFont(font2);
		t4.setFont(font2);
		t5.setFont(font2);
		t6.setFont(font2);
		b1.setFont(font2);
		b2.setFont(font2);
		b3.setFont(font2);
		b4.setFont(font2);

		// 공연정보 불러오기---
		JPanel panel = new JPanel();

		JButton b = new JButton("🔃"); // 새로고침버튼
		b.setPreferredSize(new Dimension(55, 50));
		b.setFont(font2);
		b.setBackground(Color.darkGray);
		b.setForeground(Color.white);
		b.setHorizontalAlignment(SwingConstants.CENTER);

		공연정보DAO dao = new 공연정보DAO();
		ArrayList<공연정보VO> list = dao.list();

		String[] header = { "ID", "공연제목", "위치", "가격", "공연시작일", "공연종료일" };
		Object[][] all = new Object[list.size()][6];
		if (list.size() > 0) {
			for (int i = 0; i < all.length; i++) {
				all[i][0] = list.get(i).getID();
				all[i][1] = list.get(i).get제목();
				all[i][2] = list.get(i).get위치();
				all[i][3] = list.get(i).get가격();
				all[i][4] = list.get(i).get공연시작일();
				all[i][5] = list.get(i).get공연종료일();
			}
		}

		table = new JTable(all, header);
		table.setPreferredSize(new Dimension(500, 250));

		scroll = new JScrollPane(table);
		scroll.setPreferredSize(new Dimension(500, 250));

		panel.add(scroll);

		// 새로고침
		b.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				공연정보DAO dao = new 공연정보DAO();
				ArrayList<공연정보VO> list = dao.list();

				String[] header = { "ID", "공연제목", "위치", "가격", "공연시작일", "공연종료일" };
				Object[][] all = new Object[list.size()][6];
				if (list.size() > 0) {
					for (int i = 0; i < all.length; i++) {
						all[i][0] = list.get(i).getID();
						all[i][1] = list.get(i).get제목();
						all[i][2] = list.get(i).get위치();
						all[i][3] = list.get(i).get가격();
						all[i][4] = list.get(i).get공연시작일();
						all[i][5] = list.get(i).get공연종료일();
					}
				}

				table = new JTable(all, header);
				table.setPreferredSize(new Dimension(500, 250));

				scroll = new JScrollPane(table);
				scroll.setPreferredSize(new Dimension(500, 250));

				panel.removeAll();
				panel.add(scroll);
				panel.revalidate();

				// 테이블 눌렀을때 행 전체 JOptinonPane으로 보이게 하기
				table.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent e) {
						// 클릭한 위치의 행번호
						int rowNo = table.getSelectedRow();

						Object ID = table.getModel().getValueAt(rowNo, 0);// 0,0
						Object 제목 = table.getModel().getValueAt(rowNo, 1);// 0,1
						Object 위치 = table.getModel().getValueAt(rowNo, 2);// 0,2
						Object 가격 = table.getModel().getValueAt(rowNo, 3);// 0,3
						Object 공연시작일 = table.getModel().getValueAt(rowNo, 4);// 0,4
						Object 공연종료일 = table.getModel().getValueAt(rowNo, 5);// 0,5
						JOptionPane.showMessageDialog(table,
								ID + " | " + 제목 + " | " + 위치 + " | " + 가격 + " | " + 공연시작일 + " | " + 공연종료일);
					}
				});
			}
		});

		// 테이블 눌렀을때 행 전체 JOptinonPane으로 보이게 하기
		table.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				// 클릭한 위치의 행번호
				int rowNo = table.getSelectedRow();

				Object ID = table.getModel().getValueAt(rowNo, 0);// 0,0
				Object 제목 = table.getModel().getValueAt(rowNo, 1);// 0,1
				Object 위치 = table.getModel().getValueAt(rowNo, 2);// 0,2
				Object 가격 = table.getModel().getValueAt(rowNo, 3);// 0,3
				Object 공연시작일 = table.getModel().getValueAt(rowNo, 4);// 0,4
				Object 공연종료일 = table.getModel().getValueAt(rowNo, 5);// 0,5
				JOptionPane.showMessageDialog(table,
						ID + " | " + 제목 + " | " + 위치 + " | " + 가격 + " | " + 공연시작일 + " | " + 공연종료일);
			}
		});

		// -- 공연정보

		// 공연 추가
		b1.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				String ID = t1.getText();
				String 제목 = t2.getText();
				String 위치 = t3.getText();
				String 가격 = t4.getText();
				String 공연시작일 = t5.getText();
				String 공연종료일 = t6.getText();

				if (ID.equals("")) {
					JOptionPane.showMessageDialog(f, "ID는 필수입력 항목입니다.");
				}
				공연정보DAO dao = new 공연정보DAO();

				공연정보VO bag = new 공연정보VO();
				bag.setID(ID);
				bag.set제목(제목);
				bag.set위치(위치);
				bag.set가격(가격);
				bag.set공연시작일(공연시작일);
				bag.set공연종료일(공연종료일);

				int result = dao.insert(bag);
				if (result == 1) {
					JOptionPane.showMessageDialog(f, "공연 추가 성공");
					t1.setText("");
					t2.setText("");
					t3.setText("");
					t4.setText("");
					t5.setText("");
					t6.setText("");
				} else {
					JOptionPane.showMessageDialog(f, "공연 추가 실패");
				}
			}
		});// b1

		// 공연ID 검색하기
		b2.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				String ID = t1.getText();

				공연정보DAO dao = new 공연정보DAO();
				공연정보VO bag = dao.one(ID);
				if (bag != null) {
					t2.setText(bag.get제목());
					t3.setText(bag.get위치());
					t4.setText(bag.get가격());
					t5.setText(bag.get공연시작일());
					t6.setText(bag.get공연종료일());
					t2.setBackground(Color.pink);
					t3.setBackground(Color.pink);
					t4.setBackground(Color.pink);
					t5.setBackground(Color.pink);
					t6.setBackground(Color.pink);
				} else {
					JOptionPane.showMessageDialog(f, "검색결과 업음");
					t2.setText("");
					t3.setText("");
					t4.setText("");
					t5.setText("");
					t6.setText("");
				}
			}
		});// b2

		// 공연정보 수정
		b3.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				String ID = t1.getText(); // 조건
				String 제목 = t2.getText(); // 바꾸는 항목 들
				String 위치 = t3.getText();
				String 가격 = t4.getText();
				String 공연시작일 = t5.getText();
				String 공연종료일 = t6.getText();

				공연정보DAO dao = new 공연정보DAO();

				공연정보VO bag = new 공연정보VO();

				bag.setID(ID);
				bag.set제목(제목);
				bag.set위치(위치);
				bag.set가격(가격);
				bag.set공연시작일(공연시작일);
				bag.set공연종료일(공연종료일);

				int result = dao.update(bag);

				if (result == 1) {
					JOptionPane.showMessageDialog(f, "공연수정 성공");
					t1.setText("");
					t2.setText("");
					t3.setText("");
					t4.setText("");
					t5.setText("");
					t6.setText("");
				} else {
					JOptionPane.showMessageDialog(f, "공연수정 실패, 재입력 해주세요.");
					t2.setText("");
					t3.setText("");
					t4.setText("");
					t5.setText("");
					t6.setText("");
				}
			}
		});// b3

		// 공연정보 삭제
		b4.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String ID = t1.getText();

				공연정보DAO dao = new 공연정보DAO();
				int result = dao.delete(ID);
				if (result == 1) {
					JOptionPane.showMessageDialog(f, "공연삭제 성공");
					t1.setText("");
					t2.setText("");
					t3.setText("");
					t4.setText("");
					t5.setText("");
					t6.setText("");
				} else {
					JOptionPane.showMessageDialog(f, "공연삭제 실패, 재입력 해주세요");
					t1.setText("");
					t2.setText("");
					t3.setText("");
					t4.setText("");
					t5.setText("");
					t6.setText("");
				}
			}
		});

		f.add(title); f.add(b);
		f.add(panel, BorderLayout.CENTER);
		f.add(l1); f.add(t1);
		f.add(l2); f.add(t2);
		f.add(l3); f.add(t3);
		f.add(l4); f.add(t4);
		f.add(l5); f.add(t5);
		f.add(l6); f.add(t6);
		f.add(b1); f.add(b2);
		f.add(b3); f.add(b4);

		f.setVisible(true);
	}

}

 

공연정보VO.java

package Project01;


public class 공연정보VO {

	private String ID;
	private String 제목;
	private String 위치;
	private String 가격;
	private String 공연시작일;
	private String 공연종료일;

	public String getID() {
		return ID;
	}
	
	public void setID(String ID) {
		this.ID = ID;
	}

	public String get제목() {
		return 제목;
	}

	public void set제목(String 제목) {
		this.제목 = 제목;
	}

	public String get위치() {
		return 위치;
	}

	public void set위치(String 위치) {
		this.위치 = 위치;
	}

	public String get가격() {
		return 가격;
	}

	public void set가격(String 가격) {
		this.가격 = 가격;
	}

	public String get공연시작일() {
		return 공연시작일;
	}

	public void set공연시작일(String 공연시작일) {
		this.공연시작일 = 공연시작일;
	}

	public String get공연종료일() {
		return 공연종료일;
	}

	public void set공연종료일(String 공연종료일) {
		this.공연종료일 = 공연종료일;
	}

	@Override
	public String toString() {
		return "공연정보VO [ID=" + ID + ", 제목=" + 제목 + ", 위치=" + 위치 + ", 가격=" + 가격 + ", 공연시작일=" + 공연시작일 + ", 공연종료일=" + 공연종료일
				+ "]";
	}

}

 

공연정보DAO.java

package Project01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class 공연정보DAO {

	// 공연정보 가져오기
	public ArrayList<공연정보VO> list() { // 검색하려면 ()안에 적어주기
		ResultSet rs = null; // 항목명 + 결과데이터를 담고있는 테이블

		// 가방들 넣어줄 큰 컨테이너 역할을 부품이 필요!
		// ArrayList
		ArrayList<공연정보VO> list = new ArrayList<>(); // 앞 꺽쇠에 뭘가져올지 적는것
		// ArrayList<공연정보VO> ==> 공연정보VO만 들어간 arraylist라는 의미

		공연정보VO bag = null;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "select * from hr.공연정보"; // 조건주지 않고 다 가져옴
			PreparedStatement ps = con.prepareStatement(sql);
			// ps.setString(1, id); //?가 없어졌기 때문에 필요없음 삭제!
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			rs = ps.executeQuery();
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			while (rs.next()) { // 검색결과가 있는지 여부는 rs.next()
				// true이면 있다라는 의미, false이면 없다라는 의미
				// 1. 검색결과가 있으면,
				// System.out.println("검색결과 있음. 성공.");
				// 2. 각 컬럼에서 가져오자
				String ID = rs.getString(1);
				String 제목 = rs.getString(2);
				String 위치 = rs.getString(3);
				String 가격 = rs.getString(4);
				String 공연시작일 = rs.getString(5);
				String 공연종료일 = rs.getString(6);
				// System.out.println(id2 + " " + pw + " " + name + " " + tel);
				// 검색결과를 검색화면 UI부분에 넣어주어야 함. (여기에jop넣으면 안됨)
				// 3. 가방을 만들자
				bag = new 공연정보VO(); // 가방만들어서
				bag.setID(ID); // 가방에다 쫙 넣자
				bag.set제목(제목);
				bag.set위치(위치);
				bag.set가격(가격);
				bag.set공연시작일(공연시작일);
				bag.set공연종료일(공연종료일);

				// 4. list에 bag을 추가해주자.
				list.add(bag);
			} // while로 바뀌었기 때문에 if-else의 else삭제!
			ps.close();
			rs.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		// return id, pw, name, tel은 XXXX! ==> 파이썬만 가능
		// return 뒤에는 반드시 여러 데이터를 묶어서 리턴해주어야 함 ==> 자바는 가방을 만들어줘야함
		// 검색결과가 있을 때는 bag에 데이터가 들어있음.
		// 검색결과가 없을 때는 bag에 무엇이 들어있나? null
		return list;
	}

	// 공연 추가하기 insert
	public int insert(공연정보VO bag) {

		int result = 0;

		try {
			// 1.오라클 11g와 연결할 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3. SQL문 부품(객체)으로 만들어주기
			String sql = "insert into hr.공연정보 values (?, ?, ?, ?, ?, ?)";
			PreparedStatement ps = con.prepareStatement(sql);
			// 2. 가방에서 값들을 하나씩 꺼내쓰세요.
			ps.setString(1, bag.getID());
			ps.setString(2, bag.get제목());
			ps.setString(3, bag.get위치());
			ps.setString(4, bag.get가격());
			ps.setString(5, bag.get공연시작일());
			ps.setString(6, bag.get공연종료일());

			System.out.println("3. SQL문 부품(객체)으로 만들어주기 성공.");

			// 4. SQL문 오라클로 보내기
			result = ps.executeUpdate();
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("공연 추가 성공!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(result);
		return result;
	}

	// 공연 검색하기 select
	public 공연정보VO one(String ID) {

		ResultSet rs = null; // 항목명 + 결과데이터를 담고있는 테이블

		공연정보VO bag = null;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "select * from hr.공연정보 where ID = ? ";
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, ID);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			rs = ps.executeQuery();
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (rs.next()) { // 검색결과가 있는지 여부는 rs.next()
				// true이면 있다라는 의미, false이면 없다라는 의미
				System.out.println("검색결과 있음. 성공.");
				String ID2 = rs.getString(1);
				String 제목 = rs.getString(2);
				String 위치 = rs.getString(3);
				String 가격 = rs.getString(4);
				String 공연시작일 = rs.getString(5);
				String 공연종료일 = rs.getString(6);
				System.out.println(ID2 + " " + 제목 + " " + 위치 + " " + 가격 + " " + 공연시작일 + " " + 공연종료일);
				// 검색결과를 검색화면 UI부분에 넣어주어야 함.
				bag = new 공연정보VO();
				bag.setID(ID2);
				bag.set제목(제목);
				bag.set위치(위치);
				bag.set가격(가격);
				bag.set공연시작일(공연시작일);
				bag.set공연종료일(공연종료일);
			} else {
				System.out.println("검색결과 없음. 성공.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bag;
	}

	// 공연 수정하기 modify
	public int update(공연정보VO bag) {
		// 1. 가방을 받아서 저장해두자.
		// 2. 필요할 때 가방에서 값들을 하나씩 꺼내자.

		int result = 0;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "update hr.공연정보 set 제목 = ?, 위치 = ?, 가격 = ?, 공연시작일 = ?, 공연종료일 = ? where ID = ? ";
			PreparedStatement ps = con.prepareStatement(sql);
			// 2. 필요할 때 가방에서 값들을 하나씩 꺼내자.
			ps.setString(1, bag.get제목());
			ps.setString(2, bag.get위치());
			ps.setString(3, bag.get가격());
			ps.setString(4, bag.get공연시작일());
			ps.setString(5, bag.get공연종료일());
			ps.setString(6, bag.getID());
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			result = ps.executeUpdate(); // sql문 실행결과가 int(실행횟수)
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("공연 수정 성공.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result; // result변수를 전달하는 것이 아니고 0 or 1인 값만 전달된거
	}

	// 공연 삭제하기 delete
	public int delete(String ID) {

		int result = 0;
		try {
			// 1.오라클 11g와 연결한 부품 설정
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("1. 오라클과 자바 연결할 부품 설정 성공.");

			// 2.오라클 11g에 연결해보자.(java --- oracle)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "oracle";
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("2. 오라클 연결 성공.");

			// 3.
			String sql = "delete from hr.공연정보 where ID = ? "; // 관리자로 바꿔야하나?
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, ID);
			System.out.println("3. SQL문 부품(객체)으로 만들어주기.");

			// 4.
			result = ps.executeUpdate();
			System.out.println("4. SQL문 오라클로 보내기 성공.");
			if (result == 1) {
				System.out.println("공연 삭제 성공.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(result);
		return result;
	}
	// 로그인 추가할수있으면..
}

 

튜닝도 하고싶었지만 하루가 벌써 가버렸다!


결점이 없는 상태로 스키마를 짜야 한다.

 

크루드 중에서는 R(select) 가장 많이 사용한다.

조인중에서는 inner join 가장 많이 쓴다.

 

산업기사 DB부분에  80퍼센트가  수업 내용이기 때문에 한번 시도해보는 것도 나쁘지 않다.

 

면접에 자주나오는 질문

더보기

1. db에서 저장할 대상을 일컫는 말은? 

entity


2. 엔티티는 db에서 무엇으로 만들어주는가? 

table


3. 테이블의 열을 부르는 말은?(2개 이상) 

item, field, attribute, property


4. sql문을 역할에 따라 3가지로 분류, 해당되는 sql문을 2개 이상
data definition language(DDL) : create, alter, drop => schema design
data manipulation language(DML) : insert, select, update, delete ⇒ CRUD

data control language(DCL) : create user, drop user 계정생성, 백업/복구


5. 스키마와 인스턴스를 비교 설명
schema : 데이터를 저장하기 위한 틀+ 제약조건
instance : 실제로 테이블에 저장하는 데이터


6.insert할 때 행단위로 처리되는가? 열단위로 처리되는가?
행단위


7. 테이블에서 행을 부르는 말은?(2개 이상) 

row, record


8. pk를 왜 설정하는가? 

primary key, 개체 무결성


9. fk를 왜 설정하는가? 

foreign key, 참조 무결성


10. constraints는 무엇인가? 예를 2개 이상
제약조건, 데이타 타입, unique, pk, fk


11. sql에서 조건을 명시할 때 사용하는 키워드는? 

where

프로젝트한것에 대해 면접에서 이걸 만들었는지 이걸위해 했는지 이런거 물어볼 수 있음!

 

자바는 모두 스프링을 사용하기 때문에 스프링을 쓰면 자바 개발자라고 없음.