먼저, 데이터베이스 연결 및 데이터 모델 클래스를 정의합니다.
package dbConn.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Scanner;
public class ConnectionHelper {
public static Connection getConnection(String dsn, String uid, String pwd) {
Scanner sc = new Scanner(System.in);
Connection conn = null;
while (true) {
try {
System.out.println("아이디를 입력하세요.");
uid = sc.next();
System.out.println("비밀번호를 입력하세요.");
pwd = sc.next();
if (dsn.equalsIgnoreCase("mysql")) {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/SampleDB", uid, pwd);
break;
} else if (dsn.equalsIgnoreCase("oracle")) {
Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.143:1521:xe", uid, pwd);
System.out.println("Oracle 데이터베이스에 접속되었습니다.");
break;
} else {
System.out.println("지원하지 않는 데이터베이스 종류입니다. mysql 또는 oracle 중 하나를 입력하세요.");
}
} catch (Exception e) {
if (e.getMessage().contains("ORA-01017")) {
System.out.println("유효하지 않는 사용자 이름 또는 비밀번호입니다. 다시 입력해주세요.");
} else {
e.printStackTrace();
}
}
}
return conn;
}
public static void menu() {
System.out.println("\n********************** 주민 테이블 **********************");
System.out.println("\t 0.rollback");
System.out.println("\t 1. 레코드 삽입(추가)");
System.out.println("\t 2. 레코드 수정");
System.out.println("\t 3. 전체보기");
System.out.println("\t 4. 조건에 의한 검색(ex > gno)");
System.out.println("\t 5. 레코드 삭제");
System.out.println("\t 6. 프로그램 종료");
System.out.println("\t 7. commit");
System.out.println("\t >> 원하는 메뉴 선택 하세요. ");
}
}
package Model;
public class GogakVO {
public final String className = "GOGAK";
private int gno, jumin, point;
private String gname;
// Getters and Setters
public int getGno() {
return gno;
}
public void setGno(int gno) {
this.gno = gno;
}
public int getJumin() {
return jumin;
}
public void setJumin(int jumin) {
this.jumin = jumin;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getClassName() {
return className;
}
}
package dbConn.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class CloseHelper {
public static void close(Connection conn) {
if(conn != null) try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void close(Statement stmt) {
if(stmt != null) try {
stmt.close();
}catch(Exception e) {
e.printStackTrace();
}
}
public static void close(PreparedStatement pstmt) {
if(pstmt !=null) try {
pstmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void close(ResultSet rs) {
if(rs!=null)try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
다음으로, 데이터베이스 연결 및 CRUD 기능을 구현합니다.
package Controller;
import java.sql.*;
import java.util.Scanner;
import Model.GogakVO;
import dbConn.util.CloseHelper;
import dbConn.util.ConnectionHelper;
public class GoGakController {
static Scanner sc = new Scanner(System.in);
static Connection conn;
static PreparedStatement pstmt;
static ResultSet rs = null;
static Statement stmt;
// 데이터베이스 연결
public static void connect() {
try {
conn = ConnectionHelper.getConnection("oracle", null, null);
stmt = conn.createStatement();
conn.setAutoCommit(false); // 자동 커밋 모드 해제
} catch (Exception e) {
e.printStackTrace();
}
}
// 데이터베이스 연결 해제
public static void close() {
try {
CloseHelper.close(rs);
CloseHelper.close(stmt);
CloseHelper.close(conn);
CloseHelper.close(pstmt);
} catch (Exception e) {
e.printStackTrace();
}
}
// 메뉴 표시 및 선택 처리
public static void menu() throws SQLException {
GogakVO vo = new GogakVO();
while (true) {
ConnectionHelper.menu(); // 메뉴 표시
switch (sc.nextInt()) {
case 0:
System.out.println("Commit 하시겠습니까?(Y/N)");
System.out.println("안하시려면 Rollback 됩니다. ");
if (sc.next().equalsIgnoreCase("Y")) {
commit(); // 커밋
selectAll(vo.getClassName()); // 전체 조회
} else {
rollback(); // 롤백
selectAll(vo.getClassName()); // 전체 조회
}
break;
case 1:
selectAll(vo.getClassName()); // 전체 조회
insert(vo.getClassName()); // 추가
selectAll(vo.getClassName()); // 전체 조회
break;
case 2:
selectAll(vo.getClassName()); // 전체 조회
update(vo.getClassName()); // 수정
selectAll(vo.getClassName()); // 전체 조회
break;
case 3:
selectAll(vo.getClassName()); // 전체 조회
break;
case 4:
selectByGno(vo.getClassName()); // 조건 조회
break;
case 5:
selectAll(vo.getClassName()); // 전체 조회
delete(vo.getClassName()); // 삭제
break;
case 6:
close(); // 연결 해제
System.out.println("프로그램 종료합니다!!");
System.exit(0); // 프로그램 종료
break;
case 7:
conn.commit(); // 커밋
System.out.println("성공적으로 완료 되었습니다.");
break;
default:
System.out.println("없는 번호 선택 하셨습니다. 0~7번 중에서 선택하세요.");
}
}
}
// 데이터 삽입
public static void insert(String className) throws SQLException {
try {
System.out.println("고객 정보를 입력하세요.");
System.out.print("고객번호 입력: ");
int gno = sc.nextInt();
System.out.print("고객명 입력: ");
String gname = sc.next();
System.out.print("주민번호 입력: ");
int jumin = sc.nextInt();
System.out.print("포인트 입력: ");
int point = sc.nextInt();
String sql = "INSERT INTO " + className + " VALUES(?,?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, gno);
pstmt.setString(2, gname);
pstmt.setInt(3, jumin);
pstmt.setInt(4, point);
int result = pstmt.executeUpdate(); // 데이터 삽입 실행
System.out.println(result + "개 데이터 추가 성공!!");
} catch (Exception e) {
e.printStackTrace();
}
}
// 데이터 조회 (전체)
public static void selectAll(String className) throws SQLException {
String sql = "SELECT * FROM " + className;
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
System.out.print(rsmd.getColumnName(i) + "\\t");
}
System.out.println();
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
switch (rsmd.getColumnType(i)) {
case Types.NUMERIC:
case Types.INTEGER:
System.out.print(rs.getInt(i) + "\\t");
break;
case Types.FLOAT:
System.out.print(rs.getFloat(i) + "\\t");
break;
case Types.DOUBLE:
System.out.print(rs.getDouble(i) + "\\t");
break;
case Types.CHAR:
System.out.print(rs.getString(i) + "\\t");
break;
case Types.DATE:
System.out.print(rs.getDate(i) + "\\t");
break;
default:
System.out.print(rs.getString(i) + "\\t");
break;
}
}
System.out.println();
}
}
// 데이터 업데이트
public static void update(String className) {
try {
System.out.println("수정할 정보의 번호를 입력하세요.");
int gno = sc.nextInt();
sc.nextLine();
System.out.println("1. 고객명 수정");
System.out.println("2. 주민번호 수정");
System.out.println("3. 포인트 수정");
System.out.print("수정할 항목을 선택하세요: ");
int num = sc.nextInt();
sc.nextLine();
String sql = "";
int result = 0;
switch (num) {
case 1:
System.out.println("수정할 고객명을 입력하세요.");
String gname = sc.nextLine();
sql = "UPDATE " + className + " SET gname =? WHERE gno= ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, gname);
pstmt.setInt(2, gno);
break;
case 2:
System.out.println("수정할 주민번호를 입력하세요.");
int jumin = sc.nextInt();
sql = "UPDATE " + className + " SET jumin =? WHERE gno= ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, jumin);
pstmt.setInt(2, gno);
break;
case 3:
System.out.println("수정할 포인트를 입력하세요.");
int point = sc.nextInt();
sql = "UPDATE " + className + " SET point =? WHERE gno= ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, point);
pstmt.setInt(2, gno);
break;
default:
System.out.println("잘못된 선택입니다. 제대로 선택하세요(1~3)");
return;
}
result = pstmt.executeUpdate();
System.out.println(result + "개 데이터가 업데이트 되었습니다.");
} catch (Exception e) {
e.printStackTrace();
}
}
// 데이터 삭제
public static void delete(String className) throws SQLException {
String num = sc.next();
try {
String sql = "DELETE FROM " + className + " WHERE GNO = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, num);
int result =
pstmt.executeUpdate(); // 데이터 삭제 실행
System.out.println(result + "개 데이터가 삭제 되었습니다.");
} catch (Exception e) {
e.printStackTrace();
}
}
// 트랜잭션 커밋
public static void commit() {
try {
conn.commit(); // 커밋
System.out.println("커밋 되었습니다.");
} catch (SQLException e) {
e.printStackTrace();
}
}
// 트랜잭션 롤백
public static void rollback() {
try {
conn.rollback(); // 롤백
System.out.println("롤백 되었습니다.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
마지막으로, 메인 애플리케이션을 실행하여 사용자 인터페이스를 구현합니다.
package Main;
import java.sql.SQLException;
import Controller.GoGakController;
public class MainEntry {
public static void main(String[] args) throws SQLException {
GoGakController gc = new GoGakController();
gc.connect(); // 데이터베이스 연결
gc.menu(); // 메뉴 표시 및 사용자 선택 처리
}
}
