본문 바로가기

IT일반과목/JDBC

20180830 JDBC

2018-08-30


client -> view ID로 검색하는걸 요청한다.




--------------------------------------------------------------------------------------------------

## DriverManager ##

 -> 데이터 원본에 JDBC 드라이버를 통하여 커넥션을 만드는 역할을 함

 -> Class.forName() 메소드를 통해 생성되며, 반드시 예외처리를 해야 함

 -> 직접 객체 생성이 불가능하고, getConnection() 메소드를 사용하여 객체를 생성할 수 있음


## Connection ##

 -> Connection 객체는 특정 데이터 원본과 연결된 커넥션을 나타냄

 -> Statement 객체를 생성할 때도 Connection 객체를 사용하여 createStatement() 메소드를 호출하여 생성함

 -> SQL 문장을 실행시키기 전에 우선 Connection 객체가 있어야 함


## Statement ##

 -> Connection 객체에 의해 프로그램에 리턴되는 객체에 의해 구현되는 일종의 메소드 집합을 정의함

 -> Connection 클래스의 createStatement() 메소드를 호출하여 얻어지며, 생성된 Statement 객체로 질의문장을 String 객체에 담아 인자로 전달하여 executeQuery() 메소드를 호출하여 SQL 질의를 수행함


## PreparedStatement ##

 -> Connection 객체의 preparedStatement() 메소드를 사용하여 객체를 생성함

 -> SQL 문장이 미리 컴파일 되고, 실행시간 동안 인수 값을 위한 공간을 확보 할 수 있다는 점에서 Statement 와는 다름

 -> 각 각의 인수에 대해 위치홀더(? 라는 홀더 값)를 사용하여 SQL 문장을 정의할 수 있게 해줌


## ResultSet ##

 -> SELECT 문을 사용한 질의 성공시 ResultSet을 반환 함

 -> ResultSet은 SQL 질의에 의해 생성된 테이블을 담고 있으며

'커서(cursor)'라는 것을 가지고 특정행에 대한 참조를 조작함


--------------------------------------------------------------------------------------------------

클라이언트가 뷰를 통해서 선택을 할것이고 3번을 선택할것이며 selectMemberName일것이며 이 Name이 이름입력

그후 컨트롤러한테 입력해주면 컨트롤러는 DAO한테 요청을한다.넘길때마다 username을 넘겨준다.DB에서 갖고오는데 그때 쿼리문이 select * from member where member_name like %종규%


DAO에서 객체는 여러개일 것이다. -> arraylist 써야한다.



















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:break;
		case 6:break;
		}
		}while(choice!=0);//한번은 무조건 실행될 것이기 때문에 do while로 짰다.
		System.out.println("저희 프로그램을 이용해주셔서 감사합니다. 호구님!");
	}
	
	//회원 가입 정보 입력 메소드
		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;
		}
	
	
} 




package org.kh.member.controller;

import java.util.ArrayList;

import org.kh.member.dao.MemberDao;
import org.kh.member.model.vo.Member;

public class MemberController {

	// 컨트롤러 클래스의 역할
	// view에서 요청한 기능을 컨트롤러가 DAO와의 연결을 하는 역할

	// 회원 전체출력 메소드
	public void selectMemberAll() {
		MemberDao dao = new MemberDao();
		ArrayList<Member> list = dao.selectMemberAll(); // DAO의 회원 전체 조회 메소드 호출
		// 리턴한 list 결과 상황
		// 1. list 가 있을 때
		// 2. lost 가 없을 때

		if (!list.isEmpty())// .isEmpty =비어있따 // list가 있을 떄
		{

			// 결과출력
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");


			//1번째 방식
			for(Member m : list) {
				System.out.println(m);//m만써도된다.
			}


			//2번째 방식
			/*
			for (Member m : list) {
				System.out.println(
						m.getMemberId() + "  " +
						m.getMemberPwd() + "  " +
						m.getMemberName() + "  "+ 
						m.getGender() + "  " +
						m.getAge() + "  " +
						m.getEmail() + "  " +
						m.getPhone()+ "  " +
						m.getAddress() + "  " +
						m.getHobby() + "  " +
						m.getEnrollDate());
			}
			 */


			//3번째 방식
			/*
			 * for (int i = 0; i < list.size(); i++) {
			 * System.out.println(list.get(i).getMemberId() + "  " +
			 * list.get(i).getMemberPwd() + "  " + list.get(i).getMemberName() + "  " +
			 * list.get(i).getGender() + "  " + list.get(i).getAge() + "  " +
			 * list.get(i).getEmail() + "  " + list.get(i).getMemberId() + "  " +
			 * list.get(i).getAddress() + "  " + list.get(i).getHobby() + "  " +
			 * list.get(i).getEnrollDate()); }
			 */

		} else// list가 없을 때
		{
			// 없다고 알려주는 코드
			System.out.println("회원 목록이 없습니다.");
		}

	}

	// 회원 아이디 검색 메소드
	public void selectMemberId(String userId) {//매개변수 낙타표기법으로 썼다.
		//System.out.println("입력받은 문자열 : "+userId);
		MemberDao dao=new MemberDao();
		dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
		Member m = dao.selectMemberId(userId);
		
		if(m!=null) //객체가 있을때(조회가 성공하였을때)
		{
			// 결과출력
			
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
			System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
		}
		else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
		{
			System.out.println("해당되는 ID를 가진 회원이 없습니다.");
		}
		
		
		

	}

	// 회원 이름 검색 메소드
	public void selectMemberName(String userName) {
		MemberDao dao = new MemberDao();
		dao.selectMemberName(userName);
		ArrayList<Member> list = dao.selectMemberName(userName); 
		
		if(!list.isEmpty()) {
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");

			for(Member m:list) {
				System.out.println(m);
			}
		}else {
			System.out.println("누가없는거 찾으래!");
		}
	}

	// 회원 가입 메소드
	public void insertMember(Member m) {
		// TODO Auto-generated method stub
		MemberDao dao = new MemberDao();
		int result=dao.insertMember(m);
		
		if(result>0) {
			System.out.println("정상적으로 회원가입 되었습니다.");
		}
		else {
			System.out.println("회원 가입에 실패 하였습니다.");
		}
	}

	// 회원 정보 수정 메소드
	public void updateMember() {
	}

	// 회원 탈뢰 메소드
	public void deleteMember() {
	}

	

}




package org.kh.member.dao;

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

import org.kh.member.model.vo.Member;

public class MemberDao {

	//DBMS에 접근하는 전체 회원 조회 메소드
	public ArrayList<Member> selectMemberAll() {

		//필요한 레퍼런스 생성(Connection, Statement, ResultSet)

		//java.sql 패키지 import
		Connection conn = null; //Connection 레퍼런스 (객체 생성은 아직 안함)
		Statement stmt = null; //Statement 래퍼런스 (객체 생성은 아직 안함)
		ResultSet rset=null; //ResultSet 래퍼런스 (객체 생성은 아직 안함)

		ArrayList<Member> list=new ArrayList<Member>();

		//@ JDBC Coding 절차
		try {
			//1. Driver 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");

			//2. DBMS와 연결 (Connection 사용)
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
					,"member", "member");
			//첫번째는 연결 정보(DB종류, 타입, IP주소, 포트 등등)
			//두번째는 연결하는 DB의 ID(아이디)
			//세번째는 연결하는 ID의 PW(비밀번호)
			//get으로 읽어오는것이므로 저장하는 것이다.conn에 저장하는 것이다.

			System.out.println(conn);
			// conn 레퍼런스 안에 있는 값을 출력시
			// DBMS에 정상연결 되었다면 hashCode 값(Connection 값)이 출력 되고
			// DBMS에 연결 실패 하였다면 null값을 리턴

			//3. Statement 생성 - 작성한 쿼리문을 전송할 객체를 생성 해야 함
			// Connection (conn) 객체를 이용하여 Statement 객체를 생성함
			stmt=conn.createStatement(); // Statement 객체 생성

			//4. SQL 전송
			// - Query 문이 있어야 전송합니다.
			String query = "select * from member";
			rset=stmt.executeQuery(query); // Statement 객체를 이용하여 쿼리문 실행
			//결과를 rset에 담는다.


			//5. 결과 처리
			// rset을 이용하여 결과를 처리함
			// rset.next() 메소드와 rset.set...() 메소드를 이용함
			// next 메소드는 각 행을 가리키는 메소드(작업시 마다 사용해야함)
			// set...() 메소드는 각 컬럼의 정보를 가져올때 사용함

			//rset.next()
			//rset.getString("member_id"); -> rset을 이용해스트링값갖고오는데 그컬럼명은 멤버아이디꺼갖고오라는 것이다.


			while(rset.next()) {
				Member m = new Member();

				//ID값 저장하기
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));

				list.add(m);
			}


		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//오라클에 jdbc에 드라이버에 오라클드라이버를 등록하겠다.
		//이코드가 없어도 8버전부턴 가능하긴한데 넣어주는게 좋다.
		catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//6. 연결된 리소스 닫기 (close 작업 - finally에서 작업)
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		return list;

	}

	public Member selectMemberId(String userId) {

		Connection conn=null;//DBMS와 연결
		Statement stmt=null;//작성한 쿼리문을 전송할 객체를 생성 해야 함
		ResultSet rset=null;//SELECT 구문일 경우 ResultSet을 이용하여 정보를 객체에 담는 처리

		Member m = null; //멤버객체를 여기선 바깥에 만드는데 그 이유는?
		//결과가 조회되던안되던 리턴받을 것이다.

		try {

			//1. Driver 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");

			//2. DBMS 연결
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			//SQLException 에러 뜰수있기 때문에 catch로잡아줘야한다.

			//3. Statement 객체 생성
			// Connection (conn) 객체를 이용하여 Statement 객체를 생성함
			stmt=conn.createStatement();

			//4. SQL 전송
			// - Query 문이 있어야 전송합니다.
			String query="select * from member where member_id='"+userId+"'";
			rset=stmt.executeQuery(query);// Statement 객체를 이용하여 쿼리문 실행

			//5. 결과 처리
			// rset을 이용하여 결과를 처리함
			// rset.next() 메소드와 rset.set...() 메소드를 이용함
			// next 메소드는 각 행을 가리키는 메소드(작업시 마다 사용해야함)
			// set...() 메소드는 각 컬럼의 정보를 가져올때 사용함

			if(rset.next()) {//만약에 1명의 결과가 조회되었다면 진행하고 없다면 하지마라!

				m=new Member();//결과가 있으므로 정보를 저장할 VO 객체 생성
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setPhone(rset.getString("phone"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
			}

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//6. 연결된 리소스 닫기 (close 작업 - finally에서 작업)
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		return m; //m래퍼런스 안에 있는 값을 리턴(Member 객체 혹은 null)





	}

	public ArrayList<Member> selectMemberName(String userName) {
		// TODO Auto-generated method stub
		Connection conn=null;
		Statement stmt=null;
		ResultSet rset=null;


		ArrayList<Member> list = new ArrayList<Member>();

		try {
			//1. Driver 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");

			//2. DBMS 연결
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
					,"member", "member");

			//연결되었는지 확인해볼 것이다.
			System.out.println(conn);

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

			//4. SQL 전송
			// - Query 문이 있어야 전송합니다.
			String query="select * from member where member_name like '%"+userName+"%'";
			rset=stmt.executeQuery(query);

			//5. 결과 처리
			//while을 쓴 이유는 값을 저장하기 위해서이다.
			while(rset.next()) {
				Member m = new Member();

				//ID값 저장하기
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));

				list.add(m);
			}


		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {

			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return list;



	}
	//회원 가입용 메소드
	public int insertMember(Member m) {

		//래퍼런스 3종세트
		Connection conn=null;
		Statement stmt=null;
		//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
		int result=0; //결과를 숫자로 받을려고 한다.

		try {

			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");

			stmt = conn.createStatement();

			String query="insert into member values("+
					"'"+m.getMemberId()+"',"+
					"'"+m.getMemberPwd()+"',"+
					"'"+m.getMemberName()+"',"+
					"'"+m.getGender()+"',"+
					"'"+m.getAge()+"',"+
					"'"+m.getEmail()+"',"+
					"'"+m.getPhone()+"',"+
					"'"+m.getAddress()+"',"+
					"'"+m.getHobby()+"',"+"sysdate)";

			System.out.println(query);
			//stmt.executeQuery(sql) -> select 전용이다.

			//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
			result=stmt.executeUpdate(query); //return 타입이 int형이다.

			//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
			if(result>0) {//정상처리되었을때
				conn.commit(); //적용
			}
			else {
				conn.rollback(); //되돌리기
			}

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		return result;
	}


}




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방식으로 할 수도 있다.
	}
}


'IT일반과목 > JDBC' 카테고리의 다른 글

20180831 JDBC 코딩(다른방식의 코딩-2)  (0) 2018.08.31
20180831 JDBC 코딩(다른방식의 코딩-1)  (0) 2018.08.31
20180831 JDBC 과제  (0) 2018.08.31
20180829 JDBC CODING 절차  (0) 2018.08.29
20180828 JDBC개요  (0) 2018.08.28