Learn & Record
JAVA JDBC (deposit, updateBalance, withdraw, selectOne, inquire, disConnect, accountDAO) 본문
Dev/Java
JAVA JDBC (deposit, updateBalance, withdraw, selectOne, inquire, disConnect, accountDAO)
Walker_ 2024. 2. 19. 13:521. 입금(deposit) 메서드 코드 작성
public void deposit() { // 입금
System.out.print("계좌번호: ");
int id = stdIn.nextInt();
System.out.print("입금액: ");
long money = stdIn.nextLong();
// 해당 계좌 찾기
if (isAccount((id))) {
updateBalance(id, money, true);
} else {
System.out.println("해당 계좌번호가 존재하지 않습니다.");
}
}
1-2. updateBalance 코드 작성
private boolean updateBalance (int id, long money, boolean flag) {
Statement statement = null;
boolean res = false;
int upd = 0;
try {
String sql;
if (flag) {
sql = String.format("UPDATE account SET balance = balance + %d WHERE (id = %d)" , money, id);
} else {
sql = String.format("UPDATE account SET balance = balance - %d WHERE (id = %d)", money, id);
}
statement = connection.createStatement();
upd = statement.executeUpdate(sql);
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
res = (upd == 0) ? false : true;
return res;
}
2. 출금 (withdraw) 메서드 작성
public void withdraw() { // 출금
System.out.print("계좌번호: ");
int id = stdIn.nextInt();
System.out.print("출금액: ");
long money = stdIn.nextLong();
if(!isAccount(id)) {
System.out.println("해당 계좌번호가 존재하지 않습니다.");
return;
}
Account account = selectOne(id);
if (account.getBalance() < money) {
System.out.println("잔액이 부족합니다.");
} else {
updateBalance(id, money, false);
System.out.println("출금완료 되었습니다.");
}
}
2-2. selectOne 메서드
private Account selectOne(int id) {
Statement statement = null;
Account account = null;
try {
String sql = "SELECT * FROM account WHERE id = '" +id+"'";
statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet.next()) {
account = new Account();
account.setId(resultSet.getInt("id"));
account.setName(resultSet.getString("name"));
account.setBalance(resultSet.getInt("balance"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return account;
}
3. 잔액조회(inquire) 메서드
public void inquire() { // 잔액 조회
System.out.print("계좌번호: ");
int id = stdIn.nextInt();
if (!isAccount(id)) {
System.out.println("해당 계좌번호가 존재하지 않습니다.");
return;
}
Account account = selectOne(id);
System.out.println(account.getId() + "\t" + account.getName() + "\t" + account.getBalance());
}
4. 전체 계좌(display) 메서드
public void display() {
/* 전체 계좌 출력 */
ArrayList<Account> list = selectAll();
for (Account account : list) {
System.out.println(account.getId() + "\t" + account.getName() + "\t" + account.getBalance());
}
}
5. 연결 해제. 프로그램 종료 (disConnect) 메서드
public void disConnect() { // 연결 해제. 서비스 종료시에 사용
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
6. Controller에 있는 데이터베이스 관련 처리를 따로 분리. DAO 클래스 생성. model은 DTO와 DAO로 구성
- try with resourse와 PreparedStatement 사용으로 수정
- 메서드 이름만으로 Controller에 있는 메서드인지, DAO에 있는 메서드인지 구분 될 수 있도록
- DAO의 메서드는 메서드당 하나의 쿼리만 실행
- AccountDAO 클래스 작성
- 데이터 베이스 연결 메서드 getConnection()를 DAO로 이동
- 계좌개설 makeAccount() 메서드 수정
- DAO로 기능 메서드 모두 이전
[ AccountDAO ]
package ch_01.day240216_19.mvc;
import ch_01.day240119.ClassD.Product;
import java.sql.*;
import java.util.ArrayList;
public class AccountDAO {
/* DB 서버와 접속하고 레코드를 처리하는 기능.
데이터베이스 처리에 관한 기능만으로 구성되는 객체를 DAO Data Access Object 객체라고 함
*/
private Connection connection = null;
AccountDAO() {getConnection();}
private void getConnection() { // 디비 연결 생성자에서 실행
try {
String url = "jdbc:mariadb://localhost:3306/sample";
String user = "root";
String password = "5046";
try {
Class.forName("org.mariadb.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
this.connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
public int selectAccountCnt(int id) {
/* 해당 계좌번호의 계좌가 있는지 리턴 */
String sql = "SELECT COUNT(*) AS cnt FROM sample.account WHERE id = ? ";
int cnt;
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1,id);
try (ResultSet resultSet = preparedStatement.executeQuery()){
resultSet.next();
cnt = resultSet.getInt(1);
}
}catch (SQLException e) {
throw new RuntimeException(e);
}
return cnt;
}
public boolean insertAccount(Account account) {
String sql = "INSERT INTO sample.account VALUES (?,?,?)";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, account.getId());
preparedStatement.setString(2, account.getName());
preparedStatement.setLong(3, account.getBalance());
return preparedStatement.executeUpdate() == 1;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public boolean updateBalance (int id, long money, boolean flag) {
String sql;
int cnt = 0;
if (flag) {
sql = "UPDATE sample.account SET balance = balance + ? WHERE (id=?)";
} else {
sql = "UPDATE sample.account SET balance = balance - ? WHERE (id=?)";
}
try(PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setLong(1, money);
preparedStatement.setInt(2, id);
cnt = preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return cnt == 1;
}
public Account selectOne(int id) {
Account account = new Account();
String sql = "SELECT * FROM sample.account WHERE id = ? ";
try(PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, id);
try (ResultSet resultSet = preparedStatement.executeQuery()){
if (resultSet.next()) {
account = new Account();
account.setId(resultSet.getInt("id"));
account.setName(resultSet.getString("name"));
account.setBalance(resultSet.getInt("balance"));
}
}
}catch (SQLException e) {
e.printStackTrace();
}
return account;
}
public ArrayList<Account> selectAll() {
// 전체 정보 전달
String sql = "SELECT * FROM sample.account";
ArrayList<Account> list = new ArrayList<>();
try (PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
Account account = new Account(resultSet.getInt("id"), resultSet.getString("name"),
resultSet.getInt("balance"));
list.add(account);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
public void disConnect() { // 연결 해제. 서비스 종료시에 사용
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
'Dev > Java' 카테고리의 다른 글
[코리아IT아카데미] JAVA - Exception (예외) (0) | 2024.02.02 |
---|---|
[코리아IT아카데미] Java - List, TreeSet, Map, Compare (0) | 2024.01.29 |
[코리아IT아카데미] Java - Stack, Queue (스택, 큐), Set, HashSet (4) | 2024.01.26 |
[코리아IT아카데미] Java - Interface (2) | 2024.01.25 |