DTO 는 데이터 트랜스퍼 오브젝트 data transfer object 이고
DAO 는 데이터 액세스 오브젝트 data access object 이다.
db 에 있는 TBL_MEMBER 테이블에서 데이터를 얻어오거나 데이터를 변경하도록 만들어주는 객체들
(그래서 이름이 MEMBER ~~~이다)
/*==============
MemberDTO.java
* ============*/
package com.test;
public class MemberDTO
{
// 주요 속성 구성
private int sid;
private String name, tel;
//getter/setter 구성
public int getSid()
{
return sid;
}
public void setSid(int sid)
{
this.sid = sid;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getTel()
{
return tel;
}
public void setTel(String tel)
{
this.tel = tel;
}
}
getter setter 는 마우스오른쪽버튼 >> source >> generate getters and setters 선택하면 자동으로 만들어짐
private 정보은닉으로 선언해둔 주요 변수들에 접근하기 위한 게터와 세터
package com.test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import com.util.DBconn;
public class MemberDAO
{
// 주요 변수 선언 → DB 연결 객체
private Connection conn;
// 생성자 정의
public MemberDAO() throws ClassNotFoundException, SQLException
{
conn = DBconn.getConnection();
}
// 메소드 정의 → 데이터를 입력하는 기능 → insert
public int add(MemberDTO dto) throws SQLException
{
// 반환할 결과값을 담아낼 변수(적용된 행의 갯수)
int result =0;
// 작업 객체 생성
Statement stmt = conn.createStatement();
// ※ Statement 종류는 세 가지이다. 하나는 우리가 쓰고 있는 Statement, PreparedStatement, CallableStatement 할아버지 아버지 손자이다.
// 할아버지인 Statement 는 하나의 쿼리를 사용하고 나면 더 이상 사용할 수 없다. 쓰고버리고 쓰고 버리면 리소스를 효율적으로 사용할 수 없고 보안성이 낮아요 즉 작업객체가 입구 내부를 왔다갔다하면서
// 도둑놈들을 잡을 수 없는 구조이다. 중간에서 절도를 하게 되면 이 금광을 실어나르면 수레를 약탈당할수도 , 보안향상해서 Prepared 전처리?를 하다보니 쿼리를 끼워서 보내다보니까 헤커들의 악의공격에 대비
// 즉, 하나의 Prepared 로 쿼리를 여러번 처리할 수 있다. Callable 은 개발자들이 사용하는 빈도는 적지만 자바에서 오라클 단에서 생성된 함수나 프로시저 등을 호출하는 statement이다.
//
// 수레..그릇 으로 이해하자 머리속으로그림을 그릴수있으면 좋다 Statement Statement Statement 는 일회용그릇, Prepared 는 집에서 쓰는 설거지해서 쓰는 그릇,
// ※ Statement 의 의미
// 자바에서 사용되는 3가지 종류의 작업 객체들은 데이터베이스로 쿼리를 담아서 보내는 그릇정도로 생가하자.
// 즉, 작업 객체에 쿼리를 실어 데이터베이스로 보내버리면 그 내용이 데이터베이스에서 처리되는 것이다.
// 이 때, 한 번 사용하고 버리는 그릇은 Statement 이며 ,재 사용이 가능한 그릇은 Prepared 이다.
// 쿼리문 준비
String sql = String.format("INSERT INTO TBL_MEMBER(SID,NAME,TEL) VALUES (MEMBERSEQ.NEXTVAL,'%s','%s')",dto.getName(),dto.getTel()) ;
// 작업 객체를 활용하여 쿼리문 오라클에 전달
result = stmt.executeUpdate(sql);
// 리소스 반납
stmt.close();
// 최종 결과값 반환
return result;
}
// 메소드 정의 → 전체 인원 수 확인 기능 → select(count)
public int count() throws SQLException
{
// 결과값으로 반환하게 될 변수 선언 및 초기화
int result=0;
//작업 객체 생성
Statement stmt = conn.createStatement();
//쿼리문준비 select
String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBER";
// 쿼리문 실행
ResultSet rs = stmt.executeQuery(sql);
// ResultSet 처리 → 반복문 구성 → 결과값 수신
while (rs.next())
{
result = rs.getInt("COUNT"); // COUNT(*)로 하면 에러난다.
// rs.getInt(1) 로 해도된다 .컬럼인덱스 첫번째 컬럼이라는 뜻
}
//리소스 반납
rs.close();
stmt.close();
//최종 결과값반환
return result;
}
// 메소드 정의 → 전체 리스트 조회 기능 → select
public ArrayList<MemberDTO> list() throws SQLException
{
// 결과값으로 반환하게 될 변수 선언 및 초기화
ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();
//MemberDTO mDTO = new MemberDTO();(while문 안으로 넣었다)
// 작업 객체 생성
Statement stmt = conn.createStatement();
// 쿼리문 준비
String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID";
// 쿼리문 실행
ResultSet rs = stmt.executeQuery(sql);
// ResultSet 처리 반복문을 통해 결과값 수신
while (rs.next()) //(다음 값이 있는지 없는지 확인)
{
MemberDTO mDTO = new MemberDTO();
int sid = rs.getInt("SID");
String name = rs.getString("NAME");
String tel = rs.getString("TEL");
mDTO.setSid(sid); //mDTO.setSid(rs.getString("SID"); 이렇게 해도 된다.
mDTO.setName(name);
mDTO.setTel(tel);
result.add(mDTO);
}
// 위에서 쓴 리소스 반납(resultset, stmt)
rs.close();
stmt.close();
// 최종 결과값 반환
return result;
}
}
ㅈ업객체 statement 를 생성한 후 쿼리문을 executeUpdate 또는 executeQuery 로 실행한 후
결과값을 반환받고 그 결과값들을 return 해주던지, ResultSet 이라면 향상된 for문(for each)문을 통해
출력을 하거나 마지막 메소드처럼 그 값들을 ArrayList에 담아주고 return 해주면 된다.
'📚Study Note > JDBC' 카테고리의 다른 글
[ JDBC ] getConnection() │ Connection.close() (0) | 2021.04.22 |
---|