반응형
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(); // 두번째 객체 생성
}
}
=> 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 = 비밀번호
=> 상단의 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("출력 끝...");
}
}
+ res 폴더를 소스폴더로 변경
더보기

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

Source > Add Folder

res 클릭 > OK

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




+properties 파일 작성을 위해 할 작업
더보기

Help > Install New Software

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

Work with에 입력할 내용

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 |