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

+ Recent posts