본문 바로가기

IT일반과목/JDBC

20180906 JDBC 코딩(다른방식의 코딩 여러가지2)

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.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 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.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;

}

}



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.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;

}

}


#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=?";