package org.kh.member.controller;
import java.util.ArrayList;
import org.kh.member.dao.MemberDao;
import org.kh.member.model.vo.Member;
public class MemberController {
// 컨트롤러 클래스의 역할
// view에서 요청한 기능을 컨트롤러가 DAO와의 연결을 하는 역할
// 회원 전체출력 메소드
public void selectMemberAll() {
MemberDao dao = new MemberDao();
ArrayList<Member> list = dao.selectMemberAll(); // DAO의 회원 전체 조회 메소드 호출
// 리턴한 list 결과 상황
// 1. list 가 있을 때
// 2. lost 가 없을 때
if (!list.isEmpty())// .isEmpty =비어있따 // list가 있을 떄
{
// 결과출력
System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
System.out.println("아이디 비밀번호 이름 성별 나이 이메일 전화번호 주소 취미 가입일");
//1번째 방식
for(Member m : list) {
System.out.println(m);//m만써도된다.
}
//2번째 방식
/*
for (Member m : list) {
System.out.println(
m.getMemberId() + " " +
m.getMemberPwd() + " " +
m.getMemberName() + " "+
m.getGender() + " " +
m.getAge() + " " +
m.getEmail() + " " +
m.getPhone()+ " " +
m.getAddress() + " " +
m.getHobby() + " " +
m.getEnrollDate());
}
*/
//3번째 방식
/*
* for (int i = 0; i < list.size(); i++) {
* System.out.println(list.get(i).getMemberId() + " " +
* list.get(i).getMemberPwd() + " " + list.get(i).getMemberName() + " " +
* list.get(i).getGender() + " " + list.get(i).getAge() + " " +
* list.get(i).getEmail() + " " + list.get(i).getMemberId() + " " +
* list.get(i).getAddress() + " " + list.get(i).getHobby() + " " +
* list.get(i).getEnrollDate()); }
*/
} else// list가 없을 때
{
// 없다고 알려주는 코드
System.out.println("회원 목록이 없습니다.");
}
}
// 회원 아이디 검색 메소드
public void selectMemberId(String userId) {//매개변수 낙타표기법으로 썼다.
//System.out.println("입력받은 문자열 : "+userId);
MemberDao dao=new MemberDao();
dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
Member m = dao.selectMemberId(userId);
if(m!=null) //객체가 있을때(조회가 성공하였을때)
{
// 결과출력
System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
System.out.println("아이디 비밀번호 이름 성별 나이 이메일 전화번호 주소 취미 가입일");
System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
}
else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
{
System.out.println("해당되는 ID를 가진 회원이 없습니다.");
}
}
// 회원 이름 검색 메소드
public void selectMemberName(String userName) {
MemberDao dao = new MemberDao();
dao.selectMemberName(userName);
ArrayList<Member> list = dao.selectMemberName(userName);
if(!list.isEmpty()) {
System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
System.out.println("아이디 비밀번호 이름 성별 나이 이메일 전화번호 주소 취미 가입일");
for(Member m:list) {
System.out.println(m);
}
}else {
System.out.println("누가없는거 찾으래!");
}
}
// 회원 가입 메소드
public void insertMember(Member m) {
// TODO Auto-generated method stub
MemberDao dao = new MemberDao();
int result=dao.insertMember(m);
if(result>0) {
System.out.println("정상적으로 회원가입 되었습니다.");
}
else {
System.out.println("회원 가입에 실패 하였습니다.");
}
}
// 회원 정보 수정 메소드
public void updateMember(String userId,Member m2) {
MemberDao dao = new MemberDao();
int result=dao.updatemember(userId,m2);
if(result>0) {
System.out.println("정보 수정이 정상 처리 되었습니다.");
}else {
System.out.println("회원 정보 수정이 실패 하였습니다.(관리자에게문의)");
}
}
// 회원 탈퇴 메소드
public void deleteMember(String userId) {
MemberDao dao=new MemberDao();
int result=dao.deleteMember(userId);
if(result>0) {
System.out.println("정상적으로 탈퇴 되었습니다.");
}
else {
System.out.println("탈퇴가 실패 하였습니다.");
}
}
public boolean searchUserId(String userId) {
// TODO Auto-generated method stub
//System.out.println("입력받은 문자열 : "+userId);
MemberDao dao=new MemberDao();
//dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
Member m = dao.selectMemberId(userId);
if(m!=null) //객체가 있을때(조회가 성공하였을때)
{
// 결과출력
System.out.println("회원 조회가 완료되었습니다.");
System.out.println("\n----------------- ["+userId+"]회원정보 -----------------\n");
System.out.println("아이디 비밀번호 이름 성별 나이 이메일 전화번호 주소 취미 가입일");
System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
return true;
}
else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
{
System.out.println("해당되는 ID를 가진 회원이 없습니다.");
return false;
}
}
}
package org.kh.member.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 org.kh.member.model.vo.Member;
public class MemberDao {
//DBMS에 접근하는 전체 회원 조회 메소드
public ArrayList<Member> selectMemberAll() {
//필요한 레퍼런스 생성(Connection, Statement, ResultSet)
//java.sql 패키지 import
Connection conn = null; //Connection 레퍼런스 (객체 생성은 아직 안함)
Statement stmt = null; //Statement 래퍼런스 (객체 생성은 아직 안함)
ResultSet rset=null; //ResultSet 래퍼런스 (객체 생성은 아직 안함)
ArrayList<Member> list=new ArrayList<Member>();
//@ JDBC Coding 절차
try {
//1. Driver 등록
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. DBMS와 연결 (Connection 사용)
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
,"member", "member");
//첫번째는 연결 정보(DB종류, 타입, IP주소, 포트 등등)
//두번째는 연결하는 DB의 ID(아이디)
//세번째는 연결하는 ID의 PW(비밀번호)
//get으로 읽어오는것이므로 저장하는 것이다.conn에 저장하는 것이다.
System.out.println(conn);
// conn 레퍼런스 안에 있는 값을 출력시
// DBMS에 정상연결 되었다면 hashCode 값(Connection 값)이 출력 되고
// DBMS에 연결 실패 하였다면 null값을 리턴
//3. Statement 생성 - 작성한 쿼리문을 전송할 객체를 생성 해야 함
// Connection (conn) 객체를 이용하여 Statement 객체를 생성함
stmt=conn.createStatement(); // Statement 객체 생성
//4. SQL 전송
// - Query 문이 있어야 전송합니다.
String query = "select * from member";
rset=stmt.executeQuery(query); // Statement 객체를 이용하여 쿼리문 실행
//결과를 rset에 담는다.
//5. 결과 처리
// rset을 이용하여 결과를 처리함
// rset.next() 메소드와 rset.set...() 메소드를 이용함
// next 메소드는 각 행을 가리키는 메소드(작업시 마다 사용해야함)
// set...() 메소드는 각 컬럼의 정보를 가져올때 사용함
//rset.next()
//rset.getString("member_id"); -> rset을 이용해스트링값갖고오는데 그컬럼명은 멤버아이디꺼갖고오라는 것이다.
while(rset.next()) {
Member m = new Member();
//ID값 저장하기
m.setMemberId(rset.getString("member_id"));
m.setMemberPwd(rset.getString("member_pwd"));
m.setMemberName(rset.getString("member_name"));
m.setGender(rset.getString("gender").charAt(0));
m.setAge(rset.getInt("age"));
m.setEmail(rset.getString("email"));
m.setAddress(rset.getString("address"));
m.setPhone(rset.getString("phone"));
m.setHobby(rset.getString("hobby"));
m.setEnrollDate(rset.getDate("enroll_date"));
list.add(m);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//오라클에 jdbc에 드라이버에 오라클드라이버를 등록하겠다.
//이코드가 없어도 8버전부턴 가능하긴한데 넣어주는게 좋다.
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//6. 연결된 리소스 닫기 (close 작업 - finally에서 작업)
try {
rset.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
public Member selectMemberId(String userId) {
Connection conn=null;//DBMS와 연결
Statement stmt=null;//작성한 쿼리문을 전송할 객체를 생성 해야 함
ResultSet rset=null;//SELECT 구문일 경우 ResultSet을 이용하여 정보를 객체에 담는 처리
Member m = null; //멤버객체를 여기선 바깥에 만드는데 그 이유는?
//결과가 조회되던안되던 리턴받을 것이다.
try {
//1. Driver 등록
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. DBMS 연결
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
//SQLException 에러 뜰수있기 때문에 catch로잡아줘야한다.
//3. Statement 객체 생성
// Connection (conn) 객체를 이용하여 Statement 객체를 생성함
stmt=conn.createStatement();
//4. SQL 전송
// - Query 문이 있어야 전송합니다.
String query="select * from member where member_id='"+userId+"'";
rset=stmt.executeQuery(query);// Statement 객체를 이용하여 쿼리문 실행
//5. 결과 처리
// rset을 이용하여 결과를 처리함
// rset.next() 메소드와 rset.set...() 메소드를 이용함
// next 메소드는 각 행을 가리키는 메소드(작업시 마다 사용해야함)
// set...() 메소드는 각 컬럼의 정보를 가져올때 사용함
if(rset.next()) {//만약에 1명의 결과가 조회되었다면 진행하고 없다면 하지마라!
m=new Member();//결과가 있으므로 정보를 저장할 VO 객체 생성
m.setMemberId(rset.getString("member_id"));
m.setMemberPwd(rset.getString("member_pwd"));
m.setMemberName(rset.getString("member_name"));
m.setGender(rset.getString("gender").charAt(0));
m.setAge(rset.getInt("age"));
m.setEmail(rset.getString("email"));
m.setPhone(rset.getString("phone"));
m.setAddress(rset.getString("address"));
m.setHobby(rset.getString("hobby"));
m.setEnrollDate(rset.getDate("enroll_date"));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//6. 연결된 리소스 닫기 (close 작업 - finally에서 작업)
try {
rset.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return m; //m래퍼런스 안에 있는 값을 리턴(Member 객체 혹은 null)
}
public ArrayList<Member> selectMemberName(String userName) {
// TODO Auto-generated method stub
Connection conn=null;
Statement stmt=null;
ResultSet rset=null;
//Member m=null;
ArrayList<Member> list = new ArrayList<Member>();
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
,"member", "member");
System.out.println(conn);
stmt=conn.createStatement();
String query="select * from member where member_name like '%"+userName+"%'";
rset=stmt.executeQuery(query);
while(rset.next()) {
Member m = new Member();
//ID값 저장하기
m.setMemberId(rset.getString("member_id"));
m.setMemberPwd(rset.getString("member_pwd"));
m.setMemberName(rset.getString("member_name"));
m.setGender(rset.getString("gender").charAt(0));
m.setAge(rset.getInt("age"));
m.setEmail(rset.getString("email"));
m.setAddress(rset.getString("address"));
m.setHobby(rset.getString("hobby"));
m.setEnrollDate(rset.getDate("enroll_date"));
list.add(m);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
rset.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
//회원 가입용 메소드
public int insertMember(Member m) {
//래퍼런스 3종세트
Connection conn=null;
Statement stmt=null;
//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
int result=0; //결과를 숫자로 받을려고 한다.
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
stmt = conn.createStatement();
String query="insert into member values("+
"'"+m.getMemberId()+"',"+
"'"+m.getMemberPwd()+"',"+
"'"+m.getMemberName()+"',"+
"'"+m.getGender()+"',"+
"'"+m.getAge()+"',"+
"'"+m.getEmail()+"',"+
"'"+m.getPhone()+"',"+
"'"+m.getAddress()+"',"+
"'"+m.getHobby()+"',"+"sysdate)";
System.out.println(query);
//stmt.executeQuery(sql) -> select 전용이다.
//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
result=stmt.executeUpdate(query); //return 타입이 int형이다.
//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
if(result>0) {//정상처리되었을때
conn.commit(); //적용
}
else {
conn.rollback(); //되돌리기
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
public int updatemember(String userId, Member m2) {
// TODO Auto-generated method stub
Connection conn=null;
Statement stmt=null;
int result=0;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
stmt=conn.createStatement();
String query="update member set "
+"member_pwd ='"+m2.getMemberPwd()+"',"
+"email='"+m2.getEmail()+"',"
+"phone='"+m2.getPhone()+"',"
+"address='"+m2.getAddress()+"',"
+"hobby='"+m2.getHobby()+"'"
+"where member_id='"+userId+"'";
System.out.println(query);
result=stmt.executeUpdate(query);
if(result>0) {
conn.commit();
}
else {
conn.rollback();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
public int deleteMember(String userId) {
// TODO Auto-generated method stub
//래퍼런스 3종세트
Connection conn=null;
Statement stmt=null;
//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
int result=0; //결과를 숫자로 받을려고 한다.
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
stmt = conn.createStatement();
String query="delete from member where member_id='"+userId+"'";
System.out.println(query);
//stmt.executeQuery(sql) -> select 전용이다.
//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
result=stmt.executeUpdate(query); //return 타입이 int형이다.
//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
if(result>0) {//정상처리되었을때
conn.commit(); //적용
}
else {
conn.rollback(); //되돌리기
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
}
package org.kh.member.model.vo;
import java.sql.Date;
public class Member {
//ID, PW
private String memberId;
private String memberPwd;
private String memberName;
private char gender;
private int age;
private String email;
private String phone;
private String address;
private String hobby;
private Date enrollDate; // java.sql.Date import
public Member(String memberId, String memberPwd, String memberName, char gender, int age, String email,
String phone, String address, String hobby, Date enrollDate) {
super();
this.memberId = memberId;
this.memberPwd = memberPwd;
this.memberName = memberName;
this.gender = gender;
this.age = age;
this.email = email;
this.phone = phone;
this.address = address;
this.hobby = hobby;
this.enrollDate = enrollDate;
}
public Member() {
super();
// TODO Auto-generated constructor stub
}
//이렇게 해줄경우 컨트롤러에서 toString을 호출하게끔 할수 있다.
@Override
public String toString() {
return
this.getMemberId() + " " +
this.getMemberPwd() + " " +
this.getMemberName() + " "+
this.getGender() + " " +
this.getAge() + " " +
this.getEmail() + " " +
this.getPhone()+ " " +
this.getAddress() + " " +
this.getHobby() + " " +
this.getEnrollDate();
}
//alt+shift+s
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
public String getMemberPwd() {
return memberPwd;
}
public void setMemberPwd(String memberPwd) {
this.memberPwd = memberPwd;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public Date getEnrollDate() {
return enrollDate;
}
public void setEnrollDate(Date enrollDate) {
this.enrollDate = enrollDate;
}
}
package org.kh.member.run;
import org.kh.member.view.MemberMgr;
public class RunMain {
public static void main(String[] args) {
MemberMgr mgr = new MemberMgr();
mgr.mainMenu();
//new MemberMgr().mainMenu(); //객체 만들자 마자 실행
//한번만 만들어서 실행하는걸로 challenge방식으로 할 수도 있다.
}
}
package org.kh.member.view;
import java.util.Scanner;
import org.kh.member.controller.MemberController;
import org.kh.member.model.vo.Member;
//회원 관리 메뉴를 보여주는 View Class
public class MemberMgr {
private Scanner sc = new Scanner(System.in);
private MemberController mCon = new MemberController();//컨트롤러 객체
// 메인 메뉴 메소드
public void mainMenu() {
int choice;
do {
System.out.println("\n= = = = = = = = = = 회원 관리 프로그램 = = = = = = ");
System.out.println("1. 회원 정보 전체 조회");
System.out.println("2. 회원 아이디 조회(1명)");
System.out.println("3. 회원 이름으로 검색(다수)");
System.out.println("4. 회원 가입");
System.out.println("5. 회원 정보 변경");
System.out.println("6. 회원 탈퇴");
System.out.println("0. 프로그램 종료");
System.out.print("선택 : ");
choice = sc.nextInt(); //선택값 choice 변수에 저장
switch(choice) {
case 1:mCon.selectMemberAll(); break;
case 2:
System.out.print("검색할 ID를 입력 : ");
mCon.selectMemberId(sc.next()); break;
case 3:
System.out.print("검색할 NAME을 입력 : ");
mCon.selectMemberName(sc.next());
break;
case 4:
Member m=joinMember();//입력받는 전용메소드
mCon.insertMember(m);//Member m=joinMember();이거랑 같다.
break;
case 5:
//해당 회원 정보 조회
System.out.print("수정할 ID 입력 : ");
String userId=sc.next();
boolean result=mCon.searchUserId(userId);
if(result) {//true가 리턴되었다면 회원이 있다는 의미가 되므로 수정 작업이 진행
//비밀번호, 이메일, 폰번호, 주소, 취미
Member m2=modifyMember();
mCon.updateMember(userId,m2);
}
break;
case 6:
System.out.print("삭제할 ID를 입력 : ");//삭제할경우 기준을 ID로 잡았다.
mCon.deleteMember(sc.next());
break;
}
}while(choice!=0);//한번은 무조건 실행될 것이기 때문에 do while로 짰다.
System.out.println("저희 프로그램을 이용해주셔서 감사합니다. 호구님!");
}
//회원 정보 수정 입력 메소드
public Member modifyMember() {
Member m= new Member();
System.out.println("\n ---------- 수정될 회원 정보 입력 ----------\n");
System.out.print("변경될 비밀번호 입력:");
m.setMemberPwd(sc.next());
System.out.print("변경될 이메일 입력:");
m.setEmail(sc.next());
System.out.print("변경될 폰번호 입력(-를제외):");
m.setPhone(sc.next());
System.out.print("변경될 주소 입력:");
m.setAddress(sc.next());
System.out.print("변경될 취미 입력(,로구분):");
m.setHobby(sc.next());
return m;
}
//회원 가입 정보 입력 메소드
public Member joinMember() {
System.out.println("- - - - - -회원 가입 정보 입력 ----");
System.out.print("아이디 입력 : ");
String userId=sc.next();
System.out.print("비밀번호 입력 : ");
String userPwd = sc.next();
System.out.print("이름 입력 : ");
String userName=sc.next();
System.out.print("성별 입력 : ");
char gender = sc.next().charAt(0);
System.out.print("나이 입력 : ");
int age = sc.nextInt();
System.out.print("이메일 입력 : ");
String email = sc.next();
System.out.print("폰번호 입력(-빼고 입력) : ");
String phone=sc.next();
System.out.print("주소 입력 : ");
sc.nextLine();
String address = sc.nextLine();
System.out.print("취미 입력(,로 구분 지어서 입력) : ");
String hobby = sc.next();
Member m = new Member();
m.setMemberId(userId);
m.setMemberPwd(userPwd);
m.setMemberName(userName);
m.setGender(gender);
m.setAge(age);
m.setEmail(email);
m.setPhone(phone);
m.setAddress(address);
m.setHobby(hobby);
return m;
}
}