오늘의 노래!!!
- 아티스트
- DKZ
- 앨범
- DONGKIZ 5th Single Album 'CHASE EPISODE 1. GGUM'
- 발매일
- 1970.01.01
[0] DBC 클래스 생성 -- 고정 ( DB의 개정만 수정해서 사용할 것!)
package Bank;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBC {
public static Connection DBConnect(){
Connection con = null;
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "PC1";
String password = "1111";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(url, user,password);
System.out.println("DB 접속 성공!");
} catch (ClassNotFoundException e) {
System.out.println("DB접속 실패 : 드라이버 로딩실패!");
throw new RuntimeException(e);
} catch (SQLException e) {
System.out.println("DB접속 실패 : 접속 정보 확인!");
throw new RuntimeException(e);
}
return con;
}
}
[1] 필드, 생성자, 메소드[클래스 이름] 클래스 생성 - 필드 생성후 AIt + Insert 적용
public class Client{
// 필드
private int cNum; //고객번호
private String cName; //고객이름
private String cAccount;//계좌번호
private int balance; //계좌잔액
// 기본생성자 - 매계변수 생성자는 생략
public Client() {
}
// 메소드 - 각필드 마다 getter,setter 생성
public int getcNum() {
return cNum;
}
public void setcNum(int cNum) {
this.cNum = cNum;
}
public String getcName() {
return cName;
}
public void setcName(String cName) {
this.cName = cName;
}
public String getcAccount() {
return cAccount;
}
public void setcAccount(String cAccount) {
this.cAccount = cAccount;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
// 메소드 - toString으로 모든 필드 지정 (오버라이딩)
@Override
public String toString() {
return "Client[cNum=" + cNum +
", cName=" + cName +
", cAccount=" + cAccount +
", balance=" + balance +
']';
}
}
[2] 객체 생성후 DB에 들어갈 SQL문 작성
// 각각 사용할 변수 선언
// stmt - sql문을 전송을 위한 객체
// pstmt - '?' 없이도 사용 가능!!! -- 주로 사용함
public class Client_CRUD {
Connection con;
// sql 쿼리문 전송을 위한 객체
Statement stmt;
ResultSet rs;
// '?' 없이도 사용 가능
PreparedStatement pstmt;
// DB연동을 위한 DBConnect() 메소드 사용
public void DBConnect() {
con = DBC.DBConnect();
}
// 기본 insert, select, update, delete, close문 사용
// 위에 변수 선언과 DB연동, close문은 무조건 사용
// 이번 프로젝트엔 사용 안함!!!
// insert - 생성6단계 생각할것
public void insert() {
try {
stmt = con.createStatement();
String sql = "INSERT INTO BANK VALUES( )";
int result = stmt.executeUpdate(sql);
if (result > 0) {
System.out.println("성공!");
} else {
System.out.println("실패");
}
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
// select - 생성6단계 생각할것
public void select() {
try {
stmt = con.createStatement();
String sql = "SELECT * FROM BANK";
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.print("고객번호 : " + rs.getString(1)+" | ");
System.out.print("고객이름 : " + rs.getString(2)+" | ");
System.out.print("계좌번호 : " + rs.getString(3)+" | ");
System.out.println("계좌잔액 : " + rs.getString(4));
}
stmt.close();
rs.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
// update - 생성6단계 생각할것
public void update() {
try {
stmt = con.createStatement();
String sql = "UPDATE BANK SET ";
int result = stmt.executeUpdate(sql);
if (result > 0) {
System.out.println("업데이트 성공!");
} else {
System.out.println("업데이트 실패");
}
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
// delete - 생성6단계 생각할것
public void delete() {
try {
stmt = con.createStatement();
String sql = "DELETE FROM BANK ";
int result = stmt.executeUpdate(sql);
if (result > 0) {
System.out.println("삭제 성공!");
} else {
System.out.println("삭제 실패");
}
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
// close - 중요!!! > 마무리 지을때 꼭 사용!!
public void conClose() {
try {
con.close();
System.out.println("접속해체");
} catch (SQLException e) {
System.out.println("접속중이 아님!");
throw new RuntimeException(e);
}
}
중요!!! > 고객 번호를 받기위한 메소드 지정!!! (DB : CNUM)
// sql = 지정할때 주의있게 볼것
public int clientNumber() {
int cNum=0;
String sql = "SELECT MAX(CNUM) FROM BANK";
try {
pstmt = con.prepareStatement(sql);
// sql문 실행
rs = pstmt.executeQuery();
//결과
if (rs.next()) {
cNum = rs.getInt(1);
}
rs.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
// System.out.println("고객번호 : "+ cNum);
return cNum;
}
중요!!! > 계좌번호를 랜덤으로 지정해서 받기 위한 메소드 지정!!! (DB : CACCOUT)
// 여기서 Math.random() 함수를 사용할 것을 볼수 있다
public String accountNumber() {
String cAccount = null;
// 예를 들어 : 신한은행 계좌번호 110-xxx-xxxxxx
cAccount = "110-";
// 110-xxx(무작위 3자리 숫자) -- 반복문 사용
// String타입과 int타입 합치면 String타입 변환
// 1~9사이의 랜덤 숫자
for (int i = 1; i <= 3; i++) {
cAccount += (int)(Math.random()*9)+1;
}
cAccount += "-";
for (int i = 1; i <= 6; i++) {
cAccount += (int)(Math.random()*9)+1;
}
// System.out.println("계좌번호"+cAccount);
return cAccount;
}
중요!!! > 인텔리제이에서 sql문을 선언 후 '?' 값 받기 위한 메소드 지정!!! (DB : 컬럼에 데이터 넣기)
// INSERT문
public void bankInsert(Client client) {
// 1. sql문 작성
String sql = "INSERT INTO BANK VALUES(?,?,?,?)";
// 2. try=catch문
try {
pstmt = con.prepareStatement(sql);
// 3. '?' 값 넣기
pstmt.setInt(1,client.getcNum());
pstmt.setString(2,client.getcName());
pstmt.setString(3,client.getcAccount());
pstmt.setInt(4,client.getBalance());
// 4. 실행 C<R<U<D << result문 사용!!!
int result = pstmt.executeUpdate();
// 5. 결과확인
if (result>0){
System.out.println("계좌 성공");
} else {
System.out.println("계좌 실패");
}
// 6. 마무리
pstmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
중요!!! > 데이터를 조회에서 있으면 출력 받고 없으면 실패하는 메소드 지정!!! (DB : CACCOUNT)
// SELECT문
public boolean checkAccount(String cAccount) {
boolean check = false;
String sql = "SELECT * FROM BANK WHERE CACCOUNT = ?";
try {
pstmt=con.prepareStatement(sql);
pstmt.setString(1,cAccount);
rs = pstmt.executeQuery();
if (rs.next()){
check = true;
System.out.println("계좌 조회 성공 ");
} else {
check = false;
System.out.println("계좌 조회 실패");
}
pstmt.close();
rs.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
return check;
}
중요!!! > 데이터를 수정하기 위한 메소드 지정!!! (DB : CACCOUNT , BALANCE)
// 사용자가 입금하기 위해서는 자신의 계좌가 맞고 그리고 다음에 자신이 원하는 금액을 입금!!
// UPDATE문
public void deposit(String cAccount, int balance) {
String sql = "UPDATE BANK SET BALANCE = BALANCE +? WHERE CACCOUNT = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, balance);
pstmt.setString(2,cAccount);
int result = pstmt.executeUpdate();
if (result>0){
// System.out.println("입금 성공");
} else {
System.out.println("입금 실패");
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
중요!!! > 데이터를 수정하기 위한 메소드 지정!!! (DB : CACCOUNT , BALANCE)
// 사용자가 출금할려는 금액을 출금!!
// UPDATE문
public void deposit1(String cAccount, int balance) {
String sql = "UPDATE BANK SET BALANCE = BALANCE - ? WHERE CACCOUNT = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, balance);
pstmt.setString(2,cAccount);
int result = pstmt.executeUpdate();
if (result>0){
// System.out.println("출금 성공");
} else {
System.out.println("출금 실패");
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
중요!!! > 데이터 메소드 지정!!! (DB : CACCOUNT )
// 사용자가 출금할려는 높으면 출금 못하고 입금 금액 보다 적으면 금액을 출금!!
// SELECT문
public int checkBalance(String cAccount) {
int balance = 0;
String sql = "SELECT BALANCE FROM BANK WHERE CACCOUNT = ? ";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1,cAccount);
// sql문 실행
rs = pstmt.executeQuery();
//결과
if (rs.next()) {
balance = rs.getInt(1);
}
rs.close();
pstmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
return balance;
}
[3] 출력하기 위한 main 클래스 작성
public class Client_Main{
public startic void main(String[] args){
// 생성자 선언!!!
Client client = new Client();
Client_CRUD bank = new Client_CRUD();
bank.DBConnect();
Scanner sc = new Scanner(System.in);
boolean run = true;
int menu = 0;
System.out.println("은행에 오신것을 환영합니다");
System.out.println("무엇을 도와드릴까요?");
// 기본 출력문 선언 (while으로 반복) (run 위에 boolean타입 무조건 true로 선언)
while (run){
System.out.println("========================================");
System.out.println("1. DB접속 2. 접속해제 3. 생성 4. 입금");
System.out.println("5. 출금 6. 송금 7. 조회 8. 종료");
System.out.println("========================================");
System.out.println("선택 : ");
menu=sc.nextInt();
// switch문으로 조건 각 case안에 조건 지정
switch ( menu ){
// 1. DB 연결
case 1:
bank.DBConnect();
break;
// 2. DB 해체
case 2:
bank.conClose();
break;
// 3. 계좌 생성!!!
// clientNumber메소드 생성
// 고객번호 생성 및 계좌 번호 자동으로 생성 (중복 무시)
case 3:
System.out.println("새로운 계좌를 생성합니다");
// 자동으로 고객번호 생성
int cNum=bank.clientNumber()+1;
// 고객이름
System.out.println("고객 이름 입력 : ");
String cName = sc.next();
// 계좌번호 자동생성
// 중복 무시 x
String cAccount = bank.accountNumber();
// 초기 입금액
System.out.println("초기 입금액 : ");
int balance = sc.nextInt();
client.setcNum(cNum);
client.setcName(cName);
client.setcAccount(cAccount);
client.setBalance(balance);
bank.bankInsert(client);
break;
// 4. 계좌 입금!!!
// checkAccount을 통한 입금할때 사용하는 메소드 지정!!
// 먼저 boilean타입을 통해 계좌 여부를 확인후 있으면 입금 없으면 존재하는 되묻기
case 4:
// (1) 계좌를 입력 받는다
System.out.println("계좌번호 입력 : ");
cAccount = sc.next();
boolean check = bank.checkAccount(cAccount);
// L 계좌 여부
// (2) 입금할 금액을 입력한다.
if(check) {
System.out.println("입력할 금액은 : ");
balance = sc.nextInt();
bank.deposit(cAccount, balance);
} else {
System.out.println("계좌번호가 존재하지 않습니다.");
}
break;
// 5. 계좌 출금!!!
// checkBalance를 통해서 출금 메소드 지정!!!
// 위에서 계좌여부 확인뒤 출금
case 5:
System.out.println("계좌번호 입력 : ");
cAccount = sc.next();
// (2) 입금할 금액을 입력한다.
if(bank.checkAccount(cAccount)) { // 이렇게 사용해도 된다 (위에처럼 해도 되구 ㅎㅎ)
System.out.println("출력할 금액은 : ");
balance = sc.nextInt();
int balance1 = bank.checkBalance(cAccount);
if (balance1>=balance) {
bank.deposit1(cAccount, balance);
} else {
System.out.println("잔액이 : " + (balance - balance1) + "원");
}
}else{
System.out.println("계좌번호가 존재하지 않습니다.");
}
break;
// 6. 송금!!!
// checkAccount
// checkBalance
//두개의 메소드를 사용해서 계좌여부를 똑같이 확인후 맞으면 내 계좌 출금 상대방 입금 아니면 반대!!!
case 6:
//(1) 내 계좌 조회
System.out.println("내 계좌 조회 : ");
String sAccount = sc.next();
if(bank.checkAccount(sAccount)){
//(2) 상대방 계좌 조회
System.out.println("상대방 계좌 조회 : ");
String rAccount = sc.next();
if(bank.checkAccount(rAccount)){
// (3) 내 계좌 잔액 조회 + 송금액 입력
System.out.print("송금액 >> ");
int sBalance = sc.nextInt(); // 송금액
int cBalance = bank.checkBalance(sAccount); // 보내는 사람 계좌 잔액
if(cBalance>=sBalance){
// (4) 내 계좌 (송금액만큼) 출금
bank.deposit1(sAccount, sBalance);
// (5) 상대방 계좌 (송금액만큼) 입금
bank.deposit(rAccount, sBalance);
System.out.println("송금 성공!");
} else {
System.out.println("잔액이 " + (sBalance-cBalance) + "원 부족합니다.");
}
} else {
System.out.println("받는분 계좌가 존재하지 않습니다.");
}
} else {
System.out.println("보내는분 계좌가 존재하지 않습니다.");
}
break;
// 7. 계좌 조회 후 잔액 조회까지!!!
// checkBalance
case 7:
System.out.println("계좌번호 입력 : ");
cAccount = sc.next();
if(bank.checkAccount(cAccount)) {
//db에서 계좌번호에 대한 잔액 조회
balance = bank.checkBalance(cAccount);
System.out.println("잔액 : " + balance);
} else {
System.out.println("계좌번호가 존재하지 않습니다.");
}
break;
// 8. 사용종료!!!
// run = false;
case 8:
System.out.println("이용해주셔서 감사합니다");
run = false;
break;
// default. 잘못입력시!!!
default:
System.out.println("다시입력해주세요");
break;
}
}
}
}
'IT코딩공부!' 카테고리의 다른 글
#21 HTML(이미지,동영상, list(목록표현), margin, padding, 색상)!! (0) | 2023.04.27 |
---|---|
#20 HTML 공부 시작!!! (툴 : vscode) (0) | 2023.04.26 |
#18 DB+인텔리제이 작업 (0) | 2023.04.13 |
#17 DB (JOIN) OR 인텔리제이+ORACLE 연동 (0) | 2023.04.12 |
#16 !CONSTRAINT(제약조건)! (0) | 2023.04.11 |