728x90

이제 JDBC를 이용해서 데이터를 다뤄보자.

 

  • 데이터 수정하기

우선 MySQL로 가보자.

NOTICE 테이블에서

ID와 REGDATE, HIT는 사용자가 입력하는 정보는 아니다.

REGDATE는 현재 시각을 넣고, HIT는 조회할 때마다 하나씩 증가하며 ID는 1부터 시작해서 하나씩 증가할 것이다.

그렇기 때문에 일단 ID에 자동 증가를 설정해두고, HIT에 디폴트를 0으로 설정해준다.

 

그 후에 테스트로

INSERT INTO NOTICE(
    TITLE,
    WRITER_ID,
    CONTENT,
    REGDATE,
    FILES
) VALUES (
	"SEUNGKYU",
    "SK",
    "AAA",
    NOW(),
    ""
);

해당 값을 넣은 후 데이터가 잘 들어가는 지 테스트 해본다.

이렇게 잘 들어간다.

auto_increment를 다시 1로 설정해주고 JDBC로 넘어간다.

 

Program1의 코드를 그대로 복사해서 Program2를 만들었다.

기본적인 내용들은 크게 변하지는 statement를 PreparedStatement, executeQuery를 executeUpdate로 변경해주어야 한다.

해당 코드들은 조회에서만 사용하는 코드들이다.

 

executeUpdate는 조회가 아니가 때문에 결과 집합을 반환하지 않고, 업데이트 된 데이터의 개수를 반환한다.

 

우선 sql 문장부터 만들어 본다면

import java.sql.*;

public class Program2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/jdbc";
        String user = "root";
        String passwd = "12345678";

        String title = "seungkyubook";
        String writer_id = "sk";
        String content = "aaa";
        String files = "";

        String sql = "INSERT INTO NOTICE (TITLE, WRITER_ID, CONTENT, REGDATE, FILES) VALUES ()";



        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);

        Statement statement = connection.createStatement();

        int result = statement.executeUpdate(sql);
        
        
        statement.close();
        connection.close();
    }
}

 

저렇게 만든 후 VALUES 안에 우리가 넣고 싶어하느 데이터들을 +로 연결해주어야 했다.

이렇게 이어 붙이기 위해서는 문자열에는 '를 또 달아주기도 해야한다.

너무 귀찮고 실수도 많이 일어나는 부분이다.

 

다행이게도 JDBC에서 이 부분을 도와준다.

방법은

import java.sql.*;

public class Program2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/jdbc";
        String user = "root";
        String passwd = "12345678";

        String title = "seungkyubook";
        String writer_id = "sk";
        String content = "aaa";
        String files = "";

        String sql = "INSERT INTO NOTICE (TITLE, WRITER_ID, CONTENT, REGDATE, FILES) VALUES (?, ?, ?, NOW(),?)";

        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);

        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.close();
        connection.close();
    }
}

이렇게 문자열이 추가될 부분을 그냥 ?로 놔둔다.

이 부분들을 PreparedStatement가 해결해준다.

실행할 때 sql을 넘기는 것이 아니라 미리 준비해 둔다는 말이다.

 

        preparedStatement.setString(1, title);
        preparedStatement.setString(2, writer_id);
        preparedStatement.setString(3, content);
        preparedStatement.setString(4, files);

그러고 PreparedStatement의 set???(index, data)로 물음표를 채워준다.

여기서 조심할 점은 index가 0부터 시작하는 것이 아니라 1부터 시작한다는 점이다.

당연히 정수값을 넣으려면 setInt() 이런 느낌이다.

int result = preparedStatement.executeUpdate();

문장만 준비해두고 executeUpdate를 실행하면 업데이트가 된다.

이미 sql을 준비해두었기 때문에 sql을 넘기지 않는다.

import java.sql.*;

public class Program2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/jdbc";
        String user = "root";
        String passwd = "12345678";

        String title = "seungkyubook";
        String writer_id = "sk";
        String content = "aaa";
        String files = "";

        String sql = "INSERT INTO NOTICE (TITLE, WRITER_ID, CONTENT, REGDATE, FILES) VALUES (?, ?, ?, NOW(),?)";

        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);

        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setString(1, title);
        preparedStatement.setString(2, writer_id);
        preparedStatement.setString(3, content);
        preparedStatement.setString(4, files);

        int result = preparedStatement.executeUpdate();

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery("SELECT * FROM NOTICE");

        while(resultSet.next()){
            int result_id = resultSet.getInt("ID");
            String result_title = resultSet.getString("TITLE");
            String result_writer_id = resultSet.getString("WRITER_ID");
            String result_content = resultSet.getString("CONTENT");
            Date result_regdate = resultSet.getDate("REGDATE");
            int result_hit = resultSet.getInt("HIT");
            String result_files = resultSet.getString("FILES");

            System.out.printf("id: %d, title: %s, write_id: %s, content: %s, regDate: %s, hit: %d, files: %s\n",
                    result_id, result_title, result_writer_id, result_content, result_regdate, result_hit, result_files);
        }

        preparedStatement.close();
        connection.close();
    }
}

최종적으로 작성한 코드이다.

데이터를 추가하고 바로 조회할 수 있도록 작성해보았다.

 

실행을 해보면

이렇게 잘 추가되는 것을 볼 수 있다.

 

  • 데이터 수정하기

수정은 그냥 PreparedStatement를 수정에 맞게 수정하면 된다.

import java.sql.*;

public class Program3 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/jdbc";
        String user = "root";
        String passwd = "12345678";

        int id = 6;
        String title = "seungkyu!!!";
        String writer_id = "sk";
        String content = "aaa";
        String files = "";

        String sql = "UPDATE NOTICE SET TITLE = ?, WRITER_ID = ?, CONTENT = ?, REGDATE = NOW(), FILES = ? WHERE ID = ?";

        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);

        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setString(1, title);
        preparedStatement.setString(2, writer_id);
        preparedStatement.setString(3, content);
        preparedStatement.setString(4, files);
        preparedStatement.setInt(5, id);

        int result = preparedStatement.executeUpdate();

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery("SELECT * FROM NOTICE");

        while(resultSet.next()){
            int result_id = resultSet.getInt("ID");
            String result_title = resultSet.getString("TITLE");
            String result_writer_id = resultSet.getString("WRITER_ID");
            String result_content = resultSet.getString("CONTENT");
            Date result_regdate = resultSet.getDate("REGDATE");
            int result_hit = resultSet.getInt("HIT");
            String result_files = resultSet.getString("FILES");

            System.out.printf("id: %d, title: %s, write_id: %s, content: %s, regDate: %s, hit: %d, files: %s\n",
                    result_id, result_title, result_writer_id, result_content, result_regdate, result_hit, result_files);
        }

        preparedStatement.close();
        connection.close();
    }
}

 

  • 데이터 삭제하기
import java.sql.*;

public class Program4 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/jdbc";
        String user = "root";
        String passwd = "12345678";

        int id = 6;

        String sql = "DELETE FROM NOTICE WHERE id = ?";

        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);

        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setInt(1, id);


        preparedStatement.executeUpdate();

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery("SELECT * FROM NOTICE");

        while(resultSet.next()){
            int result_id = resultSet.getInt("ID");
            String result_title = resultSet.getString("TITLE");
            String result_writer_id = resultSet.getString("WRITER_ID");
            String result_content = resultSet.getString("CONTENT");
            Date result_regdate = resultSet.getDate("REGDATE");
            int result_hit = resultSet.getInt("HIT");
            String result_files = resultSet.getString("FILES");

            System.out.printf("id: %d, title: %s, write_id: %s, content: %s, regDate: %s, hit: %d, files: %s\n",
                    result_id, result_title, result_writer_id, result_content, result_regdate, result_hit, result_files);
        }

        preparedStatement.close();
        connection.close();
    }
}

늘 그렇듯이 DELETE로 바꾸어주면 된다.

이렇게 모든 데이터가 지워진 것을 볼 수 있다.

 

  • CRUD 서비스 구현

배웠던 조회, 입력, 수정, 삭제를 이용하여 서비스를 만들어보자.

 

NOTICE를 대상으로 하기 때문에 패키지를 만들고 진행할 예정이다.

우선 데이터를 가져오고 저장할 NOTICE 클래스를 만들어보자.

package Service;

import java.util.Date;

public class Notice {
    private int id;
    private String title;
    private String writerId;
    private String content;
    private Date regDate;
    private int hit;
    private String files;

    public Notice(int id, String title, String writerId, String content, Date regDate, int hit, String files) {
        this.id = id;
        this.title = title;
        this.writerId = writerId;
        this.content = content;
        this.regDate = regDate;
        this.hit = hit;
        this.files = files;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getWriterId() {
        return writerId;
    }

    public void setWriterId(String writerId) {
        this.writerId = writerId;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Date getRegDate() {
        return regDate;
    }

    public void setRegDate(Date regDate) {
        this.regDate = regDate;
    }

    public int getHit() {
        return hit;
    }

    public void setHit(int hit) {
        this.hit = hit;
    }

    public String getFiles() {
        return files;
    }

    public void setFiles(String files) {
        this.files = files;
    }
}

당연히 Private로 멤버들을 선언해주고, Getter와 Setter를 만들어준다.

 

전에 만들었던 조회 부분을 살짝 수정해서 getList를 완성해주었다.

package Service;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class NoticeService {

    String driver = "com.mysql.cj.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/jdbc";
    String user = "root";
    String passwd = "12345678";

    public List<Notice> getList() throws ClassNotFoundException, SQLException {

        List<Notice> list = new ArrayList<Notice>();

        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery("SELECT * FROM NOTICE");

        while(resultSet.next()){
            int id = resultSet.getInt("ID");
            String title = resultSet.getString("TITLE");
            String writer_id = resultSet.getString("WRITER_ID");
            Date regDate = resultSet.getDate("REGDATE");
            String content = resultSet.getString("CONTENT");
            int hit = resultSet.getInt("HIT");
            String files = resultSet.getString("FILES");

            Notice notice = new Notice(id, title, writer_id, content, regDate, hit, files);

            list.add(notice);
        }
        resultSet.close();
        statement.close();
        connection.close();

        return list;
    }
}

다른 파일들도 복사한 후 코드를 약간 수정해서 메서드들을 작성했다.

package Service;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class NoticeService {

    String driver = "com.mysql.cj.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/jdbc";
    String user = "root";
    String passwd = "12345678";

    public List<Notice> getList() throws ClassNotFoundException, SQLException {

        List<Notice> list = new ArrayList<>();

        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery("SELECT * FROM NOTICE");

        while(resultSet.next()){
            int id = resultSet.getInt("ID");
            String title = resultSet.getString("TITLE");
            String writer_id = resultSet.getString("WRITER_ID");
            Date regDate = resultSet.getDate("REGDATE");
            String content = resultSet.getString("CONTENT");
            int hit = resultSet.getInt("HIT");
            String files = resultSet.getString("FILES");

            Notice notice = new Notice(id, title, writer_id, content, regDate, hit, files);

            list.add(notice);
        }
        resultSet.close();
        statement.close();
        connection.close();

        return list;
    }

    public int insert(Notice notice) throws ClassNotFoundException, SQLException {
        String sql = "INSERT INTO NOTICE (TITLE, WRITER_ID, CONTENT, REGDATE, FILES) VALUES (?, ?, ?, NOW(),?)";

        String title = notice.getTitle();
        String writerId = notice.getWriterId();
        String content = notice.getContent();
        String files = notice.getFiles();

        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);

        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setString(1, title);
        preparedStatement.setString(2, writerId);
        preparedStatement.setString(3, content);
        preparedStatement.setString(4, files);

        int result = preparedStatement.executeUpdate();


        preparedStatement.close();
        connection.close();

        return result;
    }

    public int update(Notice notice) throws ClassNotFoundException, SQLException {
        String sql = "UPDATE NOTICE SET TITLE = ?, WRITER_ID = ?, CONTENT = ?, REGDATE = NOW(), FILES = ? WHERE ID = ?";

        int id = notice.getId();
        String title = notice.getTitle();
        String writerId = notice.getWriterId();
        String content = notice.getContent();
        String files = notice.getFiles();

        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);

        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setString(1, title);
        preparedStatement.setString(2, writerId);
        preparedStatement.setString(3, content);
        preparedStatement.setString(4, files);
        preparedStatement.setInt(5, id);

        int result = preparedStatement.executeUpdate();

        preparedStatement.close();
        connection.close();

        return result;
    }

    public int delete(int id) throws ClassNotFoundException, SQLException {
        String sql = "DELETE FROM NOTICE WHERE id = ?";

        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, passwd);
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, id);

        int result = preparedStatement.executeUpdate();

        Statement statement = connection.createStatement();

        preparedStatement.close();
        connection.close();

        return result;
    }
}

'백엔드 > JDBC' 카테고리의 다른 글

JDBC 1일차  (0) 2023.03.12
728x90
  • JDBC란 무엇인가?

JDBC(Java Database Connectivity)는 자바에서 DB에 접속할 수 있도록 하는 자바의 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

자바와 DBMS 사이에서 통역을 해주는 통역사의 역할을 수행한다.

JDBC를 사용하면 개발자는 DBMS를 신경쓰지 않고 JDBC만을 사용해서 개발을 할 수 있게 된다.

JDBC를 사용하기 위해서는 해당 DBMS의 JDBC 드라이버를 사용해야 한다.

 

 

  • JDBC Driver

mac을 사용하고 있기 때문에

 

https://dev.mysql.com/downloads/connector/j/

 

MySQL :: Download Connector/J

MySQL Connector/J 8.0 is highly recommended for use with MySQL Server 8.0, 5.7 and 5.6. Please upgrade to MySQL Connector/J 8.0.

dev.mysql.com

해당 사이트에서

Platform Independent를 선택해서 다운 받아준다.

 

다운로드 받은 후 압축을 풀어둔다.

 

이제 실습을 하기 위한 Intellij를 열어주자.

새로운 프로젝트를 생성하고 Project Structure에서 다운로드 받고 압축을 해제했던 connector를 추가해준다.

OK를 누르면 이제 JDBC를 사용할 준비가 된 것이다.

 

  • JDBC 기본코드

우선은 MySQL에서 받은 드라이버를 로드해야 한다.

 

그렇기에 드라이버를 로드하는 것이 가장 첫번째 코드이다.

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

이 코드로 MySQL 드라이버를 로드하자.

 

이렇게 드라이버를 로드하면 메모리에 잡히게 된다.

 

이 드라이버를 연결해 연결 객체를 얻어야 한다.

Connection connection = DriverManager.getConnection(...);

현재 로컬에 있는 데이터베이스에 연결할 것이기 때문에

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/DB명", "user", "password");

이렇게 연결하도록 하자.

 

실행도구를 생성한다.

Statement statement = connection.createStatement();

 

쿼리를 실행하고 결과를 받아온다.

ResultSet resultSet = statement.executeQuery(sql);

 

현재 ResultSet은 파일의 시작(Before of File)을 가르키고 있으며, 이 ResultSet은 ResultSet.next를 이용하여 다음 정보들을 넘겨 받게 된다.

그러다가 파일의 마지막(End of File)을 가르키면 더 이상 데이터를 반환하지 않게 된다.

 

ResultSet.getXXX("열이름") 메서드를 사용하면 현재 ResultSet이 가르키고 있는 행의 열 이름에 해당하는 정보를 가져오게 된다.

 

바로 실습을 해보도록 하자.

참고로 이 부분에 대한 코드는 거의 고정이니 외워서 사용하도록 하자.

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

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345678");

Statement statement = connection.createStatement();

ResultSet resultSet = statement.executeQuery("");
        
//
//
        
resultSet.close();
statement.close();
connection.close();

우선 DB에서 데이터를 가져오기 위해 데이터를 추가한다.

 

INSERT INTO NOTICE VALUES
(
    1,
    "hello",
    "sk",
    "aaa",
    SYSDATE(),
    0,
    ""
);

이렇게 NOTICE 테이블에 데이터를 대충 추가한 후

 

import java.sql.*;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

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

        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345678");

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery("SELECT * FROM NOTICE");



        if(resultSet.next()){
            String title = resultSet.getString("TITLE");
            System.out.println(title);
        }

        resultSet.close();
        statement.close();
        connection.close();
    }
}

ResultSet에서 다음 데이터를 가져온 후 title 열의 데이터를 출력해보면

 

이렇게 잘 출력이 되는 것을 볼 수 있다.

 

데이터를 하나 더 추가하여 while 문으로 모든 데이터를 출력한 모습이다.

당연히 MySQL과 마찬가지로 쿼리에 WHERE 문도 사용 할 수가 있다.

import java.sql.*;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

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

        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "12345678");

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery("SELECT * FROM NOTICE WHERE ID > 1");

        while(resultSet.next()){
            int id = resultSet.getInt("ID");
            String title = resultSet.getString("TITLE");
            String writer_id = resultSet.getString("WRITER_ID");
            Date regDate = resultSet.getDate("REGDATE");
            String content = resultSet.getString("CONTENT");
            int hit = resultSet.getInt("HIT");

            System.out.printf("id: %d, title: %s, write_id: %s, regDate: %s, content: %s, hit: %d\n", id, title, writer_id, regDate, content, hit);
        }

        resultSet.close();
        statement.close();
        connection.close();
    }
}

'백엔드 > JDBC' 카테고리의 다른 글

JDBC 2일차  (0) 2023.03.14

+ Recent posts