데이터베이스

데이터베이스_ DB CRUD(실습_Spring 사용x)_ 22.06.29(day08)

양빵빵 2022. 6. 29. 16:48
package com.jdbc.basic;

import java.sql.Connection;
import java.sql.DriverManager;

// Oracle DB 연결
public class Connect {
    // 데이터 베이스 연결을 위한 정보 저장

    private final static String ACCOUNT = "sqld"; //  계정명 데이터 베이스 파일명
    private final static String PASSWORD = "1234"; // 비밀번호 [테스트를 위해 비밀번호를 틀리게 초기화]

    // 내가 사용할 데이터베이스가 어느 컴퓨터에 있는지 알려줘야 함.
    // 데이터 베이스의 위치정보(DB URL) - DB회사마다 패턴이 다름
    private final static String URL = "jdbc:oracle:thin:@localhost:1521:XE"; // 오라클에 DB URL 패턴을 확인 [찾아봐야함. 인터넷]
    // hr/hr : 계정명 / 계정 비밀번호 //localhost : 내 컴퓨터의 IP // 포트주소
    // localhost 데이터베이스가 클라우드에 있으면 클라우드 주소를 적어야 함.

    // 데이터베이스 접속에 쓸 드라이버 클래스 - DB회사마다 다름
    private final static String DRIVER = "oracle.jdbc.driver.OracleDriver"; // oracle.jdbc.driver. : 패키지명   OracleDriver : 클래스 이름

    // DB 연결 메서드
    public static Connection makeConnection() {

        try {
            // 1. 드라이버 클래스를 동적 로딩
            Class.forName(DRIVER);

            // 2. 연결정보를 담아 연결 객체를 생성
            Connection conn = DriverManager.getConnection(URL, ACCOUNT, PASSWORD);
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }


}

 

package com.jdbc.basic;

import java.sql.Connection;
import java.sql.PreparedStatement;

public class PersonCRUD {

    // 내부 클래스 선언
    public static class Person {
        private String ssn; // 주민번호
        private String name; // 이름
        private int age; // 나이

        public Person(String ssn, String name, int age) {
            this.ssn = ssn;
            this.name = name;
            this.age = age;
        }

        public String getSsn() {
            return ssn;
        }

        public void setSsn(String ssn) {
            this.ssn = ssn;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "ssn='" + ssn + '\'' +
                    ", name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }// end inner class


    // 메서드 선언

    // 사람 객체를 생성해서 반환하는 팩토리메서드 선언
    public static Person makePerson(String ssn, String name, int age) {
        return new Person(ssn, name, age);
    }

    // INSERT 메서드
    public static boolean save(Person p) {
        // 1. SQL구문을 작성
        String sql = "INSERT INTO person " +
                "(ssn, person_name, age) " +
                "VALUES (?, ?, ?)";

        // 2. DB에 접속
        try(Connection conn = Connect.makeConnection()) {

            // 3. SQL실행을 위한 객체 PreparedStatement 생성
            PreparedStatement pstmt = conn.prepareStatement(sql);

            // 4. SQL에  ? 값 채우기
            pstmt.setString(1, p.getSsn());
            pstmt.setString(2, p.getName());
            pstmt.setInt(3, p.getAge());

            // 5. 실행 명령 내리기
            // - INSERT, UPDATE, DELETE : executeUpdate()
            // - SELECT : executeQuery()

            // executeUpdate는 삽입이 실패하면 0을 리턴
            int resultNumber = pstmt.executeUpdate();

            if (resultNumber == 0) return false;
            return true;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }



}// end class
package com.jdbc.basic;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static com.jdbc.basic.PersonCRUD.*;
import static org.junit.jupiter.api.Assertions.*;

class PersonCRUDTest {

    @Test
    @DisplayName("사람 정보가 데이터베이스에 저장되어야 한다.")
    void saveTest(){

        // 사람 객체 생성
        PersonCRUD.Person p = makePerson("850201-1233499", "고길동", 25);

        //사람 저장 명령
        boolean result = save(p);

        // 단언
        assertTrue(result);

    }

}

 

 

 

 

 

 

== 삭제 기능 만들기

// DELETE 메서드
public static boolean remove(String ssn) {
    // 1. SQL구문을 작성
    String sql = "DELETE FROM person WHERE ssn = ?";

    // 2. DB에 접속
    try (Connection conn = Connect.makeConnection()) {

        // 3. SQL실행을 위한 객체 PreparedStatement 생성
        PreparedStatement pstmt = conn.prepareStatement(sql);

        // 4. SQL에  ? 값 채우기
        pstmt.setString(1, ssn);


        // 5. 실행 명령 내리기
        // - INSERT, UPDATE, DELETE : executeUpdate()
        // - SELECT : executeQuery()

        // executeUpdate는 삽입이 실패하면 0을 리턴
        int resultNumber = pstmt.executeUpdate();

        if (resultNumber == 0) return false;
        return true;

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }

 

package com.jdbc.basic;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static com.jdbc.basic.PersonCRUD.*;
import static org.junit.jupiter.api.Assertions.*;

class PersonCRUDTest {

    @Test
    @DisplayName("사람 정보가 데이터베이스에 저장되어야 한다.")
    void saveTest(){

        // 사람 객체 생성
        PersonCRUD.Person p = makePerson("850201-1233499", "고길동", 25);
        PersonCRUD.Person p1 = makePerson("222-22-222222", "황길동", 27);
        PersonCRUD.Person p2 = makePerson("333-333-33333", "오길동", 29);

        //사람 저장 명령
//        boolean result = save(p);
        boolean result = save(p1);
        boolean result2 = save(p2);

        // 단언
        assertTrue(result);
        assertTrue(result2);

    }

    @Test
    @DisplayName("주어진 주민번호에 맞는 사람정보를 데이터베이스에서 삭제해야 한다.")
    void removeTest(){
        boolean flag = remove("850201-1233499");
        assertTrue(flag);
    }

}

 

 

 

=== 사람 이름만 수정하는 메서드

// UPDATE 메서드 이름만 수정
public static boolean updateName(String name, String ssn) {
    // 1. SQL구문을 작성
    String sql = "UPDATE person SET person_name = ? WHERE ssn = ?";

    // 2. DB에 접속
    try (Connection conn = Connect.makeConnection()) {

        // 3. SQL실행을 위한 객체 PreparedStatement 생성
        PreparedStatement pstmt = conn.prepareStatement(sql);

        // 4. SQL에  ? 값 채우기
        pstmt.setString(1, name);
        pstmt.setString(2, ssn);


        // 5. 실행 명령 내리기
        // - INSERT, UPDATE, DELETE : executeUpdate()
        // - SELECT : executeQuery()

        // executeUpdate는 삽입이 실패하면 0을 리턴
        int resultNumber = pstmt.executeUpdate();

        if (resultNumber == 0) return false;
        return true;

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

 

 

 

=== SELECT 메서드 만들기

 

// SELECT ALL [SELECT * FROM]
public static List<Person> findAll(){

    List<Person> personList = new ArrayList<>();

    //1.SQL 작성
    String sql = "SELECT * FROM person";

    //2.DB 연결
    try (Connection conn = Connect.makeConnection()) {

        //3. SQL 실행을 위한 pstmt 객체 생성
        PreparedStatement pstmt = conn.prepareStatement(sql);

        // 4. ? 값 채우기 [ select all 에서는 스킵]

        // 5. sql 실행 - SELECT 실행시 executeQuery()

        // ResultSet : 조회결과 나타나는 2차원의 표
        ResultSet rs = pstmt.executeQuery();

        // ResultSet을 순회해서 소비
        // a - next() 메서드를 통해 행들을 순서대로 지목
        // b - getter 메서드를 통해 열데이터를 추출
        while(rs.next()) {

            String ssn = rs.getString("ssn");
            System.out.println("ssn = " + ssn);

            String name = rs.getString("person_name");
            System.out.println("name = " + name);

            int age = rs.getInt("age");
            System.out.println("age = " + age);

            // 리스트에 담는것이 목적

            Person p = makePerson(ssn, name, age);
            personList.add(p);

        }

        return personList;

    } catch (Exception e) {
        e.printStackTrace();
        return Collections.emptyList(); // 빈 리스트 반환
    }


}

 

 

@Test
@DisplayName("전체 사람데이터를 조회해야 한다")
void findAllTest(){
    List<Person> people = findAll();

    for (Person p : people) {
        System.out.println(p);
    }
}