VISION HONG
article thumbnail
Published 2020. 12. 8. 00:00
JDBC(Java Database Connectivity) Java

JDBC는 자바에서 데이터베이스로 접속할 수 있도록 하는 자바 API

 

JDBC 연습용 Table : DEPT

 

 

desc DEPT

 

 

select * from DEPT


DBUtil

- 데이터베이스에 접근, 종료를 도와주는 메서드가 있는 클래스 즉 ConnectionPool의 역할

package jdbcexam;

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

//접속
public class DBUtil {
	static String URL = "jdbc:mysql://localhost:3306/hongdb?serverTimezone=UTC";
	static String USER = "HONG";
	static String PASSWORD = "HONG";
	static String DRIVENAME = "com.mysql.cj.jdbc.Driver";
	
	public static Connection getConnection() throws Exception{
		Connection conn = null; 
		Class.forName(DRIVENAME); //드라이버 로딩 (DB회사마다 다른 형식)
		conn = DriverManager.getConnection(URL,USER,PASSWORD); // DB에 접속
		return conn;
	}
	
//접속종료
public static void close(Connection conn) {
	if(conn!=null) {
		try {
			conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

public static void close(Connection conn, PreparedStatement ps) {
	if(ps!=null) {
		try {
			ps.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	}
}

 


DeptDTO

- DTO(Data Transfer Object)는 로직을 갖고 있지 않는 순수한 데이터 객체이며 속성과 그 속성에 접근하기 위한 getter,setter 메소드만 가진 클래스 

package jdbcexam;

public class DeptDTO {
		private int deptno;
		private String dname;
		private String loc;
		
		public int getDeptno() {
			return deptno;
		}
		public void setDeptno(int deptno) {
			this.deptno = deptno;
		}
		public String getDname() {
			return dname;
		}
		public void setDname(String dname) {
			this.dname = dname;
		}
		public String getLoc() {
			return loc;
		}
		public void setLoc(String loc) {
			this.loc = loc;
		}
		
		@Override
		public String toString() {
			return "DeptDTO [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + "]";
		}
		
}

 


DeptDAO

- DAO(Data Access Object)는 데이터베이스에 접근을 위한 객체이며 접근을 하기위한 로직과 비즈니스 로직을 분리하기 위해서 사용

- DAO는 데이터베이스를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트

package jdbcexam;

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

import com.mysql.cj.protocol.Resultset;

public class DeptDAO { 
	
	public int insertExam(DeptDTO dept) {
		int count = 0;
		Connection conn = null;
		PreparedStatement ps = null;
		try{
			conn = DBUtil.getConnection();
			String sql = "insert into dept (deptno, dname, loc) values(?, ?, ?)";
			
			ps = conn.prepareStatement(sql);
			ps.setInt(1,dept.getDeptno());
			ps.setString(2,dept.getDname());
			ps.setString(3,dept.getLoc());
			count = ps.executeUpdate(); //쿼리 실행
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.close(conn, ps);
		}
		return count;
	}
		
	public int UpdateExam (DeptDTO dept){
		int count = 0;
		Connection conn = null;
		PreparedStatement ps = null;
		try{	
			conn = DBUtil.getConnection();
			String sql = "update dept set dname=?, loc=? where deptno=?";
			ps= conn.prepareStatement(sql);
			ps.setString(1, dept.getDname());
			ps.setString(2, dept.getLoc());
			ps.setInt(3, dept.getDeptno());
			count = ps.executeUpdate();
		}
		catch(Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.close(conn, ps);
		}
		return count;
	}
		
	public int deleteExam (DeptDTO dept){
		int count = 0;
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = DBUtil.getConnection();
			String sql = "delete from dept where deptno = ?";
			ps = conn.prepareStatement(sql);
			ps.setInt(1, dept.getDeptno());
			count = ps.executeUpdate();
		}
		catch(Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.close(conn, ps);
		}
		return count;
	}
}

Statement 클래스

- SQL 구문을 실행하는 역할

- 스스로는 SQL 구문 이해 못함(구문해석 X) -> 전달역할

- SQL 관리 O + 연결 정보 X

 

PreparedStatement 클래스

- Statement 클래스의 기능 향상

- 인자와 관련된 작업이 특화(매개변수)

- 코드 안정성 높음. 가독성 높음.

- 코드량이 증가 -> 매개변수를 set해줘야하기 때문에..

- 텍스트 SQL 호출

- 위 코드에서 ?는 테이블 값만 들어갈 수 있음, 컬럼명 사용 불가

  


DeptTest

- main문

package jdbcexam;

import java.util.Scanner;

public class DeptTest {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		DeptDAO dept= new DeptDAO();
		DeptDTO dto = new DeptDTO();
		
		while(true) {
			System.out.println("1.추가   2.업데이트   3.삭제");
			int num = sc.nextInt();	
			if(num==1) {
				System.out.println("추가할 부서번호, 추가할 부서, 추가할 지역(차례로 엔터입력): ");
				dto.setDeptno(sc.nextInt());	
				dto.setDname(sc.next());
				dto.setLoc(sc.next());
				dept.insertExam(dto);
				System.out.println("추가완료");
			}
			else if(num==2) {
				System.out.println("부서번호, 변경할 부서이름, 변경할 지역(차례로 엔터입력) : ");
				dto.setDeptno(sc.nextInt());	
				dto.setDname(sc.next());
				dto.setLoc(sc.next());
				dept.UpdateExam(dto);
				System.out.println("변경완료.");
			}	
			else if(num==3) {
				System.out.println("삭제할 부서번호: ");
				dto.setDeptno(sc.nextInt());
				dept.deleteExam(dto);
				System.out.println("삭제완료.");
			}
			else {
				sc.close();
				break;
			}			
			
		}
	
	}

}

 

<insert>

 

<update>

 

<delete>

 

 

 

 

profile

VISION HONG

@Jeff Hong

깃허브 블로그로 이전했습니다. https://visionhong.github.io/