JDBC는 자바에서 데이터베이스로 접속할 수 있도록 하는 자바 API
JDBC 연습용 Table : 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;
}
}
}
}