고래씌
[JDBC] 2-1. JDBC 이용해 오라클 DBMS 접근, Builder 본문
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 |
---|