JDBC1 -> 기본적으로 만들기 statement
JDBC2 -> service없이 만들기 prestatement
JDBC3 -> service있게 만들기
JDBC4 -> new 남발하기 공통된거 없애기
JDBC5 -> new 남발된거 없애기
JDBC6 -> 양날의검 getConnection()을 많이 쓰니 import를 해서 그걸 바꿔준다.
JDBC7 -> 폴더(resources)만들기
JDBC4까지는 다른방식의 코딩 여러가지2에 있다.
Controller의 역할
1. what is Service?
2. result print
Service의 역할
Connection
Dao Call
Close
Controller back
Dao의 역할
DB -> Data
return Service
JDBC5
package org.kh.common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
// JDBCTemplate 클래스는 공통적으로 사용되는 코드를 작성해놓은 클래스
// 코드의 중복을 줄일 수 있음
public class JDBCTemplate {
public JDBCTemplate() {} //디폴트 생성자
//new JDBCTemplate().getConnection();
//위에꺼처럼 원래 있다면
//JDBCTemplate.getConnection(); 이렇게 호출하면 된다.
//static를 쓰면 힙영역에 미리 올라가있는 상태라 new없이 사용해도 괜찮다.
//static는 메모리에 올려져있는 메소드라고 생각하면 편하다.
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
conn.setAutoCommit(false);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//커넥션 객체가 null이아니거나 이미 종료된게 아니라면 닫아라.
public static void close(Connection conn) {
try {
if(conn!=null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//or로 했을 경우
//conn!=null || !conn.isClsed();
//닫아진 상태가 아니라면 null인경우나 닫아진 경우엔 하면 안된다.
//커넥션에있는 값이 닫아져버렸다. 앞에조건만 보면 닫아지긴 했지만 null은아니여서 참이기때문에 닫았는데 또닫게된다.
//conn이 null이 아니면서 동시에 이미닫아진상태가 아닐때만 닫아라.
}
//commit에 대한 것
public static void commit(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.commit();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//rollback에 대한것
public static void rollback(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.rollback();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//메소드 오버로딩
// -> 동일한 이름의 메소드 이름을 가지고 있으나 매개변수의 개수나 타입이 다른 메소드
//메소드 오버라이딩
// -> 부모가 가지고 있는 메소드를 자식 클래스에서 새롭게 재정의 하는 메소드
public static void close(ResultSet rset) {
try {
if(rset!=null && !rset.isClosed()) {
rset.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//Prestatement 부모클래스 자식 래퍼런스는 자식클래스의 주소도 저장할 수 있다.
//그래서 api클래스를 보면 다 저장할 수 있는 것이다.
//animal이 있고 tiger상속받은게 있다면 다 저장할수 있다는 것이다.
public static void close(Statement stmt) {
try {
if(stmt!=null && !stmt.isClosed()) {
stmt.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package org.kh.member.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import org.kh.common.JDBCTemplate;
import org.kh.member.model.vo.Member;
public class MemberDao {
//DBMS에 접근하는 전체 회원 조회 메소드
public ArrayList<Member> selectMemberAll(Connection conn) {
Statement stmt =null;
ResultSet rset = null;
ArrayList<Member> list = new ArrayList<Member>();
try {
stmt = conn.createStatement();
String query = "select * from member";
rset = stmt.executeQuery(query);
while(rset.next()) {
Member 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"));
list.add(m);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(stmt);
}
return list;
}
public Member selectMemberId(String userId,Connection conn) {
PreparedStatement pstmt=null;
ResultSet rset=null;
Member m=null;
String query="select * from member where member_id=?";
try {
pstmt=conn.prepareStatement(query);
pstmt.setString(1, userId);
rset=pstmt.executeQuery();
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 (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(pstmt);
// try {
// pstmt.close();
//
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
}
return m;
}
public ArrayList<Member> selectMemberName(String userName,Connection conn) {
// TODO Auto-generated method stub
PreparedStatement pstmt=null;
ResultSet rset=null;
ArrayList<Member> list = new ArrayList<Member>();
try {
String query="select * from member where member_name like '%'||?||'%'";
pstmt=conn.prepareStatement(query);
pstmt.setString(1, userName);
rset=pstmt.executeQuery();
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 (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(pstmt);
// try {
// pstmt.close();
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
return list;
}
//회원 가입용 메소드
public int insertMember(Member m,Connection conn) {
PreparedStatement pstmt = null;
int result = 0;
String query = "insert into member values (?,?,?,?,?,?,?,?,?,sysdate)";
try {
pstmt=conn.prepareStatement(query);
pstmt.setString(1, m.getMemberId());
pstmt.setString(2, m.getMemberPwd());
pstmt.setString(3, m.getMemberName());
pstmt.setString(4, String.valueOf(m.getGender()));
pstmt.setInt(5, m.getAge());
pstmt.setString(6, m.getEmail());
pstmt.setString(7, m.getPhone());
pstmt.setString(8, m.getAddress());
pstmt.setString(9, m.getHobby());
result=pstmt.executeUpdate();//위에서 쿼리 담았기 때문에 안담는다.
//System.out.println(query);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int updatemember(String userId,Member m2,Connection conn) {
// TODO Auto-generated method stub
PreparedStatement pstmt=null;
int result=0;
try {
String query="update member set member_pwd=?, email=?,phone=?,address=?,hobby=? where member_id=?";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, m2.getMemberPwd());
pstmt.setString(2, m2.getEmail());
pstmt.setString(3, m2.getPhone());
pstmt.setString(4, m2.getAddress());
pstmt.setString(5, m2.getHobby());
pstmt.setString(6, userId);
System.out.println(query);
result=pstmt.executeUpdate();
if(result>0) {
conn.commit();
}
else {
conn.rollback();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int deleteMember(String userId,Connection conn) {
// TODO Auto-generated method stub
//래퍼런스 3종세트
PreparedStatement pstmt=null;
//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
int result=0; //결과를 숫자로 받을려고 한다.
try {
//String query="delete from member where member_id='"+userId+"'";
String query="delete from member where member_id=?";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, userId);
System.out.println(query);
//stmt.executeQuery(sql) -> select 전용이다.
//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
result=pstmt.executeUpdate(); //return 타입이 int형이다.
//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
}
package org.kh.member.model.service;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import org.kh.common.JDBCTemplate;
import org.kh.member.dao.MemberDao;
import org.kh.member.model.vo.Member;
public class MemberService {
// 서비스 클래스의 역할
// 기존에는 DAO가 DBMS와 연결하고 커밋과 롤백시에도 직접 처리 하였음
// DAO는 DBMS에 접근하여 데이터를 가져오는게 핵심 역할일뿐
// 실제 DBMS에 연결하거나 커밋, 롤백 작업을 하는 것은 확장성 문제가 발생할 수 있음
// 그렇기 때문에 이제는 서비스에서 DBMS와의 연결 작업 (드라이브 등록 및 Connection)을
// 진행하고, 트랜잭션 관리를 처리하는 역할을 함
// Service에서 연결을 한 후 연결 정보를 다 insert나 delete로 준다.
public ArrayList<Member> selectMemberAll() {
//서비스는 DB에 연결하는 역할
Connection conn = JDBCTemplate.getConnection();
//getConnection()앞에 JDBCTemplate를 계속 붙이는데 이걸 다르게 할 수 있다.
ArrayList<Member> list=null;
list = new MemberDao().selectMemberAll(conn);
// MemberDao dao = new MemberDao();
//list = dao.selectMemberAll(conn);
JDBCTemplate.close(conn);
return list;
}
//회원 가입 메소드
public int insertMember(Member m) {
//서비스역할 드라이버 등록
Connection conn=JDBCTemplate.getConnection();
int result=0;
result = new MemberDao().insertMember(m,conn);//커넥션정보도 같이 보내줘야 한다.
if(result>0) {
JDBCTemplate.commit(conn);
}
else {
JDBCTemplate.rollback(conn);
}
JDBCTemplate.close(conn);
return result; //최종 결과값으로 컨트롤러에게 전달
}
//회원아이디검색
public Member selectMemberId(String userId) {
//서비스는 DB에 연결하는 역할
Connection conn=JDBCTemplate.getConnection();
Member m =null;
m= new MemberDao().selectMemberId(userId, conn);
JDBCTemplate.close(conn);
return m;
}
//회원 이름검색
public ArrayList<Member> selectMemberName(String userName) {
Connection conn=JDBCTemplate.getConnection();
ArrayList<Member> list=null;
Member m = new Member();
// MemberDao dao = new MemberDao();
// list = dao.selectMemberName(userName,conn);
list=new MemberDao().selectMemberName(userName, conn);
JDBCTemplate.close(conn);
return list;
}
//회원 정보 수정 메소드
public int updateMember(String userId,Member m) {
Connection conn=JDBCTemplate.getConnection();
int result=0;
// MemberDao dao = new MemberDao();
// result=dao.updatemember(userId,m,conn);
result=new MemberDao().updatemember(userId, m, conn);
if(result>0) {
JDBCTemplate.commit(conn);
}
else {
JDBCTemplate.rollback(conn);
}
JDBCTemplate.close(conn);
return result;
}
//회원 삭제 메소드
public int deleteMember(String userId) {
Connection conn=JDBCTemplate.getConnection();
int result=0;
MemberDao dao = new MemberDao();
result=dao.deleteMember(userId,conn);
if(result>0) {
JDBCTemplate.commit(conn);
}
else {
JDBCTemplate.rollback(conn);
}
JDBCTemplate.close(conn);
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;
}
}
JDBC6
package org.kh.common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
// JDBCTemplate 클래스는 공통적으로 사용되는 코드를 작성해놓은 클래스
// 코드의 중복을 줄일 수 있음
public class JDBCTemplate {
public JDBCTemplate() {} //디폴트 생성자
//new JDBCTemplate().getConnection();
//위에꺼처럼 원래 있다면
//JDBCTemplate.getConnection(); 이렇게 호출하면 된다.
//static를 쓰면 힙영역에 미리 올라가있는 상태라 new없이 사용해도 괜찮다.
//static는 메모리에 올려져있는 메소드라고 생각하면 편하다.
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
conn.setAutoCommit(false);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//커넥션 객체가 null이아니거나 이미 종료된게 아니라면 닫아라.
public static void close(Connection conn) {
try {
if(conn!=null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//or로 했을 경우
//conn!=null || !conn.isClsed();
//닫아진 상태가 아니라면 null인경우나 닫아진 경우엔 하면 안된다.
//커넥션에있는 값이 닫아져버렸다. 앞에조건만 보면 닫아지긴 했지만 null은아니여서 참이기때문에 닫았는데 또닫게된다.
//conn이 null이 아니면서 동시에 이미닫아진상태가 아닐때만 닫아라.
}
//commit에 대한 것
public static void commit(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.commit();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//rollback에 대한것
public static void rollback(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.rollback();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//메소드 오버로딩
// -> 동일한 이름의 메소드 이름을 가지고 있으나 매개변수의 개수나 타입이 다른 메소드
//메소드 오버라이딩
// -> 부모가 가지고 있는 메소드를 자식 클래스에서 새롭게 재정의 하는 메소드
public static void close(ResultSet rset) {
try {
if(rset!=null && !rset.isClosed()) {
rset.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//Prestatement 부모클래스 자식 래퍼런스는 자식클래스의 주소도 저장할 수 있다.
//그래서 api클래스를 보면 다 저장할 수 있는 것이다.
//animal이 있고 tiger상속받은게 있다면 다 저장할수 있다는 것이다.
public static void close(Statement stmt) {
try {
if(stmt!=null && !stmt.isClosed()) {
stmt.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package org.kh.member.controller;
import java.security.Provider.Service;
import java.sql.Connection;
import java.util.ArrayList;
import org.kh.member.dao.MemberDao;
import org.kh.member.model.service.MemberService;
import org.kh.member.model.vo.Member;
public class MemberController {
// 컨트롤러 클래스의 역할
// view에서 요청한 기능을 컨트롤러가 DAO와의 연결을 하는 역할
// -> Controller Service Dao 로 해서 코드 짜보겠다.
// 회원 전체출력 메소드 -> 오늘 수정하는것 -> 바꾼것
public void selectMemberAll() {
MemberService service = new MemberService();
ArrayList<Member> list = service.selectMemberAll();
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 selectMemberId(String userId) {//매개변수 낙타표기법으로 썼다.
//System.out.println("입력받은 문자열 : "+userId);
MemberService service = new MemberService();
Member m = service.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) {
MemberService service = new MemberService();
ArrayList<Member> list = service.selectMemberName(userName);
//ArrayList<Member> list = new MemberService().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) {
/*MemberService service = new MemberService();
service.insertMember(m);
*/
//체이닝 기법
int result=new MemberService().insertMember(m);
if(result>0) {
System.out.println("회원 가입이 성공하였습니다.");
}
else {
System.out.println("회원 가입이 실패하였습니다.");
}
}
// 회원 정보 수정 메소드
public void updateMember(String userId,Member m2) {
MemberService service = new MemberService();
//Connection conn=null;
int result=service.updateMember(userId, m2);
if(result>0) {
System.out.println("정보 수정이 정상 처리 되었습니다.");
}else {
System.out.println("회원 정보 수정이 실패 하였습니다.(관리자에게문의)");
}
}
// 회원 탈퇴 메소드
public void deleteMember(String userId) {
MemberService service = new MemberService();
int result = service.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);
MemberService service = new MemberService();
//dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
//Member m = dao.selectUserId(userId);
Member m = service.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.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import org.kh.common.JDBCTemplate;
import org.kh.member.model.vo.Member;
public class MemberDao {
//DBMS에 접근하는 전체 회원 조회 메소드
public ArrayList<Member> selectMemberAll(Connection conn) {
Statement stmt =null;
ResultSet rset = null;
ArrayList<Member> list = new ArrayList<Member>();
try {
stmt = conn.createStatement();
String query = "select * from member";
rset = stmt.executeQuery(query);
while(rset.next()) {
Member 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"));
list.add(m);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(stmt);
}
return list;
}
public Member selectMemberId(String userId,Connection conn) {
PreparedStatement pstmt=null;
ResultSet rset=null;
Member m=null;
String query="select * from member where member_id=?";
try {
pstmt=conn.prepareStatement(query);
pstmt.setString(1, userId);
rset=pstmt.executeQuery();
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 (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(pstmt);
// try {
// pstmt.close();
//
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
}
return m;
}
public ArrayList<Member> selectMemberName(String userName,Connection conn) {
// TODO Auto-generated method stub
PreparedStatement pstmt=null;
ResultSet rset=null;
ArrayList<Member> list = new ArrayList<Member>();
try {
String query="select * from member where member_name like '%'||?||'%'";
pstmt=conn.prepareStatement(query);
pstmt.setString(1, userName);
rset=pstmt.executeQuery();
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 (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(pstmt);
// try {
// pstmt.close();
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
return list;
}
//회원 가입용 메소드
public int insertMember(Member m,Connection conn) {
PreparedStatement pstmt = null;
int result = 0;
String query = "insert into member values (?,?,?,?,?,?,?,?,?,sysdate)";
try {
pstmt=conn.prepareStatement(query);
pstmt.setString(1, m.getMemberId());
pstmt.setString(2, m.getMemberPwd());
pstmt.setString(3, m.getMemberName());
pstmt.setString(4, String.valueOf(m.getGender()));
pstmt.setInt(5, m.getAge());
pstmt.setString(6, m.getEmail());
pstmt.setString(7, m.getPhone());
pstmt.setString(8, m.getAddress());
pstmt.setString(9, m.getHobby());
result=pstmt.executeUpdate();//위에서 쿼리 담았기 때문에 안담는다.
//System.out.println(query);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int updatemember(String userId,Member m2,Connection conn) {
// TODO Auto-generated method stub
PreparedStatement pstmt=null;
int result=0;
try {
String query="update member set member_pwd=?, email=?,phone=?,address=?,hobby=? where member_id=?";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, m2.getMemberPwd());
pstmt.setString(2, m2.getEmail());
pstmt.setString(3, m2.getPhone());
pstmt.setString(4, m2.getAddress());
pstmt.setString(5, m2.getHobby());
pstmt.setString(6, userId);
System.out.println(query);
result=pstmt.executeUpdate();
if(result>0) {
conn.commit();
}
else {
conn.rollback();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int deleteMember(String userId,Connection conn) {
// TODO Auto-generated method stub
//래퍼런스 3종세트
PreparedStatement pstmt=null;
//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
int result=0; //결과를 숫자로 받을려고 한다.
try {
//String query="delete from member where member_id='"+userId+"'";
String query="delete from member where member_id=?";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, userId);
System.out.println(query);
//stmt.executeQuery(sql) -> select 전용이다.
//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
result=pstmt.executeUpdate(); //return 타입이 int형이다.
//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
}
package org.kh.member.model.service;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
//import static org.kh.common.JDBCTemplate.getConnection;
import static org.kh.common.JDBCTemplate.*;
import org.kh.member.dao.MemberDao;
import org.kh.member.model.vo.Member;
public class MemberService {
// 서비스 클래스의 역할
// 기존에는 DAO가 DBMS와 연결하고 커밋과 롤백시에도 직접 처리 하였음
// DAO는 DBMS에 접근하여 데이터를 가져오는게 핵심 역할일뿐
// 실제 DBMS에 연결하거나 커밋, 롤백 작업을 하는 것은 확장성 문제가 발생할 수 있음
// 그렇기 때문에 이제는 서비스에서 DBMS와의 연결 작업 (드라이브 등록 및 Connection)을
// 진행하고, 트랜잭션 관리를 처리하는 역할을 함
// Service에서 연결을 한 후 연결 정보를 다 insert나 delete로 준다.
public ArrayList<Member> selectMemberAll() {
//서비스는 DB에 연결하는 역할
Connection conn =getConnection();
//getConnection()앞에 JDBCTemplate를 계속 붙이는데 이걸 다르게 할 수 있다.
ArrayList<Member> list=null;
list = new MemberDao().selectMemberAll(conn);
// MemberDao dao = new MemberDao();
//list = dao.selectMemberAll(conn);
close(conn);
return list;
}
//회원 가입 메소드
public int insertMember(Member m) {
//서비스역할 드라이버 등록
Connection conn=getConnection();
int result=0;
result = new MemberDao().insertMember(m,conn);//커넥션정보도 같이 보내줘야 한다.
if(result>0) {
commit(conn);
}
else {
rollback(conn);
}
close(conn);
return result; //최종 결과값으로 컨트롤러에게 전달
}
//회원아이디검색
public Member selectMemberId(String userId) {
//서비스는 DB에 연결하는 역할
Connection conn=getConnection();
Member m =null;
m= new MemberDao().selectMemberId(userId, conn);
close(conn);
return m;
}
//회원 이름검색
public ArrayList<Member> selectMemberName(String userName) {
Connection conn=getConnection();
ArrayList<Member> list=null;
Member m = new Member();
// MemberDao dao = new MemberDao();
// list = dao.selectMemberName(userName,conn);
list=new MemberDao().selectMemberName(userName, conn);
close(conn);
return list;
}
//회원 정보 수정 메소드
public int updateMember(String userId,Member m) {
Connection conn=getConnection();
int result=0;
// MemberDao dao = new MemberDao();
// result=dao.updatemember(userId,m,conn);
result=new MemberDao().updatemember(userId, m, conn);
if(result>0) {
commit(conn);
}
else {
rollback(conn);
}
close(conn);
return result;
}
//회원 삭제 메소드
public int deleteMember(String userId) {
Connection conn=getConnection();
int result=0;
MemberDao dao = new MemberDao();
result=dao.deleteMember(userId,conn);
if(result>0) {
commit(conn);
}
else {
rollback(conn);
}
close(conn);
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.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;
}
}
JDBC7
package org.kh.common;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
// JDBCTemplate 클래스는 공통적으로 사용되는 코드를 작성해놓은 클래스
// 코드의 중복을 줄일 수 있음
public class JDBCTemplate {
public JDBCTemplate() {} //디폴트 생성자
//new JDBCTemplate().getConnection();
//위에꺼처럼 원래 있다면
//JDBCTemplate.getConnection(); 이렇게 호출하면 된다.
//static를 쓰면 힙영역에 미리 올라가있는 상태라 new없이 사용해도 괜찮다.
//static는 메모리에 올려져있는 메소드라고 생각하면 편하다.
public static Connection getConnection() {
Connection conn = null;
Properties prop = new Properties();
try {
//파일을 읽어와서 로드해주세요 라는 소리이다.
prop.load(new FileReader("resources/driver.properties"));
//키값을 갖고온다. 값을 가져와서 넣어준다.
String driver=prop.getProperty("driver");
String url=prop.getProperty("url");
String user=prop.getProperty("user");
String passwd=prop.getProperty("passwd");
Class.forName(driver);
conn=DriverManager.getConnection(url,user,passwd);
conn.setAutoCommit(false);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//커넥션 객체가 null이아니거나 이미 종료된게 아니라면 닫아라.
public static void close(Connection conn) {
try {
if(conn!=null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//or로 했을 경우
//conn!=null || !conn.isClsed();
//닫아진 상태가 아니라면 null인경우나 닫아진 경우엔 하면 안된다.
//커넥션에있는 값이 닫아져버렸다. 앞에조건만 보면 닫아지긴 했지만 null은아니여서 참이기때문에 닫았는데 또닫게된다.
//conn이 null이 아니면서 동시에 이미닫아진상태가 아닐때만 닫아라.
}
//commit에 대한 것
public static void commit(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.commit();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//rollback에 대한것
public static void rollback(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.rollback();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//메소드 오버로딩
// -> 동일한 이름의 메소드 이름을 가지고 있으나 매개변수의 개수나 타입이 다른 메소드
//메소드 오버라이딩
// -> 부모가 가지고 있는 메소드를 자식 클래스에서 새롭게 재정의 하는 메소드
public static void close(ResultSet rset) {
try {
if(rset!=null && !rset.isClosed()) {
rset.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//Prestatement 부모클래스 자식 래퍼런스는 자식클래스의 주소도 저장할 수 있다.
//그래서 api클래스를 보면 다 저장할 수 있는 것이다.
//animal이 있고 tiger상속받은게 있다면 다 저장할수 있다는 것이다.
public static void close(Statement stmt) {
try {
if(stmt!=null && !stmt.isClosed()) {
stmt.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package org.kh.member.controller;
import java.security.Provider.Service;
import java.sql.Connection;
import java.util.ArrayList;
import org.kh.member.dao.MemberDao;
import org.kh.member.model.service.MemberService;
import org.kh.member.model.vo.Member;
public class MemberController {
// 컨트롤러 클래스의 역할
// view에서 요청한 기능을 컨트롤러가 DAO와의 연결을 하는 역할
// -> Controller Service Dao 로 해서 코드 짜보겠다.
// 회원 전체출력 메소드 -> 오늘 수정하는것 -> 바꾼것
public void selectMemberAll() {
MemberService service = new MemberService();
ArrayList<Member> list = service.selectMemberAll();
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 selectMemberId(String userId) {//매개변수 낙타표기법으로 썼다.
//System.out.println("입력받은 문자열 : "+userId);
MemberService service = new MemberService();
Member m = service.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) {
MemberService service = new MemberService();
ArrayList<Member> list = service.selectMemberName(userName);
//ArrayList<Member> list = new MemberService().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) {
/*MemberService service = new MemberService();
service.insertMember(m);
*/
//체이닝 기법
int result=new MemberService().insertMember(m);
if(result>0) {
System.out.println("회원 가입이 성공하였습니다.");
}
else {
System.out.println("회원 가입이 실패하였습니다.");
}
}
// 회원 정보 수정 메소드
public void updateMember(String userId,Member m2) {
MemberService service = new MemberService();
//Connection conn=null;
int result=service.updateMember(userId, m2);
if(result>0) {
System.out.println("정보 수정이 정상 처리 되었습니다.");
}else {
System.out.println("회원 정보 수정이 실패 하였습니다.(관리자에게문의)");
}
}
// 회원 탈퇴 메소드
public void deleteMember(String userId) {
MemberService service = new MemberService();
int result = service.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);
MemberService service = new MemberService();
//dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
//Member m = dao.selectUserId(userId);
Member m = service.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.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Properties;
import org.kh.common.JDBCTemplate;
import org.kh.member.model.vo.Member;
public class MemberDao {
private Properties prop = new Properties();
public MemberDao() {
try {
prop.load(new FileReader("resources/query.properties"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//DBMS에 접근하는 전체 회원 조회 메소드
public ArrayList<Member> selectMemberAll(Connection conn) {
Statement stmt =null;
ResultSet rset = null;
ArrayList<Member> list = new ArrayList<Member>();
try {
stmt = conn.createStatement();
String query = prop.getProperty("selectAll");
rset = stmt.executeQuery(query);
while(rset.next()) {
Member 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"));
list.add(m);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(stmt);
}
return list;
}
public Member selectMemberId(String userId,Connection conn) {
PreparedStatement pstmt=null;
ResultSet rset=null;
Member m=null;
//String query="select * from member where member_id=?";
String query=prop.getProperty("selectMemeberId");
try {
pstmt=conn.prepareStatement(query);
pstmt.setString(1, userId);
rset=pstmt.executeQuery();
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 (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(pstmt);
// try {
// pstmt.close();
//
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
}
return m;
}
public ArrayList<Member> selectMemberName(String userName,Connection conn) {
// TODO Auto-generated method stub
PreparedStatement pstmt=null;
ResultSet rset=null;
ArrayList<Member> list = new ArrayList<Member>();
try {
//String query="select * from member where member_name like ?";
String query=prop.getProperty("selectMemberName");
pstmt=conn.prepareStatement(query);
pstmt.setString(1, "%"+userName+"%");
rset=pstmt.executeQuery();
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 (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(pstmt);
// try {
// pstmt.close();
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
return list;
}
//회원 가입용 메소드
public int insertMember(Member m,Connection conn) {
PreparedStatement pstmt = null;
int result = 0;
String query = prop.getProperty("insertMember");
try {
pstmt=conn.prepareStatement(query);
pstmt.setString(1, m.getMemberId());
pstmt.setString(2, m.getMemberPwd());
pstmt.setString(3, m.getMemberName());
pstmt.setString(4, String.valueOf(m.getGender()));
pstmt.setInt(5, m.getAge());
pstmt.setString(6, m.getEmail());
pstmt.setString(7, m.getPhone());
pstmt.setString(8, m.getAddress());
pstmt.setString(9, m.getHobby());
result=pstmt.executeUpdate();//위에서 쿼리 담았기 때문에 안담는다.
//System.out.println(query);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int updatemember(String userId,Member m2,Connection conn) {
// TODO Auto-generated method stub
PreparedStatement pstmt=null;
int result=0;
try {
//String query="update member set member_pwd=?, email=?,phone=?,address=?,hobby=? where member_id=?";
String query=prop.getProperty("updateMember");
pstmt = conn.prepareStatement(query);
pstmt.setString(1, m2.getMemberPwd());
pstmt.setString(2, m2.getEmail());
pstmt.setString(3, m2.getPhone());
pstmt.setString(4, m2.getAddress());
pstmt.setString(5, m2.getHobby());
pstmt.setString(6, userId);
System.out.println(query);
result=pstmt.executeUpdate();
if(result>0) {
conn.commit();
}
else {
conn.rollback();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int deleteMember(String userId,Connection conn) {
// TODO Auto-generated method stub
//래퍼런스 3종세트
PreparedStatement pstmt=null;
//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
int result=0; //결과를 숫자로 받을려고 한다.
try {
//String query="delete from member where member_id='"+userId+"'";
//String query="delete from member where member_id=?";
String query=prop.getProperty("deleteMember");
pstmt = conn.prepareStatement(query);
pstmt.setString(1, userId);
System.out.println(query);
//stmt.executeQuery(sql) -> select 전용이다.
//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
result=pstmt.executeUpdate(); //return 타입이 int형이다.
//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
}
package org.kh.member.model.service;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
//import static org.kh.common.JDBCTemplate.getConnection;
import static org.kh.common.JDBCTemplate.*;
import org.kh.member.dao.MemberDao;
import org.kh.member.model.vo.Member;
public class MemberService {
// 서비스 클래스의 역할
// 기존에는 DAO가 DBMS와 연결하고 커밋과 롤백시에도 직접 처리 하였음
// DAO는 DBMS에 접근하여 데이터를 가져오는게 핵심 역할일뿐
// 실제 DBMS에 연결하거나 커밋, 롤백 작업을 하는 것은 확장성 문제가 발생할 수 있음
// 그렇기 때문에 이제는 서비스에서 DBMS와의 연결 작업 (드라이브 등록 및 Connection)을
// 진행하고, 트랜잭션 관리를 처리하는 역할을 함
// Service에서 연결을 한 후 연결 정보를 다 insert나 delete로 준다.
public ArrayList<Member> selectMemberAll() {
//서비스는 DB에 연결하는 역할
Connection conn =getConnection();
//getConnection()앞에 JDBCTemplate를 계속 붙이는데 이걸 다르게 할 수 있다.
ArrayList<Member> list=null;
list = new MemberDao().selectMemberAll(conn);
// MemberDao dao = new MemberDao();
//list = dao.selectMemberAll(conn);
close(conn);
return list;
}
//회원 가입 메소드
public int insertMember(Member m) {
//서비스역할 드라이버 등록
Connection conn=getConnection();
int result=0;
result = new MemberDao().insertMember(m,conn);//커넥션정보도 같이 보내줘야 한다.
if(result>0) {
commit(conn);
}
else {
rollback(conn);
}
close(conn);
return result; //최종 결과값으로 컨트롤러에게 전달
}
//회원아이디검색
public Member selectMemberId(String userId) {
//서비스는 DB에 연결하는 역할
Connection conn=getConnection();
Member m =null;
m= new MemberDao().selectMemberId(userId, conn);
close(conn);
return m;
}
//회원 이름검색
public ArrayList<Member> selectMemberName(String userName) {
Connection conn=getConnection();
ArrayList<Member> list=null;
Member m = new Member();
// MemberDao dao = new MemberDao();
// list = dao.selectMemberName(userName,conn);
list=new MemberDao().selectMemberName(userName, conn);
close(conn);
return list;
}
//회원 정보 수정 메소드
public int updateMember(String userId,Member m) {
Connection conn=getConnection();
int result=0;
// MemberDao dao = new MemberDao();
// result=dao.updatemember(userId,m,conn);
result=new MemberDao().updatemember(userId, m, conn);
if(result>0) {
commit(conn);
}
else {
rollback(conn);
}
close(conn);
return result;
}
//회원 삭제 메소드
public int deleteMember(String userId) {
Connection conn=getConnection();
int result=0;
MemberDao dao = new MemberDao();
result=dao.deleteMember(userId,conn);
if(result>0) {
commit(conn);
}
else {
rollback(conn);
}
close(conn);
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.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;
}
}
#driver.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:xe
user=member
passwd=member
#query.properties
selectAll=select * from member
selectMemeberId=select * from member where member_id=?
selectMemberName=select * from member_name like ?
insertMember=insert into member values (?,?,?,?,?,?,?,?,?,sysdate)
updateMember=update member set member_pwd=?, email=?,phone=?,address=?,hobby=? where member_id=?
deleteMember=delete from member where member_id=?
#String query="update member set member_pwd=?, email=?,phone=?,address=?,hobby=? where member_id=?";
'IT일반과목 > JDBC' 카테고리의 다른 글
20180903 JDBC 코딩(다른방식의 코딩 여러가지) (0) | 2018.09.03 |
---|---|
20180831 JDBC 코딩(다른방식의 코딩-2) (0) | 2018.08.31 |
20180831 JDBC 코딩(다른방식의 코딩-1) (0) | 2018.08.31 |
20180831 JDBC 과제 (0) | 2018.08.31 |
20180830 JDBC (0) | 2018.08.30 |