고래씌

[JDBC] 2-1. JDBC 이용해 오라클 DBMS 접근, Builder 본문

Database/JDBC

[JDBC] 2-1. JDBC 이용해 오라클 DBMS 접근, Builder

고래씌 2023. 12. 1. 17:36

1. JDBC 이용해 오라클 DBMS 접근

ⓞ 오라클에서 JDBC 계정 생성

- JDBC 계정을 생성하기에 앞서, 시스템 관리자 계정에서 권한을 먼저 주어야 계정 생성을 성공할 수 있다.

 

 

① 오라클 SQL 에서 MEMBER 테이블 생성

 

 

 

 

② Eclipse에서 다음과 같이 파일 만들어 둠

 

 

③ Member 클래스

 VO(Value Object): DB테이블의 한 행에 대한 데이터를 기록하기위한 저장용 객체

 

 

▶ 유사용어
 - DTO(Data Transfer Object)
 - DO(Domin Object)
 - Entity(jpa에서 사용)
 - bean(스프링에서 사용)

 

 

▶ VO 조건
 1) 반드시 캡슐화 적용
 2) 기본생성자 및 매개변수 생성자를 작성해야한다.
 3) 모든필드에 대해 getter 메소드를 작성해야한다(setter는 필수는 아님)

 

 

▶ 기존 객체 생성 방식
1. 생성자를 이용한 객체 생성
: 객체 생성시 매개변수로 데이터를 넣어줘서 객체를 생성했다

   - 단점

     1) 인자들이 많을수록 생성자또한 많아질 수 있다
     ex) Member의 경우 로그인용 생성자, 회원가입용 생성자, 로그인 요청시 객체, 마이페이지용 등등...! 생성자는 딱 필요로 하는 데이터만 담고 있는게 좋으므로 그에 맞는 생성자가 많이 필요하게 된다

     2) 매개변수의 정보를 설명할 수 없기 때문에 잘못된 위치에 데이터를 추가하게 될 위험이 있음
     ex) email이 들어갈 자리에 address가 추가된다던가...

 


2. 기본 생성자 호출 후 setter 함수를 이용한 객체 생성
: 생성자를 이용한 객체 생성방법과 비교했을때 2번 단점을 커버할 수 있다(매개변수의 정보를 설명가능)

단, 코드의 길이가 길어진다는 단점이 있다(객체의 일관성이 깨질 수 있다)

=> 빌더패턴 생성 방식 : 위 생성방식의 단점을 보완하는 새로운 디자인 패턴
(생성자에 인자가 많이 있을때 사용하는걸 고려한다)

 

 

▶  빌더를 이용시 장점
1. 불필요한 생성자 제거
2. 데이터의 순서외 상관없이 객체 생성이 가능하다
3. 명시적으로 메소드명을 선언하여 가독성이 좋음
4. 각 인자가 어떤 데이터인지 즉시 확인 가능
5. setter 함수를 만들지 않으므로 객체 일관성이 유지된다

 

package com.kh.model.vo;

import java.sql.Date;

public class Member {

//	클래스 내부에 빌더라는 이름의 클래스 생성(이너클래스)
	/*
	 * 빌더를 이용시 장점
	 * 1. 불필요한 생성자 제거
	 * 2. 데이터의 순서외 상관없이 객체 생성이 가능하다
	 * 3. 명시적으로 메소드명을 선언하여 가독성이 좋음
	 * 4. 각 인자가 어떤 데이터인지 즉시 확인 가능
	 * 5. setter 함수를 만들지 않으므로 객체 일관성이 유지된다
	 */
	public static class Builder {
		private int userNo;
		private String userId;
		private int userPwd;
		private String userName;
		private char gender;
		private int age;
		private String email;
		private String phone;
		private String address;
		private String hobby;
		private Date enrollDate;
		
//		필수 변수는 생성자에 값을 넣어줌
		public Builder(int userNo) {
			super();
			this.userNo = userNo;
		}
		
//		필드별로 메소드 만든 후, 반환값으로 빌더 객체를 리턴
		public Builder setUserId(String userId) {
			this.userId = userId;
			return this;	// 현재 빌더 객체를 반환, 메서드 체이닝 가능
		}
		
		public Builder setUserPwd(int userPwd) {
			this.userPwd = userPwd;
			return this;
		}

		public Builder setUserName(String userName) {
			this.userName = userName;
			return this;
		}

		public Builder setGender(char gender) {
			this.gender = gender;
			return this;
		}

		public Builder setAge(int age) {
			this.age = age;
			return this;
		}

		public Builder setEmail(String email) {
			this.email = email;
			return this;
		}

		public Builder setPhone(String phone) {
			this.phone = phone;
			return this;
		}

		public Builder setAddress(String address) {
			this.address = address;
			return this;
		}

		public Builder setHobby(String hobby) {
			this.hobby = hobby;
			return this;
		}

		public Builder setEnrollDate(Date enrollDate) {
			this.enrollDate = enrollDate;
			return this;
		}
		
//		빌더 메소드
		public Member build() {
			Member m = new Member();
			m.userNo = userNo;
			m.userId = userId;
			m.userPwd = userPwd;
			m.userName = userName;
			m.age = age;
			m.address = address;
			m.email = email;
			m.gender = gender;
			m.hobby = hobby;
			m.phone = phone;
			m.enrollDate = enrollDate;
			
			return m;
		}
	}
	
	@Override
	public String toString() {
		return "Member [userNo=" + userNo + ", userId=" + userId + ", userPwd=" + userPwd + ", userName=" + userName
				+ ", gender=" + gender + ", age=" + age + ", email=" + email + ", phone=" + phone + ", address="
				+ address + ", hobby=" + hobby + ", enrollDate=" + enrollDate + "]";
	}

	public int getUserNo() {
		return userNo;
	}

	public String getUserId() {
		return userId;
	}

	public int getUserPwd() {
		return userPwd;
	}

	public String getUserName() {
		return userName;
	}

	public char getGender() {
		return gender;
	}

	public int getAge() {
		return age;
	}

	public String getEmail() {
		return email;
	}

	public String getPhone() {
		return phone;
	}

	public String getAddress() {
		return address;
	}

	public String getHobby() {
		return hobby;
	}

	public Date getEnrollDate() {
		return enrollDate;
	}

	// setter 함수도 지워줘야 하나, 수정할 부분이 너무 많아지므로 주석 처리하지않음
	public void setUserNo(int userNo) {
		this.userNo = userNo;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public void setUserPwd(int userPwd) {
		this.userPwd = userPwd;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public void setGender(char gender) {
		this.gender = gender;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}

	public void setEnrollDate(Date enrollDate) {
		this.enrollDate = enrollDate;
	}
}

 

 

④ View : 사용자가 보게될 시각적인 요소를 담당(화면 => 입·출력)

■ MemberView 클래스

 

package com.kh.view;

import java.util.List;

import com.kh.controllor.MemberController;
import com.kh.model.vo.Member;


public class MemberView {
//	전역으로 쓸수 있는 Scanner 객체 생성
	private java.util.Scanner sc = new java.util.Scanner(System.in);
	
	private MemberController mc = new MemberController();
	

	/**
	 * 사용자가 보게될 화면(메인화면)
	 */
	public void mainMenu() {
		while (true) {
			System.out.println("***** 회원관리 프로그램 *****");
			System.out.println("1. 회원 추가");
			System.out.println("2. 회원 전체 조회");
			System.out.println("3. 회원 아이디로 검색");
			System.out.println("4. 회원 이름 키워드 검색");
			System.out.println("5. 회원 정보 변경");
			System.out.println("6. 회원 탈퇴");
			System.out.println("0. 프로그램 종료");
			System.out.print("이용할 메뉴 선택: ");
			int menu = Integer.parseInt(sc.nextLine());
			
			switch (menu) {
			case 1: insertMember(); break;
			case 2: selectAll(); break;
			case 3: selectByUserId(); break;
			case 4:	selectByUserName(); break;
			case 5:	updateMember(); break;
			case 6:	deleteMember();	break;
			case 0: System.out.println("프로그램을 종료합니다"); return;
			default: System.out.println("잘못 선택했습니다"); break;
			}
		}
	}

	private void deleteMember() {
		System.out.println("----- 회원 탈퇴 -----");
		System.out.print("탈퇴할 회원의 ID : ");
		String userId = sc.nextLine();
		
		mc.deleteMember(userId);
	}

	/**
	 * 사용자에게 변경할 회원의 아이디, 변경할 정보들을 입력받은 후 변경 요청하는 메소드
	 */
	private void updateMember() {
		System.out.println("----- 회원정보 변경 -----");
//		변경할 회원의 아이디
		System.out.print("변경할 회원의 아이디 : ");
		String userId = sc.nextLine();
		
//		변경할 정보들
		System.out.print("변경할 비밀번호 : ");
		int newPwd = Integer.parseInt(sc.nextLine());
		System.out.print("변경할 이메일 : ");
		String newEmail = sc.nextLine();
		System.out.print("변경할 휴대폰 번호(숫자만) : ");
		String newPhone= sc.nextLine();
		System.out.print("변경할 주소 : ");
		String newAddress = sc.nextLine();
		
		mc.updateMember(userId, newPwd, newEmail, newPhone, newAddress);
	}

	private void selectByUserName() {
		System.out.println("----- 회원 이름 키워드 검색 -----");
		System.out.print("회원 이름 키워드 입력 : ");
		String keyword = sc.nextLine();
		
		mc.selectByUserName(keyword);
	}

	/**
	 * 사용자의 아이디로 검색 요청을 처리해주는 메소드
	 */
	private void selectByUserId() {
		System.out.println("----- 회원 아이디로 검색 -----");
		System.out.print("검색할 회원의 아이디 : ");
		String userId = sc.nextLine();
		
		mc.selectByUserId(userId);
	}

	/**
	 * 회원 전체 조회 메서드
	 */
	private void selectAll() {
		System.out.println("----- 회원 전체 조회 -----");
		
//		회원 전체 조회
		mc.selectAll();
	}

//	----------------------------------------------------------------------------------------------------
//	서비스 요청 처리 후 사용자가 보게될 응답화면들
	
	public void displayData(List<Member> list) {
		System.out.println("\n조회된 데이터는 " + list.size() + "건 입니다\n");
		for (Member m : list) {
			System.out.println(m);
		}
	}
	
	public void displayNodata(String message) {
		System.out.println(message);
	}
	/**
	 * 회원 추가용 화면
	 * 추가하고자 하는 회원의 정보를 입력받아서 회원 추가 요청할 수 있는 화면
	 */
	private void insertMember() {
		System.out.println("----- 회원 추가 -----");
		
//		입력
		System.out.print("아이디 : ");
		String userId = sc.nextLine();
		
		System.out.print("비밀번호 : ");
		int userPwd = Integer.parseInt(sc.nextLine());
		
		System.out.print("이름 : ");
		String userName = sc.nextLine();
		
		System.out.print("성별(M/F) : ");
		char gender = sc.nextLine().charAt(0);
		
		System.out.print("나이 : ");
		int age = Integer.parseInt(sc.nextLine());
		
		System.out.print("이메일 : ");
		String email = sc.nextLine();
		
		System.out.print("핸드폰번호 : ");
		String phone = sc.nextLine();
		
		System.out.print("주소 : ");
		String address = sc.nextLine();
		
		System.out.print("취미(,로 공백없이 나열) : ");
		String hobby = sc.nextLine();
		
//		입력받은 정보를 가지고 회원추가 요청보내기
		mc.insertMember(userId, userPwd, userName, gender, age, email, phone, address, hobby);
	}

	public void displayOne(Member m) {
		System.out.println("\n조회된 데이터는 다음과 같습니다");
		System.out.println(m);
	}
}

 

 

 

 

⑤  Controller : View를 통해서 들어온 요청을 담당

- 해당 메소드로 전달된 데이터들을 가공처리 한 후 Dao 메소드 호출시 전달한다.
- Dao로부터 반환받은 결과에 따라 사용자가 보게될 화면을 지정한다.

 

package com.kh.controllor;

import java.sql.Date;
import java.util.ArrayList;

import com.kh.model.dao.MemberDao;
import com.kh.model.vo.Member;
import com.kh.view.MemberView;

public class MemberController {
	public void insertMember(String userId, int userPwd, String userName, char gender, int age, String email,
			String phone, String address, String hobby) {
//		1. 전달된 데이터들을 가지고 가공처리하기 => Member 객체로 변환
//		Member m = new Member(userId, userPwd, userName, gender, age, email, phone, address, hobby);
		Member m = new Member.Builder(0).setUserId(userId).setUserPwd(userPwd)
				.setUserName(userName).setGender(gender).setAge(age).setEmail(email)
				.setPhone(phone).setAddress(address).setHobby(hobby).build();
		
//		2. dao 의 insertMember 메소드 호출
		int result = new MemberDao().insertMember(m);

//		3. 결과값이 1인 경우 성공, 0인 경우 실패
		if (result == 1) {
			System.out.println("회원 추가 성공");
		} else {
			System.out.println("회원 추가 실패");
		}
	}

	public void selectAll() {
//		SELECT * FROM MEMBER;
//		SELECT -> ResultSet -> ArrayList<Member>
		ArrayList<Member> list = new MemberDao().selectAll();

//		조회 결과가 있는지 없는지 판단 후 사용자가 보게될 회면을 지정
		if (list.isEmpty()) {
//			조회된 결과가 없는 상태
			new MemberView().displayNodata("전체 조회결과가 없습니다");
		} else {
//			조회가 되었을 경우
			new MemberView().displayData(list);
		}

	}

	public void selectByUserId(String userId) {
//		SELECT
//		SELECT * FROM MEMBER WHERE USERID = '입력한 값';
//		Member
		Member m = new MemberDao().selectByUserId(userId);

//		조회 결과가 있는지 없는지 판단 후 사용자가 보게될 view 지정
		if (m == null) { // 조회결과가 없는 상태
			new MemberView().displayNodata(userId + "에 해당하는 검색 결과가 없습니다");
		} else { // 조회결과가 있는 상태
			new MemberView().displayOne(m);
		}
	}

	public void selectByUserName(String keyword) {
		ArrayList<Member> list = new MemberDao().selectByUserName(keyword);
		
		if (list.isEmpty()) {
//			검색 결과가 없을 때
//			displayNodata 함수 호출
			new MemberView().displayNodata("전체 조회결과가 없습니다");
		} else {
//			검색 결과가 있을 때
//			displayData 함수 호출
			new MemberView().displayData(list);
		}
	}

	public void updateMember(String userId, int newPwd, String newEmail, String newPhone, String newAddress) {
//		VO 객체에 입력받은 값들 담기
		Member m = new Member.Builder(0).setUserId(userId).setUserPwd(newPwd).setEmail(newEmail).setPhone(newPhone).setAddress(newAddress).build();
		
//		가공 VO 객체에 m을 dao 단에 넘기기
		int result = new MemberDao().updateMember(m);
		
		if(result > 0) {
			System.out.println("회원 정보 변경 성공");
		} else {
			System.out.println("회원 정보 변경 실패");
		}
	}

	/**
	 * 사용자가 회원 탈퇴 요청시 처리해주는 메서드
	 * @param userId -> 사용자가 입력한 회원의 아이디 값
	 */
	public void deleteMember(String userId) {
		int result = new MemberDao().deleteMember(userId);
		
		if(result > 0) {
//		회원 탈퇴 성공시
//		회원 탈퇴 성공 메세지 출력
			System.out.println("회원 탈퇴 성공");
		} else {
//		회원 탈퇴 실패시
//		회원 탈퇴 실패 메세지 출력
			System.out.println("회원 탈퇴 실패");
		}
	}
}

 

 

 

 

⑥  DAO(Data Access Object)

- Controller에게 요청받은 실질적인 기능을 수행하기 위해서 db에 직접 접근 후 sql문을 실행하고 결과값 돌려받음

 

 

JDBC용 객체
 - Connection : DB의 연결정보를 담고 있는 객체(IP주소, PORT번호, 계정명, 비밀번호)


 - (Prepared)Statement : 해당 DB에 SQL문을 전달하고 실행한 후 결과를 받아내는 객체


 - ResultSet : 내가 실행한 sql문이 select 문일 경우 조회된 결과를 담아주는 객체

 

 


 ★JDBC 처리순서★
JDBC Driver 등록 : DBMS가 제공하는 클래스 등록 (우리는 오라클 DBMS를 등록할 것)


Connection 생성 : 접속하고자 하는 db정보를 입력해서 DB에 접속(접속시 Connection생성)
                                  접속 성공하면 Connection 객체가 반환됨.


Statement 생성 : Connection 객체를 이용해서 생성

=> Statement : 완성된 sql문을 실행할 수 있는 객체

 


④ SQL문을 전달하면서 쿼리문 실행 : Statement 객체를 이용해서 sql문 실행
     → SELECT 문일 경우 - executeQuery() 메소드를 이용해서 실행
     → 나머지 DML문일 경우 - executeUpdate() 메소드를 이용하여 실행

 


⑤ 결과 반환
    → SELECT문일 경우 - 결과값은 ResultSet객체로 받기(조회된 데이터들이 담겨있음)
    → 나머지 DML일 경우 - int형 변수로 받기(처리된 행의 갯수가 담겨있음)

 


⑥ ResultSet으로 객체 담긴 데이터들을 하나씩 추출하여 vo객체로 변환 or 트랜잭션 처리(SELECT가 아닌 DML문일 경우)

 

 

⑦ 다 쓴 JDBC 용 객체 자원 반납(생성된 순서의 역순으로)
⑧ 결과를 Controller 반환

 

 

■ MemberDao 클래스

package com.kh.model.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.kh.model.vo.Member;

public class MemberDao {

	/**
	 * 사용자가 회원추가 요청시 입력했던 값을 가지고 insert 문을 실행하는 메소드
	 * 
	 * @param m : 사용자가 입력했던 아이디 ~ 취미까지의 값이 담겨있는 Member 객체2
	 * @return : insert문으로 실행한 결과 처리된 행의 갯수
	 */
	public int insertMember(Member m) {
//		INSERT 문, 처리된 행의 갯수, 트랜잭션 처리

//		0) 필요한 변수들 세팅
		int result = 0; // 처리도니 결과를 담아줄 변수(처리된 행의 갯수)
		Connection conn = null; // 접속된 db의 연결정보를 담는 변수
		Statement stmt = null; // SQL문 실행 후 결과를 받기 위한 변수
        
//		실행할 SQL문 필요(주의점 : 끝에 세미콜론이 있으면 안됨)
		String sql = "INSERT INTO MEMBER VALUES(" + "SEQ_USERNO.NEXTVAL," + "'" + m.getUserId() + "'," + "'"
				+ m.getUserPwd() + "'," + "'" + m.getUserName() + "'," + "'" + m.getGender() + "'," + "'" + m.getAge()
				+ "'," + "'" + m.getEmail() + "'," + "'" + m.getPhone() + "'," + "'" + m.getAddress() + "'," + "'"
				+ m.getHobby() + "'," + "DEFAULT" + ")";

		try {
//			1) JDBC 드라이버 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");
//			오타 or ojdbc6.jar이 누락된 경우 에러발생할 수 있다

//			2) Connection 객체 생성
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");

//			3) Statement 객체 생성
			stmt = conn.createStatement();

//			4, 5) DB에 SQL문 전달하면서 실행 후 결과 받기
			result = stmt.executeUpdate(sql);

//			6_2) 트랜잭션 처리
			if (result > 0) { // 한개 이상의 행이 insert 됨 --> 성공적으로 1행 이상이 삽입 => 커밋
				conn.commit();
			} else {
				conn.rollback();
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
//		8) 결과 반환
		return result;
	}

	/**
	 * 사용자가 회원 전체 조회 요청시 select 문을 실행해주는 메소드
	 * 
	 * @return
	 */
	public ArrayList<Member> selectAll() {
//		0) 필요한 변수들 세팅
//		조회한 결과를 담아줄 변수 => ArrayList
		ArrayList<Member> list = new ArrayList<Member>();

//		Connection, Statement, ResultSet
		Connection conn = null; // 접속된 db의 연결정보를 담는 변
		Statement stmt = null; // sql문 실행 후 결과를 받기위한 변수
		ResultSet rset = null; // SELECT 문이 실행딘 조회 결과값들이 담겨질 객체
//		finally에서 자원 반납하기 위해 try전에 세팅
		String sql = "SELECT * FROM MEMBER";
		try {
//			1) JDBC 드라이버 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");

//			2) Connection 객체 생성
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");

//			3) Statement 객체 생성
			stmt = conn.createStatement();

//			4, 5) sql문 전달 후 실행결과 받기
			rset = stmt.executeQuery(sql);

//			6_1) 현재 조회결과가 담긴 ResultSet에서 한행씩 뽑아서 VO객체에 담기
//			rset.next() : 커서를 한줄 아래로 옮겨주고(다음 행) 해당 행이 존재 할경우 true, 아니면 falus를 반환함
			while (rset.next()) {
//				현재 rset의 커서가 가리키고 있는 행에 데이터가 있다면 반복을 진행
				Member m = new Member();
				/*
				 * rset으로 부터 어떤 컬럼에 해당하는 값을 뽑을건지 제시 => 컬럼명, 컬럼 순번 권장사항 : 컬럼명으로 작성하고, 대문자로 쓰는 것을
				 * 권장함
				 * 
				 * rset.getInt(컬럼명 또는 컬럼 순번) rset.getString(컬럼명 또는 컬럼 순번) rset.getDate(컬럼명 또는 컬럼
				 * 순번)
				 */
				m.setUserNo(rset.getInt("USERNO"));
				m.setUserId(rset.getString("USERID"));
				m.setUserPwd(rset.getInt("USERPWD"));
				m.setUserName(rset.getString("USERNAME"));
				m.setGender(rset.getString("GENDER").charAt(0));
				m.setAge(rset.getInt("age")); // 대소문자 구뷴하지 않음
				m.setAge(rset.getInt("age")); // 대소문자 구뷴하지 않음
				m.setEmail(rset.getString("EMAIL"));
				m.setPhone(rset.getString(8));
				m.setAddress(rset.getString(9)); // 컬럼의 순번 제시 가능
				m.setHobby(rset.getString(10));
				m.setEnrollDate(rset.getDate(11));
//				한 행에 대한 모든 컬럼의 데이터값들을
//				각각의 필드에 담아 하나의 Member 객체에 옮겨담기 끝
//				리스트에 해당 Member 객체를 담아주면됨
				list.add(m);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
//		8) 결과 반환(조회 결과들이 뽑혀서 담겨있는 list
		return list;
	}

	public Member selectByUserId(String userId) {
//		0) 필요한 변수들 세팅
//		조회된 한 회원에 대한 정보를 담을 변수
		Member m = null;

//		jdbc 관련 객체 선언
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;

//		실행할 sql문(완성된 형태로 제시)
		String sql = "SELECT * FROM MEMBER WHERE USERID = '" + userId + "'";
		try {
//			1) JDBC 드라이버 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");

//			2) Connection 객체 생성
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");

//			3) Statement 객체 생성
			stmt = conn.createStatement();

//			4, 5) sql문 전달 후 실행결과 받기
			rset = stmt.executeQuery(sql);

//			6_1) 현재 조회결과가 담긴 ResultSet에서 한 행씩 뽑아 vo 객체에 담기
			if (rset.next()) {
				m = new Member();

				m.setUserNo(rset.getInt("USERNO"));
				m.setUserId(rset.getString("USERID"));
				m.setUserPwd(rset.getInt("USERPWD"));
				m.setUserName(rset.getString("USERNAME"));
				m.setGender(rset.getString("GENDER").charAt(0));
				m.setAge(rset.getInt("age")); // 대소문자 구뷴하지 않음
				m.setAge(rset.getInt("age")); // 대소문자 구뷴하지 않음
				m.setEmail(rset.getString("EMAIL"));
				m.setPhone(rset.getString(8));
				m.setAddress(rset.getString(9)); // 컬럼의 순번 제시 가능
				m.setHobby(rset.getString(10));
				m.setEnrollDate(rset.getDate(11));
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
//			7) 다쓴 JDBC용 객체 반납(생성된 순서의 순서의 역순)
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return m;
	}

	public ArrayList<Member> selectByUserName(String keyword) {
		ArrayList<Member> list = new ArrayList<Member>();

		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		String sql = "SELECT * FROM MEMBER WHERE USERNAME LIKE '%" + keyword + "%'";

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
			stmt = conn.createStatement();
			rset = stmt.executeQuery(sql);

			while (rset.next()) {
				Member m = new Member();
				m.setUserNo(rset.getInt("USERNO"));
				m.setUserId(rset.getString("USERID"));
				m.setUserPwd(rset.getInt("USERPWD"));
				m.setUserName(rset.getString("USERNAME"));
				m.setGender(rset.getString("GENDER").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("EMAIL"));
				m.setPhone(rset.getString(8));
				m.setAddress(rset.getString(9));
				m.setHobby(rset.getString(10));
				m.setEnrollDate(rset.getDate(11));

				list.add(m);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return list;
	}

	public int updateMember(Member m) {
//		0)
		int result = 0;
		
		Connection conn = null;
		Statement stmt = null;
		String sql = "UPDATE MEMBER "
					+ "SET USERPWD = '" + m.getUserPwd() + "', "
					+ "EMAIL = '" + m.getEmail() + "', "
					+ "PHONE = '" + m.getPhone() + "', "
					+ "ADDRESS = '" + m.getAddress() + "' "
					+ "WHERE USERID = '" + m.getUserId() + "'";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
			stmt = conn.createStatement();
			result = stmt.executeUpdate(sql);
			
//			6)
			if(result > 0) {
				conn.commit();
			} else {
				conn.rollback();
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;
	}

	public int deleteMember(String userId) {
		int result = 0;

		Connection conn = null;
		Statement stmt = null;
		String sql = "DELETE MEMBER "
					+ "WHERE USERID = '" + userId + "'";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
			stmt = conn.createStatement();
			result = stmt.executeUpdate(sql);
			
//			6)
			if(result > 0) {
				conn.commit();
			} else {
				conn.rollback();
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;
	}
}

 

/**
 * 사용자가 회원 추가 요청시 입력했던 값을 가지고 insert문을 실행하는 메소드
 * @param m : 사용자가 입력했던 아이디~취미까지의 값이 담겨있는 Member객체
 * @return : insert문으로 실행한 결과 처리된 행의 갯수
 */

 

☞ public int insertMember(Member m) : Member클래스에서 찍어낸 Member 클래스의 변수들 정보

 

 

0) 필요한 변수 셋팅 후, 실행할 SQL문 필요하다!

 

 

☞ 실행할 SQL문이 필요한데 이때, 끝에 세미콜린이 있으면 안된다!!!!!!!!!!!★

 

 

 

1) JDBC 드라이버 등록

Class.forName("oracle.jdbc.driver.OracleDriver");
// 오타 or ojdbc6.jar이 누락된 경우 에러발생할 수 있다.

 

☞ 우리는 오라클 DBMS을 이용하기 때문에 오라클 드라이버를 등록

 

 

 

2) Connection 객체 생성

conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe",
"JDBC","JDBC");

 

☞  오라클 DBMS에서 우리는 JDBC 계정을 생성하였기 때문에 (id : JDBC/ pw : JDBC) 관련한 계정 연결를 해주어 conn 변수에 저장

 

 

 

4, 5) DB에 SQL문 전달하면서 실행 후 결과 받기

result = stmt.executeUpdate(sql);

 

☞ 실행될게 INSERT 이기때문에 executeUpdate() 메소드 호출

 

 

 

6) 트랜잭션 처리

if(result > 0) { // result 1이상일 경우, 1개 이상의 행이 insert 되었다. => 성공적으로 1행이 삽입됐다.
    conn.commit();
}else {  // 실패시
    conn.rollback();
}

 

 

⑦ RUN 클래스

package com.kh.run;

import com.kh.view.MemberView;

public class Run {

	public static void main(String[] args) {
		new MemberView().mainMenu();
		

	}

}

 

 

 

 

⑧ 오라클에서 JDBC 계정 MEMBER 테이블에 값이 추가되었는지 확인

 

 

 

☞ 값이 정상적으로 추가되었음을 확인할 수 있다.

'Database > JDBC' 카테고리의 다른 글

[JDBC] 1. JDBC란, 실습 준비  (0) 2023.12.01