40.JDBC(SRP)

Jan 19, 2024
40.JDBC(SRP)
💡
모듈:코드,라이브러리,등 관련된 기능들을 묶어서 구현 하는 단위로 즉 하나의 파일을 얘기한다. SRP :각 모듈(레이어)마다 최소한의 책임만 부여하게한다. 메인 코드를 실행한 파일과 테스트 코드를 실행 할 파일을 따로 만든다. 더 구체적으로 jdbc에 예시로 설명하면 main코드, DAO코드,DB에 연결하는 코드 각자를 모듈화 시켜서 만든다. DAO(Data Acceess Object) :만국 공통 엑세스 오브젝트로 데이터베이스에 접근하여 데이터를 조작하고 조작된 데이터를 반환하는 역할을 담당한다. to string() :객체를 문자열로 변환 시킬 때 사용 controller: 클라이언트의 요청을 받아서 분비 시키는 애(식별자 사용)
 
srp
main 파일
import dao.BankDAO; import db.DBConnection; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Scanner; public class BankApp { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("삭제할 계좌 번호를 입력해주세요: "); int number = sc.nextInt(); BankDAO dao = new BankDAO(); int result = dao.deleteByNumber(number); if (result == 1){ System.out.println("삭제 성공했습니다."); }else{ System.out.println("삭제 실패했습니다"); } } }
DAO파일
package dao; import db.DBConnection; import model.Account; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; /** * DAO -Data Access Object * SRP - 단일 책임의 원칙 */ public class BankDAO { public int deleteByNumber(int number) { Connection conn = DBConnection.getInstance(); try { String sql = "delete from account_tb where number = ?"; PreparedStatement pstmt = conn.prepareStatement(sql);//라이브러리 버퍼 사용 즉 버퍼 달기 // parameterIndex는 쿼리마다에 물음표 순서 // 응답 결과 요쳥 받은 행 이 결과로 온다. pstmt.setInt(1, number); int num = pstmt.executeUpdate();//플러쉬 역할을 가지고 있음 return num; } catch (Exception e) { e.printStackTrace(); } return -1; } public int insert(String password, int balnace) { Connection conn = DBConnection.getInstance(); try { String sql = "insert into account_tb(password, balance, created_at) values(?,?,now())"; PreparedStatement pstmt = conn.prepareStatement(sql);//라이브러리 버퍼 사용 즉 버퍼 달기 // parameterIndex는 쿼리마다에 물음표 순서 // 응답 결과 요쳥 받은 행 이 결과로 온다. pstmt.setString(1, password); pstmt.setInt(2, balnace); int num = pstmt.executeUpdate();//플러쉬 역할을 가지고 있음 return num; } catch (Exception e) { e.printStackTrace(); } return -1; } public int updateByNumber(int balance, int number) { Connection conn = DBConnection.getInstance(); try { String sql = "update account_tb set balance = ? where number = ?"; PreparedStatement pstmt = conn.prepareStatement(sql);//라이브러리 버퍼 사용 즉 버퍼 달기 // parameterIndex는 쿼리마다에 물음표 순서 // 응답 결과 요쳥 받은 행 이 결과로 온다. pstmt.setInt(1, balance); pstmt.setInt(2, number); int num = pstmt.executeUpdate();//플러쉬 역할을 가지고 있음 return num; } catch (Exception e) { e.printStackTrace(); } return -1; } public Account selectByNumber(int number) { Connection conn = DBConnection.getInstance(); try { String sql = "select * from account_tb where number = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, number); //select 결과는 테이블로 받게 설정 ResultSet rs = pstmt.executeQuery(); //rs = 테이블형테에 데이터 boolean isRow = rs.next(); //커서 한칸 내리기 //출력하고 싶은 칼럼만 골라 출력하기 //박스 만들기 if (rs.next()){ Account account = new Account( rs.getInt("number"), rs.getString("password"), rs.getInt("balance"), rs.getTimestamp("created_at") ); return account; } } catch (Exception e) { e.printStackTrace(); } return null; } //전체 조회 할 때 내림차순으로 조회 public List<Account> selectAll(){ Connection conn = DBConnection.getInstance(); try { String sql = "select * from account_tb order by number desc";//order by number desc 내림차순으로 변경 PreparedStatement pstmt = conn.prepareStatement(sql); //select 결과는 테이블로 받게 설정 ResultSet rs = pstmt.executeQuery(); //rs = 테이블형테에 데이터 //출력하고 싶은 칼럼만 골라 출력하기 //박스 만들기 List<Account> accountList = new ArrayList<>(); while (rs.next()){ Account account = new Account( rs.getInt("number"), rs.getString("password"), rs.getInt("balance"), rs.getTimestamp("created_at") ); accountList.add(account); } return accountList; } catch (Exception e) { e.printStackTrace(); } return null; } }
DB연결 파일
package db; import java.sql.Connection; import java.sql.DriverManager; public class DBConnection { public static Connection getInstance() { //쏘켓 String username = "root"; String password = "1234"; String url = "jdbc:mariadb://localhost:3306/cosdb"; //프로토콜//ip주소:포트번호/테이블 명 // 프로토콜이 적용된 소켓 try { Connection conn = DriverManager.getConnection(url, username, password); System.out.println("db connect succes"); return conn; } catch (Exception e) { e.printStackTrace(); } return null; } }
DB에 SELECT한 정보를 담기 위한 오브젝트 코드
package model; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; import java.sql.Timestamp; //모든 생성자를 만든다. /* *DB에 Slect 한 데이터를 담기 위한 오브젝트 */ @ToString @AllArgsConstructor //모든 파라미터가 있는 친구들을 자동으로 생성자로 만들어 주는 lobok 라이브버리중 하나 @Getter public class Account { private int number; private String passworld; private int balance; //java.sql의 TimeSTAMP //카멜표기법 사용하기 private Timestamp createdAt; }
TEST 파일
모듈
 

jdbc만들기

실습
 
웹 - 미들웨어 -DB
웹에서 DB안에 있는 내용 요청을 툴을(자바) 통해서 하는데 이때 식별자로 요청을 한다.
PUT UPDATE
WRITE요청의 응답은 바디가 필요없다 OKAY만 주면된다.
 
GET과 DELTE는 HTTP에 헤더만 있으면 된다.
그 외 POST하고 PUT은 바디데이터까지 필요하다.
그 이유는 간단한데 바디에 데이터가 담겨져 있기 때문이다.
리스펀스 바디(응답 바디)
 
마임타입
(전세계 표준)
x-www-from-urlencoded
password=1234&balance=1000

💡
DB에서 프로젝션:컬럼을 골라내는것
 
 
 
Share article
RSSPowered by inblog