본문 바로가기
개발 공부/JAVA

[JAVA] JDBC / VO / DAO

by sngynhy 2021. 7. 29.

Model에 해당하는 객체

  - DAO (Data Access Object) : DB에 접근하는 객체
  - VO (Value Object) : DB 테이블을 객체화시킨 객체

 

구현 과정

1. JDBC (Java Database Connectivity) : 드라이버 로드, 커넥션 open 및 close  - 1,2,4
2. VO : 테이블 -> Object (객체화)
3. DAO : pstmt로 data read, write - 3

 

[JDBC]

DB와 연동하기 위한 드라이버 로드하는 과정

Connection 객체 생성 (open)
생성된 Connection 객체 close

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBC {

	public static Connection getConnection() {
		Connection conn = null;
		
		String DName_oracle = "oracle.jdbc.driver.OracleDriver";  // JDBC의 드라이버 클래스명
		
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user="sngynhy";
		String password="****";
		
		try {
			Class.forName(DName_oracle);
			conn = DriverManager.getConnection(url, user, password);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	
	public static void Close(Connection conn, PreparedStatement pstmt) {
		try {
			if (pstmt != null) pstmt.close();
			if (conn != null) conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

 

[VO]

VO(Value Object) : DB 테이블을 객체화시킨 객체

public class TestVO {
	
	private int a;
	private String b;
	private int c;

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public String getB() {
		return b;
	}

	public void setB(String b) {
		this.b = b;
	}
	
	public int getC() {
		return c;
	}

	public void setC(int c) {
		this.c = c;
	}

	@Override
	public String toString() {
		return this.a + " " + this.b;
	}
	

}

 

 

[DAO]

DAO(Data Access Object) : DB에 접근하는 객체

JDBC로부터 열린 conn을 받아와서 DB 처리

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class TestDAO {
	
	static String sql_SELECT_ONE = "select * from test where a = ?";  // a - PK
	static String sql_SELECT_ALL = "select * from test where b like ? order by a asc";
//	static String sql_SELECT_ALL = "select * from test where c < 9 order by a asc";
	static String sql_INSERT = "insert into test values (?, ?, ?)";
	static String sql_DELETE = "delete from test where a = ?";
	static String sql_UPDATE = "update test set b = ? , c = ? where a = ?";
	
	private Connection conn = null;
	private PreparedStatement pstmt = null;
	
	// CRUD는 항상 제공되어야함
	// insert, select(단일객체), select(목록), update, delete
	
	// select(단일객체)문 함수명 -> getDB명()
	public TestVO getTest(TestVO vo) {
	// 리턴 타입은 사용자가 조회한 DB 테이블을 객체화시킨 객체 -> TestVO
		
		conn = JDBC.getConnection(); // 연결
		TestVO data = null;
		// DB에 내가 찾고자하는 데이터의 존재 여부를 모르기 때문에 null로 초기화
		//  -> 검색 결과 없을 시 null로 리턴
		
		try {
			pstmt = conn.prepareStatement(sql_SELECT_ONE);
			pstmt.setInt(1, vo.getA());
			// sql구문 첫번째 물음표값을 사용자로부터 건네받은 인자값으로 설정
			
			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {  // 만약 찾고자 하는 데이터가 DB에 있다면
				data = new TestVO();
				// 현재 TestVO()는 기본생성자이기 때문에 필드값들이 초기화되지 않은 상태
                
				// DB에 있는 데이터로 TestVO의 필드값을 초기화해주는 과정
				data.setA(rs.getInt("a"));
				data.setB(rs.getString("b"));
				data.setC(rs.getInt("c"));
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBC.Close(conn, pstmt);  // conn, pstmt 모두 close
		}
		System.out.println("getTest() 수행완료");
		return vo;
	}
	
	// select(목록)문 함수명 -> getDB명List()
	public ArrayList<TestVO> getTestList(TestVO vo) {
	// 리턴타입은 TestVO를 목록(list)로 받음
    
		conn = JDBC.getConnection();
		ArrayList<TestVO> voList = new ArrayList<TestVO>();
		try {
			pstmt = conn.prepareStatement(sql_SELECT_ALL);
			pstmt.setString(1, "%" + vo.getB() + "%");  // like 검색 시
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				TestVO data = new TestVO();
				data.setA(rs.getInt("a"));
				data.setB(rs.getString("b"));
				data.setC(rs.getInt("c"));
				voList.add(data);
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBC.Close(conn, pstmt);
		}
		System.out.println("getTestList() 수행완료");
		return voList;
	}
	
	
	public void insertTest(TestVO vo) {
		conn = JDBC.getConnection();
		try {
			pstmt = conn.prepareStatement(sql_INSERT);
			pstmt.setInt(1, vo.getA());
			pstmt.setString(2, vo.getB());
			pstmt.setInt(3, vo.getC());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBC.Close(conn, pstmt);
		}
		System.out.println("insertTest() 수행완료");
	}
	
	
	public void deleteTest(TestVO vo) {  // 인자로 PK 받아도 상관없음!
		conn = JDBC.getConnection();
		try {
			pstmt = conn.prepareStatement(sql_DELETE);
			pstmt.setInt(1, vo.getA());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBC.Close(conn, pstmt);
		}
		System.out.println("deleteTest() 수행완료");
	}
	
	
	public void updateTest(TestVO vo) {
	// 단 하나의 값만 수정하더라도 PK 제외한 모든 데이터가 업데이트 처리됨

		conn = JDBC.getConnection();
		try {
			pstmt = conn.prepareStatement(sql_UPDATE);
			pstmt.setString(1, vo.getB());
			pstmt.setInt(2, vo.getC());
			pstmt.setInt(3, vo.getA());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBC.Close(conn, pstmt);
		}
		System.out.println("updateTest 수행완료");
	}
}

 

 

[main함수]

import java.util.ArrayList;

public class Test1 {

	public static void main(String[] args) {
		
		TestDAO dao = new TestDAO();
		
		TestVO vo = new TestVO();
	
		// insertTest
		vo.setA(10);
		vo.setB("아무무");
		dao.insertTest(vo);
		
		System.out.println();
		
		// getTest - select(단일객체)
		vo.setA(9);
		vo = dao.getTest(vo);
		System.out.println(vo);
		
		System.out.println();
		
		// updateTest - update는 반드시 getTest()를 실행한 뒤 이루어져야 한다!!!
		// 수정 전에 데이터가 존재하는지 조회하기
		vo.setA(10);
		vo = dao.getTest(vo);
		if (vo != null) {  // update 가능!
			System.out.println(vo);
			System.out.println("업데이트 할 b값 입력");
			String b = "뽕꾸";
			vo.setB(b);
			dao.updateTest(vo);
		} else { // update 불가능!
			System.out.println("검색 결과 없음!");
		}
		
		vo.setA(3);
		dao.deleteTest(vo);
		
		ArrayList<TestVO> datas = dao.getTestList(vo);
		for (TestVO v : datas) {
			System.out.println(v);
		}
	}

}