개발일기장

Java 데이터 접근 기술 - jdbc (1) 본문

JAVA

Java 데이터 접근 기술 - jdbc (1)

게슬 2023. 2. 5. 23:18
728x90

JDBC(Java Database Connectivity)는 Java에서 db에 접속 하고 사용할 수 있도록 하는 API임

기본 내장되어 있음

대표적으로 3가지 기능을 Interface로 정의해서 제공을 해줌

Connection(연결) / Statement(쿼리쏘기) / ResultSet(결과)

근대 이거는 그냥 Interface이기 떄문에 각각의 벤더사가 자기의 제품에 맞게 저거를 상속받고 구현을 해야함

mysql 8.0.21 다운받았음

그래서 JDBC를 사용할 떄 원하는 회사(Oracle, Mysql, DB2, PostgreSQL)의 jdbc를 import 하면 되는 부분임

(근대 interface는 동일하지만 sql쿼리 문법은 조금씩 되는게 있고 안되는게 있기 때문에 주의)

 

 

오랜만에 켜보네

일단 DB를 켜주자

리눅스면 systemctl start mysql 하면 될듯?

 

그리고 Java Project를 생성하고 아까 다운받은 jdbc jar를 외부 라이브러리에 import해주자


public class MysqlConst {
    public static final String url = "jdbc:mysql://localhost/[databases]?useUnicode=true&serverTimezone=Asia/Seoul";
    public static final String user = "[계정]";
    public static final String password = "[비번]";
}

일단 접속내용을 계속 재사용하기 위해서 Const Class 생성했음....

근대 접속할 때 시간이나 인코딩 오류날 수 있으니

useUnicode=true&serverTimezone=Asia/Seoul

이거 쓰셈

public class DBConnectionUtil {
    public static Connection getConnection(){
        try{
            return DriverManager.getConnection(url, user, password);
        }catch (SQLException e){
            throw new IllegalStateException(e);
        }
    }
}

DB에 연결하려면 JDBC가 제공하는 DriverManaget.getConnection( ... ) 를 사용해야함

그러면 library에 있는 데이터베이스 드라이버를 찾아서 커넥션을 반환해 준다..

(자동으로 해줌)

Class.forName("com.mysql.cj.jdbc.Driver");

직접 드라이버를 지정하고 싶으면 이렇게 하면됨(맞는진 모르겟음 ㅋㅋ)

3학년 때 사용했던 ...

일단 이거 사용할 거니깐 class를 만들어두자..

public class Artwork {
    private String title;
    private String type;
    private String genre;
    private String description;
    private String OpeningDate;
    
    // getter, setter는 생략..  
}

롬복 사용하자...... 개귀찮네

 

public class Repository {
    public Artwork save(Artwork artwork) throws SQLException {
        StringBuilder sb = new StringBuilder();
        sb.setLength(0);
        sb.append("INSERT INTO ARTWORK ")
                .append("VALUES(?,?,?,?,?,?");

        Connection conn = null;
        PreparedStatement pstmt = null;

        try{
            conn = DBConnectionUtil.getConnection();
            pstmt = conn.prepareStatement(sb.toString());
            pstmt.setString(1, artwork.getTitle());
            pstmt.setString(2, artwork.getType());
            pstmt.setString(3, artwork.getGenre());
            pstmt.setString(4, artwork.getDescription());
            pstmt.setString(5, artwork.getDirector());
            pstmt.setString(6, artwork.getOpeningDate());


            int res = pstmt.executeUpdate();
            System.out.println("INSERT SUCCESS : " + res);
            return artwork;
        }catch(SQLException e){
            e.printStackTrace();
            throw e;
        }finally {
            if(pstmt != null){
                pstmt.close();
            }
            if(conn != null) {
                conn.close();
            }
        }
    }
}

진짜 오랜만에 순수하게 jdbc코드 작성해보는 것 같다..

public class JdbcMain {
    public static void main(String[] args) {
        try{
            Artwork newWork = new Artwork("그냥 제목","그냥 타입","그냥 장르","그냥 내용","그냥 감독","");
            Repository repo = new Repository();
            repo.save(newWork);
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

그리고 실행해보자

한건 삽입
result

일단 데이터는 잘 들어간다 


이제  조회까지만 해보자(복습인데 CRUD다 하기는 귀차늠)

public Artwork getArtworkByTitle(String title) throws SQLException {
    Artwork artwork = new Artwork();
    StringBuilder sb = new StringBuilder();
    sb.setLength(0);
    sb.append("SELECT * FROM ARTWORK WHERE TITLE = ? ");

    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    try{
        conn = DBConnectionUtil.getConnection();
        pstmt = conn.prepareStatement(sb.toString());
        pstmt.setString(1, title);

        rs = pstmt.executeQuery();
        if(rs.next()){
            artwork.setTitle(rs.getString("TITLE"));
            artwork.setType(rs.getString("Type"));
            artwork.setGenre(rs.getString("Genre"));
            artwork.setDescription(rs.getString("Description"));
            artwork.setDirector(rs.getString("Director"));
            artwork.setOpeningDate(rs.getString("OpeningDate"));
        }
        return artwork;
    }catch(SQLException e){
        e.printStackTrace();
        throw e;
    }finally {
        if(rs != null){
            rs.close();
        }
        if(pstmt != null){
            pstmt.close();
        }
        if(conn != null) {
            conn.close();
        }
    }
}
Artwork result = repo.getArtworkByTitle("그냥 제목");
System.out.println(result.toString());

잘된다.


근대 이거하면서 새롭게 안거는 ResultSet.getString할 때 저거 그냥 대문자든 소문자든 상관없는거같음.

DML일 경우는 주의해야할듯

mysql jdbc까보니깐

public String getString(String columnName) throws SQLException {
    try {
        return this.getString(this.findColumn(columnName));
    } catch (CJException var3) {
        throw SQLExceptionsMapping.translateException(var3, this.getExceptionInterceptor());
    }
}

일단 이부분이 구현체같고 쭉 따라가보는데 어디선가 해당 column에 대해서 upper나 lower로 변환시켜주는 뭔가가 있지 않을까?? 싶은 느낌..

 

오늘은 여기 까지만..

 

https://tlqckd0.tistory.com/53

 

Node.js. Mysql2 Transaction작업 + template만들기 (jdbc방식)

일반적으로 jdbc를 사용하여 트랜잭션을 구현하는 방법을 nodejs mysql2를 사용해서 구현하기. mysql2를 사용 함미다. npm i mysql2 0. 일반적으로 transaction를 처리하려면 0) 하나의 connection을 유지한 상태

tlqckd0.tistory.com

예전에 nodejs로 유사하게 구현한 적이 있었는데 비교해보는것도 좋을듯


 

근대 노트북 바꿀생각인데 이거 데이터 어덯게 migration함..? 아까운데 

지금쓰던거는 집에 던져서 게임용으로 냅두고, 새거는 그냥 영상 + 공부용으로 쓸거같

728x90
Comments