https://intheham.tistory.com/40
JDBC 작성
1. 드라이버 로드. (api 사용하기 위해)
2. db에 커넥트 (로그인)
3. 실행하고 싶은 sql 작성
String sql = "insert into test values(?, ?)";
4. PreparedStatement 객체 생성 -- 자바에서 sql 문을 실행하려면 이를 처리할 객체 필요.
=> sql 문에 ? 사용시 매칭시켜줘야 함. => set타입(물음표 순서, 매칭할 값)
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, vo.getEmpId()); // 1번째 ?의 값
5. (읽기 작업)검색 & (쓰기 작업)추가/수정/삭제 ... 작업 실행
5-1. 쓰기(추가(insert)/수정(update)/삭제(delete)) => .executeUpdate(); -- 적용된 줄 수 반환. (1 or 0)
int num = pstmt.executeUpdate(); //sql 실행. 적용된 줄 수 반환.
5-2. 읽기(검색(select))
=> .executeQuery(); -- 검색한 결과를 ResultSet 객체에 담아서 반환. (표)
---> ResultSet에서 데이터를 한 줄 씩 꺼내서 처리.
=> rs.next() -- 다음줄로 이동. 이동한 줄에 데이터 있으면 true, 없으면 false 반환.
=> rs.get타입(컬럼순서) -- 컬럼 값 꺼냄.
ResultSet rs = pstmt.executeQuery();
// 한 줄 검색: primary key로 검색
if(rs.next()) { // 첫 줄(다음줄)로 감. 있으면 true, 실행됨.
// 각 컬럼 값 꺼내서 vo에 담는다. -- rs.get타입(컬럼순서): 값 꺼내는 메소드
String writer = rs.getString(1);
int num = rs.getInt(2);
return new Vo(writer, num);
}
return null;
// 여러 줄 검색
ArrayList<vo> list = neww ArrayList<>();
while(rs.next()){ // 데이터가 있는 동안 반복
String writer = rs.getString(1);
int num = rs.getInt(2);
Vo v = new Vo(writer, num);
list.add(v);
// list.add(new Vo(writer, num));
}
return list;
6. conn 닫기.
conn.close(); //db 연결 끊음
적용 예시@
▼ DB 싱글톤 클래스
package conn;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//싱글톤
public class DBConnect {
private static DBConnect dbconn = new DBConnect();
// @db서버주소:리스너번호/sid
private String url = "jdbc:oracle:thin:@localhost:1521/xe";
private DBConnect() {}
public static DBConnect getInstance() {
return dbconn; // 모든 db작업을 이 conn 객체로 실행
}
public Connection conn() {
try {
//드라이버 로드
Class.forName("oracle.jdbc.OracleDriver");
//세션수립 (로그인)
return DriverManager.getConnection(url, "hr", "hr");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
-------------------------------------
▼ VO
package emp;
import java.sql.Date;
public class EmpVo {
private int empId;
private String name;
private int salary;
private Date hireDate; // sql.Date로 import
private int deptId;
public EmpVo() {
}
public EmpVo(int empId, String name, int salary, Date hireDate, int deptId) {
this.empId = empId;
this.name = name;
this.salary = salary;
this.hireDate = hireDate;
this.deptId = deptId;
}
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
@Override
public String toString() {
return "EmpVo [empId=" + empId + ", name=" + name + ", salary=" + salary + ", hireDate=" + hireDate
+ ", deptId=" + deptId + "]";
}
}
-------------------------------------
▼ DAO - select, insert, update, delete
package emp;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import conn.DBConnect;
//dao: databases access object. db 작업 구현.
public class EmpDao {
private DBConnect dbconn;
public EmpDao() {
dbconn = DBConnect.getInstance(); // 객체 외부 호출
}
// primary Key로 하나 검색. 사번으로 한 사람 검색해서 vo를 반환
public EmpVo select(int empId) {
Connection conn = dbconn.conn();
EmpVo vo = null;
String sql = "select * from emp where emp_id = ?";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, empId);; // 검색할 값 담은변수 생성
// select문 실행 메서드. 검색결과를 ResultSet에 담아서 반환.
ResultSet rs = pstmt.executeQuery();
if(rs.next()) { // rs.next() 의 반환값이 true 이면 이동한 줄에 읽을 데이터가 있다는 의미
// 이동한 줄의 각 컬럼 값을 변수에 올림.
int num = rs.getInt(1); // 1번 컬럼(emp_id: 숫자타입)값을 변수 num에 저장
String name = rs.getString(2); // 2번 컬럼에 문자열 값을 읽어서 변수 name에 저장
int salary = rs.getInt(3);
Date hire_date = rs.getDate(4);
int dep_id = rs.getInt(5);
vo = new EmpVo(num, name, salary, hire_date, dep_id);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return vo;
}
// emp 테이블에 한 줄 추가
public void insert(EmpVo vo) {
// 모든 db 작업은 Connection 객체로 실행
Connection conn = dbconn.conn(); // 드라이버 로드 + 로그인
// ?는 변수 값이 들어갈 위치
String sql = "insert into emp values(?, ?, ?, sysdate, ?)";
try {
// sql 문을 실행할 PreparedStatement 객체 생성
PreparedStatement pstmt = conn.prepareStatement(sql);
// ?에 들어갈 값 매칭
pstmt.setInt(1, vo.getEmpId()); // 매칭 메서드: set타입(물음표순서, 매칭할 값)
pstmt.setString(2, vo.getName());
pstmt.setInt(3, vo.getSalary());
pstmt.setInt(4, vo.getDeptId()); // 물음표만 카운팅.
int num = pstmt.executeUpdate(); // db에 추가된 줄 수 (insert는 보통 1)
System.out.println(num + " 줄이 추가되었습니다.");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally { // 정상/비정상으로 실행되더라도 꼭 실행됨.
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 사번으로 검색해서 salary와 dept_id를 새 값으로 변경하는 메소드.
public void update(EmpVo vo) {
// 1. 드라이버 로드 및 커넥션 수립
Connection conn = dbconn.conn();
// 2. 실행할 sql 문 작성
String sql = "update emp set salary = ?, dept_id = ? where emp_id = ?";
try {
// 3. sql 문 실행할 PreparedStatement 객체 생성
PreparedStatement pstmt = conn.prepareStatement(sql);
// 4. ?에 들어갈 값 매칭
pstmt.setInt(1, vo.getSalary());
pstmt.setInt(2, vo.getDeptId());
pstmt.setInt(3, vo.getEmpId());
// 5. sql 실행 (insert, update, delete문 실행 메서드 => .executeUpdate();)
int num = pstmt.executeUpdate();
System.out.println(num + " 줄이 수정되었습니다.");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
// 6. db 연결 끊기
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 사번 기준으로 삭제.
public void delete (int empId) {
Connection conn = dbconn.conn();
String sql = "delete emp where emp_id = ?";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, empId);
int num = pstmt.executeUpdate();
System.out.println(num + " 줄이 삭제되었습니다.");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
-------------------------------------
▼ Main
package emp;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
EmpDao dao = new EmpDao(); //dao 객체 생성
dao.insert(new EmpVo(2, "bbb", 2000, null, 10));
// 2번 사람의 salary를 3000, 부서를 50으로 변경
dao.update(new EmpVo(2, "", 3000, null, 50));
dao.delete(2);
EmpVo vo = dao.select(1);
if (vo == null) {
System.out.println("없는 사번");
} else {
System.out.println(vo);
}
vo = dao.select(10);
if (vo == null) {
System.out.println("없는 사번");
} else {
System.out.println(vo);
}
}
}
-------------------------------------