반응형

 

JDBC (Java Database Connectivity)

 

 

- 인터페이스 종류

Connection
Statement
Prepare & Statement
ResultSet

 

 

package kr.or.ddit.basic;
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.Scanner;

/*
	회원정보를 관리하는 프로그램을 작성하는데 
	아래의 메뉴를 모두 구현하시오. (CRUD기능 구현하기)
	(DB의 MYMEMBER테이블을 이용하여 작업한다.)
	
	* 자료 삭제는 회원ID를 입력 받아서 삭제한다.
	
	예시메뉴)
	----------------------
		== 작업 선택 ==
		1. 자료 입력			---> insert
		2. 자료 삭제			---> delete
		3. 자료 수정			---> update
		4. 전체 자료 출력	---> select
		5. 작업 끝.
	----------------------
	 
	   
// 회원관리 프로그램 테이블 생성 스크립트 
create table mymember(
    mem_id varchar2(8) not null,  -- 회원ID
    mem_name varchar2(100) not null, -- 이름
    mem_tel varchar2(50) not null, -- 전화번호
    mem_addr varchar2(128),    -- 주소
    reg_dt DATE DEFAULT sysdate, -- 등록일
    CONSTRAINT MYMEMBER_PK PRIMARY KEY (mem_id)
);

*/
public class T01MemberInfoTest {
	
	private Connection conn;
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private Scanner scan = new Scanner(System.in);
	
	/**
	 * 메뉴를 출력하는 메서드
	 */
	public void displayMenu(){
		System.out.println();
		System.out.println("----------------------");
		System.out.println("  === 작 업 선 택 ===");
		System.out.println("  1. 자료 입력");
		System.out.println("  2. 자료 삭제");
		System.out.println("  3. 자료 수정");
		System.out.println("  4. 전체 자료 출력");
		System.out.println("  5. 작업 끝.");
		System.out.println("----------------------");
		System.out.print("원하는 작업 선택 >> ");
	}
	
	/**
	 * 프로그램 시작메서드
	 */
	public void start(){
		int choice;
		do{
			displayMenu(); //메뉴 출력
			choice = scan.nextInt(); // 메뉴번호 입력받기
			switch(choice){
				case 1 :  // 자료 입력
					insertMember();
					break;
				case 2 :  // 자료 삭제
				
					break;
				case 3 :  // 자료 수정
				
					break;
				case 4 :  // 전체 자료 출력
			
					break;
				case 5 :  // 작업 끝
					System.out.println("작업을 마칩니다.");
					break;
				default :
					System.out.println("번호를 잘못 입력했습니다. 다시입력하세요");
			}
		}while(choice!=5);
	}
	
	
	/**
	 * 회원 정보를 등록하기 위한 메서드
	 */
	private void insertMember() {
		
		boolean isExist = false;
		
		System.out.println();
		System.out.println("추가할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = checkMember(memId);
		
		if(isExist) {
			System.out.println("이미 존재하는 회원입니다.");
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		// JDBC 코딩 시작...
		
		try {
			
			// 옵션(드라이버 빌드패스 설정여부 확인용)...
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			
			// 오라클 접속...
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:xe", 
					"pc10", 
					"java");
			
			String sql = "insert into mymember" + 
					" (mem_id, mem_name, mem_tel, mem_addr)\r\n" + 
					"values (?, ?, ?, ?)";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			pstmt.setString(2, memName);
			pstmt.setString(3, memTel);
			pstmt.setString(4, memAddr);
			
			// executeQuery // select 할 때
			int cnt = pstmt.executeUpdate(); // insert, update, delete
			
			System.out.println();
			if(cnt > 0) {
				System.out.println(memId + "회원 정보 등록작업 성공!");
			} else {
				System.out.println(memId + "회원 정보 등록작업 실패...");
			}
			
			
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
			if(rs != null) try {rs.close();} catch(SQLException ex) {}
			if(pstmt != null) try {pstmt.close();} catch(SQLException ex) {}
			if(stmt != null) try {stmt.close();} catch(SQLException ex) {}
			if(conn != null) try {conn.close();} catch(SQLException ex) {}
		}
		
	}

	/**
	 * 회원 정보가 존재하는지 체크하기 위한 메서드
	 * @param memId 체크할 회원ID
	 * @return
	 */
	private boolean checkMember(String memId) {
		
		return false;
	}

	public static void main(String[] args) {
		T01MemberInfoTest memObj = new T01MemberInfoTest();
		memObj.start();
	}

}

 

 

 

 

  • 호출 시점 확인

 

static 블록은 정보를 가져오는 시점에서만 단 한 번 작동함

package kr.or.ddit.basic;

public class T02StaticBlockTest {
	
	public T02StaticBlockTest() {
		System.out.println("생성자 호출됨.");
	}
	
	 static {
		 System.out.println("첫번째 static block 호출됨.");
	 }
	 
	 static {
		 System.out.println("두번째 static block 호출됨.");
	 }
	 
	 {
		 System.out.println("첫번째 instance block 호출됨.");
	 }
	 
	 {
		 System.out.println("두번째 instance block 호출됨.");
	 }
	 
	 public static void main(String[] args) {
		new T02StaticBlockTest(); // 첫번째 객체 생성
//		new T02StaticBlockTest(); // 두번째 객체 생성
	}
}

 

결과 화면1

 

 

 

=> JDBC 따로 분리

package kr.or.ddit.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtil {
	
	static {
		try {
			// 옵션(드라이버 빌드패스 설정여부 확인용)...
			// 단 한 번만 호출됨
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
		
		try {
			return DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:xe", 
					"pc10", // pc 이름
					"java"); // 비밀번호
		} catch (SQLException e) {
			e.printStackTrace();
			
			return null;
		}
	}
	
	public static void close(Connection conn, 
							 PreparedStatement pstmt,
							 Statement stmt, 
							 ResultSet rs) {
		
		// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
		if(rs != null) try {rs.close();} catch(SQLException ex) {}
		if(pstmt != null) try {pstmt.close();} catch(SQLException ex) {}
		if(stmt != null) try {stmt.close();} catch(SQLException ex) {}
		if(conn != null) try {conn.close();} catch(SQLException ex) {}
	}
}

 

package kr.or.ddit.basic;
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.time.LocalDate;
import java.util.Scanner;

import kr.or.ddit.util.JDBCUtil;

/*
	회원정보를 관리하는 프로그램을 작성하는데 
	아래의 메뉴를 모두 구현하시오. (CRUD기능 구현하기)
	(DB의 MYMEMBER테이블을 이용하여 작업한다.)
	
	* 자료 삭제는 회원ID를 입력 받아서 삭제한다.
	
	예시메뉴)
	----------------------
		== 작업 선택 ==
		1. 자료 입력			---> insert
		2. 자료 삭제			---> delete
		3. 자료 수정			---> update
		4. 전체 자료 출력	---> select
		5. 작업 끝.
	----------------------
	 
	   
// 회원관리 프로그램 테이블 생성 스크립트 
create table mymember(
    mem_id varchar2(8) not null,  -- 회원ID
    mem_name varchar2(100) not null, -- 이름
    mem_tel varchar2(50) not null, -- 전화번호
    mem_addr varchar2(128),    -- 주소
    reg_dt DATE DEFAULT sysdate, -- 등록일
    CONSTRAINT MYMEMBER_PK PRIMARY KEY (mem_id)
);

*/
public class T01MemberInfoTest {
	
	private Connection conn;
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private Scanner scan = new Scanner(System.in);
	
	/**
	 * 메뉴를 출력하는 메서드
	 */
	public void displayMenu(){
		System.out.println();
		System.out.println("----------------------");
		System.out.println("  === 작 업 선 택 ===");
		System.out.println("  1. 자료 입력");
		System.out.println("  2. 자료 삭제");
		System.out.println("  3. 자료 수정");
		System.out.println("  4. 전체 자료 출력");
		System.out.println("  5. 작업 끝.");
		System.out.println("----------------------");
		System.out.print("원하는 작업 선택 >> ");
	}
	
	/**
	 * 프로그램 시작메서드
	 */
	public void start(){
		int choice;
		do{
			displayMenu(); //메뉴 출력
			choice = scan.nextInt(); // 메뉴번호 입력받기
			switch(choice){
				case 1 :  // 자료 입력
					insertMember();
					break;
				case 2 :  // 자료 삭제
					deleteMember();
					break;
				case 3 :  // 자료 수정
					updateMember();
					break;
				case 4 :  // 전체 자료 출력
					displayMember();
					break;
				case 5 :  // 작업 끝
					System.out.println("작업을 마칩니다.");
					break;
				default :
					System.out.println("번호를 잘못 입력했습니다. 다시입력하세요");
			}
		}while(choice!=5);
	}
	
	/**
	 * 회원정보를 모두 출력하기 위한 메서드
	 */
	private void displayMember() {
		System.out.println();
		System.out.println("---------------------------------------------");
		System.out.println(" ID\t생성일\t이 름\t전화번호\t\t주    소");
		System.out.println("---------------------------------------------");
		
		try {
			conn = JDBCUtil.getConnection();
			
			String sql = "select * from mymember";
			
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				String memId = rs.getString("mem_id");
				String memName = rs.getString("mem_name");
				String memTel = rs.getString("mem_tel");
				String memAddr = rs.getString("mem_addr");
				
				// 날짜만 가져올 때: LocalDate, 시간까지 가져올 때: LocalDateTime
				LocalDate regDt = rs.getTimestamp("reg_dt")
						.toLocalDateTime().toLocalDate();
				
				System.out.println(" " + memId + "\t" + regDt 
									+ "\t" + memName + "\t" + memTel
									+ "\t\t" + memAddr);
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil.close(conn, pstmt, pstmt, rs);
		}
	}

	/**
	 * 회원정보를 삭제하기 위한 메서드
	 */
	private void deleteMember() {
		
		System.out.println();
		System.out.println("삭제할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		try {
			conn = JDBCUtil.getConnection();
			
			String sql = "delete from mymember where mem_id = ? ";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			
			int cnt = pstmt.executeUpdate();
			
			if(cnt > 0) {
				System.out.println(memId + "인 회원정보 삭제 성공!");
			} else {
				System.out.println(memId + "인 회원정보 삭제 실패!");
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil.close(conn, pstmt, pstmt, rs);
		}
	}

	/**
	 * 회원정보를 수정하기 위한 메서드
	 */
	private void updateMember() {
		boolean isExist = false;
		
		System.out.println();
		System.out.println("수정할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = checkMember(memId);
		
		if(!isExist) {
			System.out.println(memId + "인 회원이 존재하지 않습니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		// JDBC 코딩 시작...
		
		try {
			// 오라클 접속...
			conn = JDBCUtil.getConnection();
			
			String sql = "update mymember\r\n" + 
						 "set mem_name = ?,\r\n" + 
						 "mem_tel = ?,\r\n" + 
						 "mem_addr = ?\r\n" + 
						 "where mem_id = ?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memName);
			pstmt.setString(2, memTel);
			pstmt.setString(3, memAddr);
			pstmt.setString(4, memId);
			
			// executeQuery // select 할 때
			int cnt = pstmt.executeUpdate(); // insert, update, delete
			
			System.out.println();
			if(cnt > 0) {
				System.out.println(memId + "회원 정보 수정작업 성공!");
			} else {
				System.out.println(memId + "회원 정보 수정작업 실패...");
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
			JDBCUtil.close(conn, pstmt, pstmt, rs);
		}
	}

	/**
	 * 회원 정보를 등록하기 위한 메서드
	 */
	private void insertMember() {
		
		boolean isExist = false;
		
		System.out.println();
		System.out.println("추가할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = checkMember(memId);
		
		if(isExist) {
			System.out.println(memId + "인 회원이 이미 존재합니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		// JDBC 코딩 시작...
		
		try {
			// 오라클 접속...
			conn = JDBCUtil.getConnection();
			
			String sql = "insert into mymember" + 
					" (mem_id, mem_name, mem_tel, mem_addr)\r\n" + 
					"values (?, ?, ?, ?)";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			pstmt.setString(2, memName);
			pstmt.setString(3, memTel);
			pstmt.setString(4, memAddr);
			
			// executeQuery // select 할 때
			int cnt = pstmt.executeUpdate(); // insert, update, delete
			
			System.out.println();
			if(cnt > 0) {
				System.out.println(memId + "회원 정보 등록작업 성공!");
			} else {
				System.out.println(memId + "회원 정보 등록작업 실패...");
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
			JDBCUtil.close(conn, pstmt, pstmt, rs);
		}
	}

	/**
	 * 회원 정보가 존재하는지 체크하기 위한 메서드
	 * @param memId 체크할 회원ID
	 * @return
	 */
	private boolean checkMember(String memId) {
		
		boolean isExist = false;
		
		try {
			conn = JDBCUtil.getConnection();
			
			String sql = "select count(*) cnt\r\n" + 
					"from mymember\r\n" + 
					"where mem_id = ?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				int cnt = rs.getInt("cnt");
				
				if(cnt > 0) {
					isExist = true;
				}
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil.close(conn, pstmt, pstmt, rs);
		}
		
		return isExist;
	}

	public static void main(String[] args) {
		T01MemberInfoTest memObj = new T01MemberInfoTest();
		memObj.start();
	}

}

 

 

 

JDBC 진행 순서

 

 

+ ojdbc6.jar을 추가 후 드라이버 로드 해야 한다.

1. Connection DB 연결

Class.forName("oracle.jdbc.driver.OracleDriver");
String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
String db_id = "id";
String db_pw = "pw";
Connection conn = DriverManager.getConnection(db_url, db_id, db_pw);



2. Statement SQL 쿼리 실행

String sql = "insert into tableName values(?, ?, ?)";
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, name);
int cnt = psmt.executeUpdate();



3. execute() 결과값 처리

String sql = "select * from tableName where user = ?";
try {
	pstmt = conn.prepareStatement(sql);
	pstmt.setString(1, id);
			
	rs = psmt.executeQuery();
	
	if(rs.next()) {
		int num = rs.getInt(1);
		String id = rs.getString(2);
		String pw = rs.getString(3);
	}
	dto = new TableName(num, id, pw);
}



4. close() DB 연결 해제

if(rs != null) try {rs.close();} catch(SQLException ex) {}
if(pstmt != null) try {pstmt.close();} catch(SQLException ex) {}
if(stmt != null) try {stmt.close();} catch(SQLException ex) {}
if(conn != null) try {conn.close();} catch(SQLException ex) {}

 

 

 

실행 메소드

 

메소드명(매개변수) 리턴타입 기능
execute() boolean sql문 실행.
성공 시 false
executeQuery() ResultSet Select구문 실행
executeUpdate() int Select 이외 구문 실행 => insert, update, delete문 실행

영향을 받은 행의 개수를 반환
create, drop 관련 구문 시 -1
close() void PreparedStatement의 자원 반납

 

 

 

Properties를 사용하여 변경 (방법1)

 

package kr.or.ddit.basic;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

public class T03PropertiesTest {
	public static void main(String[] args) {
		Properties prop = new Properties();
		
		try {
			FileInputStream fis = 
					new FileInputStream("./res/db.properties");
			
			prop.load(fis); // 파일 내용을 읽어와 key와 value값으로 분류하여
							// Properties 객체에 담아준다.
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		
		/////////////////////////////////////////////////////
		
		// 읽어온 데이터 출력하기
		Enumeration<String> keys = 
				(Enumeration<String>)prop.propertyNames();
		
		while(keys.hasMoreElements()) {
			String key = keys.nextElement();
			String value = prop.getProperty(key);
			System.out.println(key + " : " + value);
		}
		
		System.out.println("출력 끝...");
		
	}
}

 

driver = oracle.jdbc.driver.OracleDriver
url = jdbc:oracle:thin:@localhost:1521:xe
username = 이름
password = 비밀번호

 

결과 화면2

 

 

=> 상단의 JDBCUtil 파일 변경

properties 파일의 위치 : java폴더/res/db.properties

 

package kr.or.ddit.util;

import java.io.FileInputStream;
import java.io.IOException;
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.Properties;

/**
 * db.properties파일의 내용으로 DB정보를 설정하는 방법
 * 방법1) Properties객체 이용하기
 */
public class JDBCUtil2 {
	
	static Properties prop;
	
	static {
		try {
			
			prop = new Properties();
			
			FileInputStream fis = 
					new FileInputStream("./res/db.properties");
			
			prop.load(fis); // 파일 내용을 읽어와 key와 value값으로 분류하여
							// Properties 객체에 담아준다.
			
			// 옵션(드라이버 빌드패스 설정여부 확인용)...
			// 단 한 번만 호출됨
			Class.forName(prop.getProperty("driver"));
		} catch (ClassNotFoundException | IOException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
		
		try {
			return DriverManager.getConnection(
					prop.getProperty("url"), 
					prop.getProperty("username"), 
					prop.getProperty("password"));
		} catch (SQLException e) {
			e.printStackTrace();
			
			return null;
		}
	}
	
	public static void close(Connection conn, 
							 PreparedStatement pstmt,
							 Statement stmt, 
							 ResultSet rs) {
		
		// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
		if(rs != null) try {rs.close();} catch(SQLException ex) {}
		if(pstmt != null) try {pstmt.close();} catch(SQLException ex) {}
		if(stmt != null) try {stmt.close();} catch(SQLException ex) {}
		if(conn != null) try {conn.close();} catch(SQLException ex) {}
	}
}

 

package kr.or.ddit.basic;
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.time.LocalDate;
import java.util.Scanner;

import kr.or.ddit.util.JDBCUtil2;

/*
	회원정보를 관리하는 프로그램을 작성하는데 
	아래의 메뉴를 모두 구현하시오. (CRUD기능 구현하기)
	(DB의 MYMEMBER테이블을 이용하여 작업한다.)
	
	* 자료 삭제는 회원ID를 입력 받아서 삭제한다.
	
	예시메뉴)
	----------------------
		== 작업 선택 ==
		1. 자료 입력			---> insert
		2. 자료 삭제			---> delete
		3. 자료 수정			---> update
		4. 전체 자료 출력	---> select
		5. 작업 끝.
	----------------------
	 
	   
// 회원관리 프로그램 테이블 생성 스크립트 
create table mymember(
    mem_id varchar2(8) not null,  -- 회원ID
    mem_name varchar2(100) not null, -- 이름
    mem_tel varchar2(50) not null, -- 전화번호
    mem_addr varchar2(128),    -- 주소
    reg_dt DATE DEFAULT sysdate, -- 등록일
    CONSTRAINT MYMEMBER_PK PRIMARY KEY (mem_id)
);

*/
public class T01MemberInfoTest {
	
	private Connection conn;
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private Scanner scan = new Scanner(System.in);
	
	/**
	 * 메뉴를 출력하는 메서드
	 */
	public void displayMenu(){
		System.out.println();
		System.out.println("----------------------");
		System.out.println("  === 작 업 선 택 ===");
		System.out.println("  1. 자료 입력");
		System.out.println("  2. 자료 삭제");
		System.out.println("  3. 자료 수정");
		System.out.println("  4. 전체 자료 출력");
		System.out.println("  5. 작업 끝.");
		System.out.println("----------------------");
		System.out.print("원하는 작업 선택 >> ");
	}
	
	/**
	 * 프로그램 시작메서드
	 */
	public void start(){
		int choice;
		do{
			displayMenu(); //메뉴 출력
			choice = scan.nextInt(); // 메뉴번호 입력받기
			switch(choice){
				case 1 :  // 자료 입력
					insertMember();
					break;
				case 2 :  // 자료 삭제
					deleteMember();
					break;
				case 3 :  // 자료 수정
					updateMember();
					break;
				case 4 :  // 전체 자료 출력
					displayMember();
					break;
				case 5 :  // 작업 끝
					System.out.println("작업을 마칩니다.");
					break;
				default :
					System.out.println("번호를 잘못 입력했습니다. 다시입력하세요");
			}
		}while(choice!=5);
	}
	
	/**
	 * 회원정보를 모두 출력하기 위한 메서드
	 */
	private void displayMember() {
		System.out.println();
		System.out.println("---------------------------------------------");
		System.out.println(" ID\t생성일\t이 름\t전화번호\t\t주    소");
		System.out.println("---------------------------------------------");
		
		try {
			conn = JDBCUtil2.getConnection();
			
			String sql = "select * from mymember";
			
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				String memId = rs.getString("mem_id");
				String memName = rs.getString("mem_name");
				String memTel = rs.getString("mem_tel");
				String memAddr = rs.getString("mem_addr");
				
				// 날짜만 가져올 때: LocalDate, 시간까지 가져올 때: LocalDateTime
				LocalDate regDt = rs.getTimestamp("reg_dt")
						.toLocalDateTime().toLocalDate();
				
				System.out.println(" " + memId + "\t" + regDt 
									+ "\t" + memName + "\t" + memTel
									+ "\t\t" + memAddr);
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil2.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원정보를 삭제하기 위한 메서드
	 */
	private void deleteMember() {
		
		System.out.println();
		System.out.println("삭제할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		try {
			conn = JDBCUtil2.getConnection();
			
			String sql = "delete from mymember where mem_id = ? ";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			
			int cnt = pstmt.executeUpdate();
			
			if(cnt > 0) {
				System.out.println(memId + "인 회원정보 삭제 성공!");
			} else {
				System.out.println(memId + "인 회원정보 삭제 실패!");
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil2.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원정보를 수정하기 위한 메서드
	 */
	private void updateMember() {
		boolean isExist = false;
		
		System.out.println();
		System.out.println("수정할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = checkMember(memId);
		
		if(!isExist) {
			System.out.println(memId + "인 회원이 존재하지 않습니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		// JDBC 코딩 시작...
		
		try {
			// 오라클 접속...
			conn = JDBCUtil2.getConnection();
			
			String sql = "update mymember\r\n" + 
						 "set mem_name = ?,\r\n" + 
						 "mem_tel = ?,\r\n" + 
						 "mem_addr = ?\r\n" + 
						 "where mem_id = ?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memName);
			pstmt.setString(2, memTel);
			pstmt.setString(3, memAddr);
			pstmt.setString(4, memId);
			
			// executeQuery // select 할 때
			int cnt = pstmt.executeUpdate(); // insert, update, delete
			
			System.out.println();
			if(cnt > 0) {
				System.out.println(memId + "회원 정보 수정작업 성공!");
			} else {
				System.out.println(memId + "회원 정보 수정작업 실패...");
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
			JDBCUtil2.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원 정보를 등록하기 위한 메서드
	 */
	private void insertMember() {
		
		boolean isExist = false;
		
		System.out.println();
		System.out.println("추가할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = checkMember(memId);
		
		if(isExist) {
			System.out.println(memId + "인 회원이 이미 존재합니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		// JDBC 코딩 시작...
		
		try {
			// 오라클 접속...
			conn = JDBCUtil2.getConnection();
			
			String sql = "insert into mymember" + 
					" (mem_id, mem_name, mem_tel, mem_addr)\r\n" + 
					"values (?, ?, ?, ?)";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			pstmt.setString(2, memName);
			pstmt.setString(3, memTel);
			pstmt.setString(4, memAddr);
			
			// executeQuery // select 할 때
			int cnt = pstmt.executeUpdate(); // insert, update, delete
			
			System.out.println();
			if(cnt > 0) {
				System.out.println(memId + "회원 정보 등록작업 성공!");
			} else {
				System.out.println(memId + "회원 정보 등록작업 실패...");
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
			JDBCUtil2.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원 정보가 존재하는지 체크하기 위한 메서드
	 * @param memId 체크할 회원ID
	 * @return
	 */
	private boolean checkMember(String memId) {
		
		boolean isExist = false;
		
		try {
			conn = JDBCUtil2.getConnection();
			
			String sql = "select count(*) cnt\r\n" + 
					"from mymember\r\n" + 
					"where mem_id = ?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				int cnt = rs.getInt("cnt");
				
				if(cnt > 0) {
					isExist = true;
				}
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil2.close(conn, pstmt, stmt, rs);
		}
		
		return isExist;
	}

	public static void main(String[] args) {
		T01MemberInfoTest memObj = new T01MemberInfoTest();
		memObj.start();
	}

}

 

 

 

ResourceBundle 객체

 

: 파일정보는 파일명만 지정하고 확장자는 지정하지 않는다.
(확장자는 항상 .properties 이기 때문)

 

 

package kr.or.ddit.basic;

import java.util.Enumeration;
import java.util.ResourceBundle;

public class T04ResoutceBundleTest {
/*
 * ResourceBundle 객체를 이용하여 properties파일 읽어오기
 * 
 * => 파일정보는 파일명만 지정하고 확장자는 지정하지 않는다.
 *    (확장자는 항상 .properties 이기 때문에...)
 */
	public static void main(String[] args) {
		ResourceBundle bundle = ResourceBundle.getBundle("db");
		
		Enumeration<String> keys = bundle.getKeys();
		
		while(keys.hasMoreElements()) { // 커서 바로 앞에 데이터가 있는지 체크
			String key = keys.nextElement(); // 현재 커서가 가리키는 데이터 리턴 후 커서 위치 다음 칸으로 옮김
			
			// key값을 이용하여 value값을 가져오는 방법
			// => bundle객체변수.getString(key값);
			String value = bundle.getString(key);
			
			System.out.println(key + " : " + value);
		}
		
		System.out.println("출력 끝...");
	}
}

 

결과 화면3 : res 폴더를 소스폴더가 아닌 폴더로 제작했기에 컴파일하지 못해서 오류가 발생함

 

+ res 폴더를 소스폴더로 변경

더보기
사용 폴더에서 오른쪽 마우스 클릭 > Build Path > Configure Build Path

 

Source > Add Folder

 

res 클릭 > OK

 

추가된 것 확인 > Apply and Close 후 재실행

 

 

+properties 파일 작성을 위해 할 작업

더보기
Help > Install New Software

 

Work with에 입력할 내용

http://raw.githubusercontent.com/qxo/eclipse-propedit/improve/PropertiesEditorUpdateSite/eclipse/updates/site.xml

 

Work with에 입력 > add > 체크박스 클릭 > next 후 전부 ok > Install anyway

 

 

 

 

ResourceBundle를 사용하여 변경 (방법2)

 

 

=> 상단의 JDBCUtil 파일 변경하면 된다.

package kr.or.ddit.util;

import java.io.FileInputStream;
import java.io.IOException;
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.Properties;
import java.util.ResourceBundle;

/**
 * db.properties파일의 내용으로 DB정보를 설정하는 방법
 * 방법2) ResourceBundle객체 이용하기
 */
public class JDBCUtil3 {
	
	static ResourceBundle bundle;
	
	static {
		try {
			bundle = ResourceBundle.getBundle("db");
			
			// 옵션(드라이버 빌드패스 설정여부 확인용)...
			// 단 한 번만 호출됨
			Class.forName(bundle.getString("driver"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
		
		try {
			return DriverManager.getConnection(
					bundle.getString("url"), 
					bundle.getString("username"), 
					bundle.getString("password"));
		} catch (SQLException e) {
			e.printStackTrace();
			
			return null;
		}
	}
	
	public static void close(Connection conn, 
							 PreparedStatement pstmt,
							 Statement stmt, 
							 ResultSet rs) {
		
		// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
		if(rs != null) try {rs.close();} catch(SQLException ex) {}
		if(pstmt != null) try {pstmt.close();} catch(SQLException ex) {}
		if(stmt != null) try {stmt.close();} catch(SQLException ex) {}
		if(conn != null) try {conn.close();} catch(SQLException ex) {}
	}
}

 

package kr.or.ddit.basic;
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.time.LocalDate;
import java.util.Scanner;

import kr.or.ddit.util.JDBCUtil3;

/*
	회원정보를 관리하는 프로그램을 작성하는데 
	아래의 메뉴를 모두 구현하시오. (CRUD기능 구현하기)
	(DB의 MYMEMBER테이블을 이용하여 작업한다.)
	
	* 자료 삭제는 회원ID를 입력 받아서 삭제한다.
	
	예시메뉴)
	----------------------
		== 작업 선택 ==
		1. 자료 입력			---> insert
		2. 자료 삭제			---> delete
		3. 자료 수정			---> update
		4. 전체 자료 출력	---> select
		5. 작업 끝.
	----------------------
	 
	   
// 회원관리 프로그램 테이블 생성 스크립트 
create table mymember(
    mem_id varchar2(8) not null,  -- 회원ID
    mem_name varchar2(100) not null, -- 이름
    mem_tel varchar2(50) not null, -- 전화번호
    mem_addr varchar2(128),    -- 주소
    reg_dt DATE DEFAULT sysdate, -- 등록일
    CONSTRAINT MYMEMBER_PK PRIMARY KEY (mem_id)
);

*/
public class T01MemberInfoTest {
	
	private Connection conn;
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private Scanner scan = new Scanner(System.in);
	
	/**
	 * 메뉴를 출력하는 메서드
	 */
	public void displayMenu(){
		System.out.println();
		System.out.println("----------------------");
		System.out.println("  === 작 업 선 택 ===");
		System.out.println("  1. 자료 입력");
		System.out.println("  2. 자료 삭제");
		System.out.println("  3. 자료 수정");
		System.out.println("  4. 전체 자료 출력");
		System.out.println("  5. 작업 끝.");
		System.out.println("----------------------");
		System.out.print("원하는 작업 선택 >> ");
	}
	
	/**
	 * 프로그램 시작메서드
	 */
	public void start(){
		int choice;
		do{
			displayMenu(); //메뉴 출력
			choice = scan.nextInt(); // 메뉴번호 입력받기
			switch(choice){
				case 1 :  // 자료 입력
					insertMember();
					break;
				case 2 :  // 자료 삭제
					deleteMember();
					break;
				case 3 :  // 자료 수정
					updateMember();
					break;
				case 4 :  // 전체 자료 출력
					displayMember();
					break;
				case 5 :  // 작업 끝
					System.out.println("작업을 마칩니다.");
					break;
				default :
					System.out.println("번호를 잘못 입력했습니다. 다시입력하세요");
			}
		}while(choice!=5);
	}
	
	/**
	 * 회원정보를 모두 출력하기 위한 메서드
	 */
	private void displayMember() {
		System.out.println();
		System.out.println("---------------------------------------------");
		System.out.println(" ID\t생성일\t이 름\t전화번호\t\t주    소");
		System.out.println("---------------------------------------------");
		
		try {
			conn = JDBCUtil3.getConnection();
			
			String sql = "select * from mymember";
			
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				String memId = rs.getString("mem_id");
				String memName = rs.getString("mem_name");
				String memTel = rs.getString("mem_tel");
				String memAddr = rs.getString("mem_addr");
				
				// 날짜만 가져올 때: LocalDate, 시간까지 가져올 때: LocalDateTime
				LocalDate regDt = rs.getTimestamp("reg_dt")
						.toLocalDateTime().toLocalDate();
				
				System.out.println(" " + memId + "\t" + regDt 
									+ "\t" + memName + "\t" + memTel
									+ "\t\t" + memAddr);
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원정보를 삭제하기 위한 메서드
	 */
	private void deleteMember() {
		
		System.out.println();
		System.out.println("삭제할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		try {
			conn = JDBCUtil3.getConnection();
			
			String sql = "delete from mymember where mem_id = ? ";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			
			int cnt = pstmt.executeUpdate();
			
			if(cnt > 0) {
				System.out.println(memId + "인 회원정보 삭제 성공!");
			} else {
				System.out.println(memId + "인 회원정보 삭제 실패!");
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원정보를 수정하기 위한 메서드
	 */
	private void updateMember() {
		boolean isExist = false;
		
		System.out.println();
		System.out.println("수정할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = checkMember(memId);
		
		if(!isExist) {
			System.out.println(memId + "인 회원이 존재하지 않습니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		// JDBC 코딩 시작...
		
		try {
			// 오라클 접속...
			conn = JDBCUtil3.getConnection();
			
			String sql = "update mymember\r\n" + 
						 "set mem_name = ?,\r\n" + 
						 "mem_tel = ?,\r\n" + 
						 "mem_addr = ?\r\n" + 
						 "where mem_id = ?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memName);
			pstmt.setString(2, memTel);
			pstmt.setString(3, memAddr);
			pstmt.setString(4, memId);
			
			// executeQuery // select 할 때
			int cnt = pstmt.executeUpdate(); // insert, update, delete
			
			System.out.println();
			if(cnt > 0) {
				System.out.println(memId + "회원 정보 수정작업 성공!");
			} else {
				System.out.println(memId + "회원 정보 수정작업 실패...");
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원 정보를 등록하기 위한 메서드
	 */
	private void insertMember() {
		
		boolean isExist = false;
		
		System.out.println();
		System.out.println("추가할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = checkMember(memId);
		
		if(isExist) {
			System.out.println(memId + "인 회원이 이미 존재합니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		// JDBC 코딩 시작...
		
		try {
			// 오라클 접속...
			conn = JDBCUtil3.getConnection();
			
			String sql = "insert into mymember" + 
					" (mem_id, mem_name, mem_tel, mem_addr)\r\n" + 
					"values (?, ?, ?, ?)";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			pstmt.setString(2, memName);
			pstmt.setString(3, memTel);
			pstmt.setString(4, memAddr);
			
			// executeQuery // select 할 때
			int cnt = pstmt.executeUpdate(); // insert, update, delete
			
			System.out.println();
			if(cnt > 0) {
				System.out.println(memId + "회원 정보 등록작업 성공!");
			} else {
				System.out.println(memId + "회원 정보 등록작업 실패...");
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원 정보가 존재하는지 체크하기 위한 메서드
	 * @param memId 체크할 회원ID
	 * @return
	 */
	private boolean checkMember(String memId) {
		
		boolean isExist = false;
		
		try {
			conn = JDBCUtil3.getConnection();
			
			String sql = "select count(*) cnt\r\n" + 
					"from mymember\r\n" + 
					"where mem_id = ?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				int cnt = rs.getInt("cnt");
				
				if(cnt > 0) {
					isExist = true;
				}
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
		
		return isExist;
	}

	public static void main(String[] args) {
		T01MemberInfoTest memObj = new T01MemberInfoTest();
		memObj.start();
	}

}

 

 

반응형

'자바' 카테고리의 다른 글

[Java 고급] 18장 Singleton 패턴  (0) 2024.02.07
[Java 고급] 17장 MVC 패턴  (0) 2024.02.06
[Java 고급] 15장 람다식  (0) 2024.02.02
[Java 고급] 14장 보조 스트림 클래스  (0) 2024.02.01
[Java 고급] 13장 스트림 클래스  (1) 2024.01.31