본문 바로가기

Languages/JAVA

[JAVA] JDBC 사용해보기 #3 - DTO, DAO와 같이 사용해보기 ( Select, Insert, Update, Delete )

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

 

자신의 컴퓨터에 mysql, oracle, mariadb 중 하나라도 설치가 되어 있어야 연동이 가능하고 DB 종류에 관계없이 동일한 API를 제공합니다.

 

JDBC를 사용하기위해서 드라이버를 이클립스 안에 설치해야하는데요.

여기서 설치 방법을 볼 수 있습니다 -> [JAVA] JDBC 사용해보기 #1 - 오라클 JDBC 드라이버 불러오기  

 

DB와 연동하는 DBConnect.java는 [JAVA] JDBC 사용해보기 #2 - DB 접속 코드 예제 ( Select, Insert, Update, Delete ) , DTO와 같이 사용해보기 여기서 자세하게 볼 수 있습니다.

 

이제 본격적으로 DTO, DAO를 사용해봅시다.


 

DBConnect.java

package test.util;

import java.sql.Connection;
import java.sql.DriverManager;
/*
 * 객체를 생성해서 메소드를 호출하면 Connection 객체를 리턴하는 객체를 생성할 클래스 설계하기
 */

public class DBConnect {
	//Connection 객체의 참조값을 담을 필드 선언
	private Connection conn;
	
	//생성자에서 Connection 객체를 얻어오는 작업을 한다.
	public DBConnect() {
	      try {
	    	 //오라클 드라이버 클래스 로딩(OracleDriver 클래스를 사용할 준비를 한다)
	         Class.forName("oracle.jdbc.driver.OracleDriver");
	         //접속할 DB 의 정보
	         String url="jdbc:oracle:thin:@localhost:1521:xe";
	         //DB 연결 객체의 참조값 얻어와서 필드에 담기
	         conn=DriverManager.getConnection(url, "scott", "tiger");
	         //예외가 발생하지 않고 여기까지 실행순서가 진행이되면 접속 성공이다.
	         System.out.println("Oracle DB 접속 성공!");
	         
	      }catch(Exception e){
	      
	      }
	}
	
	//Connection 객체를 리턴하는 메소드
	public Connection getConn() {
		return conn;
	}
	
	
}

DBConnect 클래스는 DB와 연결해주는 코드입니다. 위에 링크를 달아놓았지만 혹시 몰라 한번 더 넣겠습니다.

자세한 설명은 [JAVA] JDBC 사용해보기 #2 - DB 접속 코드 예제 ( Select, Insert, Update, Delete ) , DTO와 같이 사용해보기 여기서 자세하게 볼 수 있습니다.


company table

저는 오라클에 company table을 생성해주었습니다.

이 company 테이블에서 삽입, 삭제, 갱신, 조회를 해볼 것 입니다.

 

 

create table company(
empno number primary key,
ename varchar2(12) not null,
job varchar2(16) not null,
hiredate date );

company 테이블 생성 코드입니다.

 

빈 테이블이 생성된 것을 볼 수 있습니다.

 


CompanyDto.java

package test.dto;

public class CompanyDto {
	private int empno;
	private String ename;
	private String job;
	private String hiredate;
	
	
	public CompanyDto() {
		super();
	}



	public CompanyDto(int empno, String ename, String job, String hiredate) {
		super();
		this.empno = empno;
		this.ename = ename;
		this.job = job;
		this.hiredate = hiredate;
	}


	public int getEmpno() {
		return empno;
	}


	public void setEmpno(int empno) {
		this.empno = empno;
	}


	public String getEname() {
		return ename;
	}


	public void setEname(String ename) {
		this.ename = ename;
	}


	public String getJob() {
		return job;
	}


	public void setJob(String job) {
		this.job = job;
	}


	public String getHiredate() {
		return hiredate;
	}


	public void setHiredate(String hiredate) {
		this.hiredate = hiredate;
	}
	
	
	
	
}

DTO를 생성해줍니다. DTO를 만드는 방법은  [JAVA] DTO vs VO vs Entity / DTO 살펴보기 여기에서 자세히 볼 수 있습니다. 

 

[JAVA] DTO vs VO vs Entity / DTO 살펴보기

DTO, VO, Entity에 대해 알아봅시다 😎 오늘은 DTO, VO, Entity를 비교해보고 DTO에 대해서 자세히 알아봅시다. VO (Value Object) - 값 그자체를 표현하는 객체이다. - 로직을 포함할 수 있습니다. - 변하지 않

e-you.tistory.com


 

CompanyDao.java

package test.dao;

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

import test.dto.CompanyDto;
import test.util.DBConnect;

public class CompanyDao {
	
	public boolean insert(CompanyDto dto) {
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		int flag = 0;
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "INSERT INTO company"
					+ " (empno,ename,job,hiredate)"
					+ " VALUES(company_seq.NEXTVAL,?,?,SYSDATE)";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기 
			pstmt.setString(1, dto.getEname());
			pstmt.setString(2, dto.getJob());
			//sql 문 실행하기 (INSERT, UPDATE, DELETE)
			flag = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		if (flag > 0) {
			//성공
			return true;
		} else {
			//실패
			return false;
		}
	}
	
	public boolean update(CompanyDto dto) {
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		int flag = 0;
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "UPDATE Company"
					+" SET ename=?, job=?"
					+" WHERE empno=?";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기 
			pstmt.setString(1, dto.getEname());
			pstmt.setString(2, dto.getJob());
			pstmt.setInt(3, dto.getEmpno());
			//sql 문 실행하기 (INSERT, UPDATE, DELETE)
			flag = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		if (flag > 0) {
			//성공
			return true;
		} else {
			//실패
			return false;
		}
	}
	
	public boolean delete(CompanyDto dto) {
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		int flag = 0;
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "DELETE FROM Company"
					+" WHERE empno=?";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기 
			pstmt.setInt(1, dto.getEmpno());
			//sql 문 실행하기 (INSERT, UPDATE, DELETE)
			flag = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		if (flag > 0) {
			//성공
			return true;
		} else {
			//실패
			return false;
		}
	}
	
	public CompanyDto getData(int empno) {
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		CompanyDto dto = null;
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "SELECT ename, job, TO_CHAR(hiredate,'YYYY.mm.dd') as hiredate"
					+" FROM Company"
					+ " WHERE empno = ?";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기 
			pstmt.setInt(1, empno);
			//select 문 수행하고 결과를 ResultSet 으로 받아오기 
			rs = pstmt.executeQuery();
			if (rs.next()) {
				//cursor 가 위치한 곳의 칼럼 데이터를 빼오기
				dto = new CompanyDto();
				dto.setEmpno(empno);
				dto.setEname(rs.getString("ename"));
				dto.setJob(rs.getString("job"));
				dto.setHiredate(rs.getString("hiredate"));
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		return dto;
	}
	
	public List<CompanyDto> getList(){
		//필요한 객체를 담을 지역 변수 미리 만들기
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<CompanyDto> list = new ArrayList<>();
		
		try {
			//Connection 객체의 참조값 얻어오기 
			conn = new DBConnect().getConn();
			//실행할 sql 문의 뼈대 미리 준비하기
			String sql = "SELECT empno, ename, job, TO_CHAR(hiredate,'YYYY.mm.dd') as hiredate"
					+" FROM Company";
			//PreparedStatement 객체의 참조값 얻어오기
			pstmt = conn.prepareStatement(sql);
			//? 에 필요한값 바인딩하기 

			//select 문 수행하고 결과를 ResultSet 으로 받아오기 
			rs = pstmt.executeQuery();
			while (rs.next()) {
				//cursor 가 위치한 곳의 칼럼 데이터를 빼오기 
				CompanyDto dto = new CompanyDto();
				dto.setEmpno(rs.getInt("empno"));
				dto.setEname(rs.getString("ename"));
				dto.setJob(rs.getString("job"));
				dto.setHiredate(rs.getString("hiredate"));
				list.add(dto);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		return list;
	}
	
}

Dao 전체 코드입니다. 입력, 수정, 삭제, 한명의 정보 불러오기, 사원 목록 불러오기 기능을 만들었습니다.

 


MainClass17.java

package test.main;

import java.util.ArrayList;
import java.util.List;

import test.dao.CompanyDao;
import test.dto.CompanyDto;

public class MainClass17 {
	public static void main(String[] args) {
		/* company 테이블에 사원정보를 관리하는 프로그래밍을 해보세요.
		 * 1. CompanyDto를 만드세요
		 * 
		 * 2. CompanyDao를 만드세요.
		 * 입력, 수정, 삭제, 한명의 정보 불러오기, 사원 목록 불러오기
		 * 기능을 만들면 됩니다.
		 * 
		 * 3. 각각의 기능을 테스트 할 수 있는 main 메소드를 만들어서 테스트해보세요.
		 * 
		 */
		
		CompanyDao dao = new CompanyDao();
		
		
		CompanyDto dto1 = new CompanyDto();
		dto1.setEname("이00");
		dto1.setJob("개발");
		
		boolean isSuccess = dao.insert(dto1);
		if(isSuccess) {
			System.out.println("삽입 성공");
		}else {
			System.out.println("삽입 실패");
		}
		
		
		CompanyDto dto2 = new CompanyDto();
		dto2.setEmpno(1);
		dto2.setEname("최00");
		dto2.setJob("전산");
		
		boolean isSuccess2 = dao.update(dto2);
		if(isSuccess2) {
			System.out.println("갱신 성공");
		}else {
			System.out.println("갱신 실패");
		}
		
		
		
		CompanyDto dto3 = new CompanyDto();
		dto3.setEmpno(4);
		
		boolean isSuccess3 = dao.delete(dto3);
		if(isSuccess3) {
			System.out.println("삭제 성공");
		}else {
			System.out.println("삭제 실패");
		}
		
		
		
		CompanyDto dto4  = dao.getData(1);
		if(dto4!=null) {
			System.out.println(dto4.getEmpno() + " | " + dto4.getEname() + " | " +dto4.getJob() + " | " +dto4.getHiredate());
		}else {
			System.out.println("조회 내역이 없습니다.");
		}
		
		
		
		List<CompanyDto> list = new ArrayList<>();
		list = dao.getList();
		if(list.size()==0) {
			System.out.println("조회 내역이 없습니다.");
		}else {
			for(CompanyDto tmp:list) {
				System.out.println(tmp.getEmpno() + " | " + tmp.getEname() + " | " +tmp.getJob() + " | " +tmp.getHiredate());
			}
		}

	}
}​

MainClass 입니다. 하나씩 실행시키면 DB를 조작하거나 바꾸는 모습을 볼 수 있습니다.