데이터베이스
데이터베이스_ 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);
}
}