ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JDBC] JDBC CRUD 구축
    데이터베이스/JDBC 2024. 10. 31. 22:09

    JDBC 연결

    • java.sql.DriverManager
    • java.sql.Connection ( Java 인터페이스 )
    DriverManager.getConnection( 데이터베이스 링크, 데이터베이스 사용자 아이디 , 데이터베이스 사용자 비밀번호 )
    /*
    Connection connection = DriverManager.getConnection(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD);
    */
    
    @Slf4j
    public class DBConnectionUtil {
    
        public static Connection getConnection(){
            try{
                Connection connection = DriverManager.getConnection(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD);
                return connection;
            }catch (SQLException e){
                throw new IllegalStateException(e);
            }
        }
    }

     

    JDBC 기본 구조

    • Connection : DB연결을 위한 자바 인터페이스
    • PreparedStatement  : sql 구문 정의
    • ResultSet  : DB 결과 응답 값 저장
        Connection con = null; // DB 연결
        PreparedStatement pstmt = null; // SQL 구문 
        ResultSet rs = null; // 결과값
    
    try{
        
        con = DriverManger.getConnection(URL, USERNAME, PASSWORD);
        pstmt = con.prepareStatement("sql구문");
        pstmt.setString() // pstmt.setInd ...
        pstmt.executeUpdate() // pstmt.executeQuery()
    }
    catch ( SQLException e ){
        // ...
    }
    finally{
    
         rs.close(); // null이 아니면
         pstmt.close(); // null이 아니면
         con.close();  // null이 아니면
     }
    • close()를 줘야지 connection이 해제됨
      • close()순서도 중요, ( ResultSet -> PreparedStatement -> Connection )

     

    JDBC Create/Read/Update/Delete

    •  pstmt
      • pstmt.setXXX (순서, 값)
        • 순서 : sql구문 중 "?"(물음표) 위치
        • 값 : 해당 부분에 넣을 값
      • pstmt.executeUpdate()
        • 결과값없이, 해당 sql 구문 적용
        • 반환값은 sql구문이 영향을 끼친 행(row)개수를 반환 ( int executeUpdate() throws SQLException; )
      • pstmt.executeQuery()
        • sql 구문의 결과값이 존재
        • 반환값은 sql 구문의 결과값 (ResultSet executeQuery() throws SQLException; )

     

    • ResultSet
      • 해당 결과값의 경우 객체형태로 오지않으므로, 해당하는 객체에 직접 넣어줘야함
      • ResultSet의 커서의 경우, 맨 처음은 열(column) 이름을 가리킴 (그 다음부터 행(row)을 가리킨다)
        • rs.next()를 한번 해줘야 진정한 행(row)값을 얻을 수 있음

     

    //Create
    public Member save(Member member) throws SQLException {
            String sql = "insert into member(member_id, money) values(?,?)";
    
            Connection con = null;
            PreparedStatement pstmt = null;
    
            try{
                con = DBConnectionUtil.getConnection();
                pstmt = con.prepareStatement(sql);
                pstmt.setString(1, member.getMemberId());
                pstmt.setInt(2, member.getMoney());
                pstmt.executeUpdate();
                return member;
            }catch (SQLException e){
                throw e;
            }finally{
                close(con,pstmt, null);
            }
        }
    //Read
        public Member findById(String memberId) throws SQLException{
            String sql = "select * from member where member_id=?";
    
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
    
            try {
                con = DBConnectionUtil.getConnection();
                pstmt = con.prepareStatement(sql);
                pstmt.setString(1, memberId);
    
                rs = pstmt.executeQuery();
                if (rs.next()) {
                    Member member = new Member();
                    member.setMemberId(rs.getString("member_id"));
                    member.setMoney(rs.getInt("money"));
                    return member;
                } else {
                    throw new NoSuchElementException("member not found memberId=" + memberId);
                }
            }catch (SQLException e){
                log.error("db error", e);
                throw e;
            }finally{
                close(con, pstmt, rs);
            }
        }
    //Update
        public void update(String memberId, int money) throws SQLException{
            String sql = "update member set money=? where member_id=?";
    
            Connection con = null;
            PreparedStatement pstmt = null;
    
            try{
                con = DBConnectionUtil.getConnection();
                pstmt  = con.prepareStatement(sql);
                pstmt.setInt(1,money);
                pstmt.setString(2, memberId);
    
                int resultSize = pstmt.executeUpdate();
                log.info("업데이트 행 개수  = {}", resultSize);
            }catch(SQLException e){
                log.error("db error", e);
                throw e;
            }finally{
                close(con,pstmt,null);
            }
        }
    //Delete
        public void delete(String memberId) throws SQLException{
            String sql = "delete from member where member_id=?";
    
            Connection con = null;
            PreparedStatement pstmt = null;
    
            try{
                con = DBConnectionUtil.getConnection();
                pstmt = con.prepareStatement(sql);
                pstmt.setString(1,memberId);
                pstmt.executeUpdate();
    
            }catch (SQLException e){
                log.error("db error", e);
                throw e;
            }finally{
                close(con,pstmt,null);
            }
    
        }
    
        private void close(Connection con, PreparedStatement stmt, ResultSet rs){
            if(rs!=null){
                try{
                    rs.close();
                }catch(SQLException e){
                    log.info("error", e);
                }
            }
    
            if(stmt != null){
                try{
                    stmt.close();
                }catch (SQLException e){
                    log.info("error", e);
                }
            }
    
            if (con != null){
                try{
                    con.close();
                }catch(SQLException e){
                    log.info("error", e);
                }
            }
        }

    '데이터베이스 > JDBC' 카테고리의 다른 글

    [JDBC] 트랜잭션 매니저  (0) 2024.11.05
    [JDBC] 트랜잭션  (0) 2024.11.05
    [JDBC] 커넥션 풀  (7) 2024.11.04
    [JDBC] JDBC 와 최신 데이터 접근 기술 (Sql Mapper , ORM)  (1) 2024.10.31
    [JDBC] JDBC 의 이해  (0) 2024.10.31
Designed by Tistory.