database 서버 접속 객체
연결객체(Connection), 대화객체(Statement, PreparedStatement), 결과값(ResultSet), 자원해제(.close()), 예외처리(try{} catch(SQLException){})
전역변수로 핵심 객체를 선언
private Connection con;
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
기능별 메서드 선언
public void setConnection(){} - DB연결을 위한 기본 기능메서드
==> DB.con(), DB.close(rs, pstmt, stmt, con);
접속과 자원해제를 따로 객체로 만들어서 처리.
// 각 기능 메서드 선언
(sql문 작성 ==> select(리턴값), where, sql에 입력 데이터(매개변수)==> vo클래스선언)
// 사원정보조회(다중행)
public List<Emp> getEmpList(Emp sch){}
// 사원정보조회(단일행)
public Emp getEmp(int empno){}
// 사원정보 입력
public void insertEmp(Emp insert){}
// 사원정보 수정
public void updateEmp(Emp update){}
// 사원정보 삭제
public void deleteEmp(int empno){}
==> 프로젝트
==> DB.con(), DB.close(rs, pstmt, stmt, con);
@@@Dao.java => 업무별로 만들어서 조회(다중), 조회(단일), 수정, 삭제
업무별 : 회원관리 memeber라는 테이블로 진행 =>(로그인/회원가입/회원리스트)
제품관리 product =>(물건리스트, 물건등록, 수정, 삭제)
구매 및 배송 product/member =>(물건리스트, 구매리스트, 장바구니담기 및 리스트 배송)
필요한 기본 객체
1) jdbc 드라이버 프로그램 path 잡기
- 각 DB서버 회사에서 데이터베이스 연결 및 처리 관련 공통부분을 java로 만들어
클래스로 압축한 내용을 가지고 있다.
현재 프로젝트에서 진행할 수 있도록 classPath 추가설정
2) class.forName("메인클래스")를 통해서 메모리에 로딩
ex) Class.forName("oracle.jdbc.driver.OracleDriver");
필수 예외 처리
1) Class.forName() : 컴파일예외 처리
연결할 때 1번만 필요하기 때문에 직접적으로 바로 예외 처리
2) DriverManager.getConnection(info, "scott","tiger");
연결정보 SQLException : 컴파일 예외 처리, throws로 예외를 위임처리
연결 객체 처리 프로세스
1) 연관관계 객체
드라이버 메모리로딩 ==> 특정서버에 접속 DriverManager ==>
연결객체 Connection ==> 서버와 대화(sql구문으로) Statement ==>
case1 등록/수정/삭제 ==> 서버에 데이터를 처리 ==> commit, rollback
case2 조회(select) ==> 서버에서 sql 결과를 ResultSet 통해 전달
ResultSet : next() - 행 단위로 이동처리
getXXX("컬럼명") - 열 단위에 데이터 유형에 맞게 접근
char/varchar2() ==> getString
number ==> getInt / getDouble
date ===> getDate
while(rs.next()){## 데이터가 마지막행까지 행 단위로 이동
rs.getInt("empno") : 각 행의 empno컬럼의 데이터를 정수형으로 가져온다
rs.getString("ename")
rs.getDate("hiredate")
}
==> 자원해제 및 예외처리
만들어진 단계별 객체.close() 메모리해제
필수예외에 대한 내용을 try{}catch(SQLException e){} 예외처리
1) sql 만들어서 실행
SELECT * FROM emp01
WHERE ename LIKE '%'||'A'||'%' AND job LIKE '%'||'ER'||'%';
2) sql 안에 조건으로 넘길 데이터 유형과 이름 정리
ename, job
==> String ename, String job
3) 기능 메서드에 매개변수 타입 결정
case1 데이터유형으로 선언 : schEmp(String ename, String job)
case2 객체로 선언 : -vo 객체로 생성(ename, job 포함)
schEmp(Emp sch)
4) 문자열 sql에 동적 문자열로 선언처리
- 데이터 유형으로 선언
String sql = "SELECT * "+"FROM emp01"+
"WHERE ename LIKE '%'||'"+ename+"'||'%'"+
"AND job LIKE '%'||'"+job+"'||'%'";
- 객체 유형으로 선언
String sql = "SELECT * "+"FROM emp01"+
"WHERE ename LIKE '%'||'"+sch.getEname()+"'||'%'"+
"AND job LIKE '%'||'"+sc.getJob()+"'||'%'";
==> ProparedStatement
String sql = "SELECT * "+"FROM emp01"+
"WHERE ename LIKE '%'||?||'%'"+
"AND job LIKE '%'||?||'%'";
pstmt.setString(1, sch.getEname());
pstmt.setString(2, sch.getJob());
1. sql 작성
1) 매개변수로 조건처리할 데이터 확인
==> ename, job ==> VO로 ename, job 필드 선언, 객체
2) 리턴값으로 리턴 List의 단위 데이터 확인
String sql = "SELECT * "+"FROM emp01"+
"WHERE ename LIKE '%'||'"+sch.getEname()+"'||'%'"+
"AND job LIKE '%'||'"+sc.getJob()+"'||'%'";
select * ==> 통해서 나올 데이터를 단위로 객체 선언
empno, ename, job, mgr, hiredate, sal, comm, deptno
2. VO 만들기
==> 저장할 수 있는 단위 VO 객체 선언 ==> ArrayList<VO>
생성자로 전체 데이터를 가져오는 생성자1
생성자로 조회 조건 가져오는 생성자2
class Emp{
private int empno;
private String ename;
private String job;
private int mgr;
private Date hiredate;
private double sal;
private double comm;
private int deptno;
}
3. List 메서드 초기에 선언하고 while()를 통해서 객체를 하나씩 생성해서 추가하기
리턴한 기능메서드와 매개변수 처리할 내용 선언
// Emp sch : 조건으로 처리할 데이터
// public List<Emp> : select로 처리할 데이터 리스트화
public List<Emp> getEmpListSch(Emp sch){
List<Emp> list = new ArrayList<Emp>();
return list;
}
4. ResultSet 객체를 통해서 데이터를 가져와서 list에 while문을 통해서 할당
while(rs.next()){
list.add(new Emp(rs.getInt("empno"), rs.getString("ename"),..)
}
System.out.pirntln("데이터건수:"+list.size());
5. 호출하는 곳에서 향상된 for문으로 처리
for(Emp emp; dao.getEmpListSch(new Emp("","")){
System.out.print(emp.getEmpno());
}
1) 복사테이블 만들기
create table emp100 as select * from emp;
alter table emp100 modify(
empno number(4) primary key,
job varchar2(50),
ename varchar2(50)
);
sequence 만들기(primary key 설정)
create sequence emp100_seq
increment by 1
start with 1000
minvalue 1000
maxvalue 9999;
2) sql 작성
insert into emp100 values(emp100_seq.nextval,'홍길동','사원',7800,
to_date('2022/01/01','YYYY/MM/DD'), 3500, 100, 10);
3) 입력내용을 기준으로 vo 작성
private int empno;
private String ename;
private String job;
private int mgr;
private String hiredateS;
private double sal;
private double comm;
private int deptno;
4) 메서드 선언
public void insert(Emp ins){
}
5) 주요 내용
Connection 객체의 autocommit ==> false
Statement 객체의 executeUpdate(sql)
ResultSet 객체 삭제(사용하지 않음 == while() 사용 안함)
Connection 객체의 commit(), 예외 처리 내용을 rollback()```