JAVA에서 DB에 접근해 내용을 불러오거나 수정하기 위해 JDBC를 이용한다.
- JDBC 설치 방법 : https://sallykim5087.tistory.com/105
DB에 있는 내용을 3개의 Frame에 출력한다고 가정해보자. 만약 각각의 프레임에서 직접 DB로 접근한다면 어떨까?
아마 처음에는 문제 없이 사용을하다가 추후, 유지보수시 수정해야할 코드가 있다면 코드가 작성되어 있는 3개의 프래임 각각의 소스 코드를 변경해주어야하는 번거로운 일이 발생한다.
따라서 유지 보수성의 향상을 위해 Frame에서 DAO(Data Access Object) 클래스에 접근하여 수정하거나 불러올 내용을 갖고 오도록 요청 하고 실제 DB에 접근하는 것은 DAO클래스에서 진행한다.
DAO 클래스 뿐만 아니라 데이터를 변수에 담아 옮기는 역할을 하는 DTO(Data Transfer Object)클래스와 DB Connect 클래스가 DB 접속을 위해 유기적으로 연결된다. 아래에서 클래스의 구성과 사용법 등을 자세히 살펴보자
각각의 클래스의 field에 필요한 값을 저장해 놓고, 다른 클래스에서 해당 값을 사용할때는 getter setter 메소드를 이용해서 메소드로 값을 수정하거나 호출 하는 방식을 사용한다.
DB Connect
DBConnect 클래스에서는 주로 '드라이버 로딩'과 '드라이버 연결' 작업을 수행한다.
DBConnect 클래스는
- Connection 객체의 참조값이 저장되는 필드,
- 드라이버로딩 후 DB에 접속하는 생성자,
- 호출시 Connection 객체의 참조값을 리턴하는 메소드
로 구성된다.
public class DBConnect {
//필드
private Connection conn;
//생성자
public DBConnect() {
try {
//드라이버로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//접속할 DB정보
String url="jdbc:oracle:thin:@localhost:1521:xe"; //@localhost:1521:xe - localhost : IP주소 / 1521:port 번호 / xe: Oracle database client의 고유한 service name이다.
//접속하고 Connection 객체의 참조값 얻어오기(DB 연동의 핵심 객체)
conn=DriverManager.getConnection(url, "scott", "tiger"); //getConnection(url, "계정아이디", "계정비번")
System.out.println("oracle DB 접속성공");
}catch (Exception e) {
e.printStackTrace();
}
}
//메소드
public Connection getConn() {
return conn;
}
}
[코드]
드라이버 로딩
Class.forName("연결하려는 드라이버 명");
- 드라이버로딩. 어떤 DB를 사용할지 선택
- Oracle : oracle.jdbc.driver.OracleDriver
- 주로 생성자에 구현한다.
연결
Connection conn=DriverManager.getConnection(url, "ID", "PW");
- 사용하고자 하는 DB에 ID/PW로 접속할 핵심 객체
- 생성자에서 구현하거나 필요할때마다 연결한다.
- Oracle : jdbc:oracle:thin:@localhost:1521:xe
DAO
- DAO(Data Access Object) 클래스에서는 insert, update, delete, select 작업 수행할 메소드로 구성된다.
INSERT, UPDATE, DELETE문
INSET, UPDATE, DELETE 문을 수행할때는 거의 동일한
INSERT문으로 DB에 data를 추가하는 문장을 통해 DAO 클래스의 메소드가 어떻게 구성되는지 살펴 보자.
public boolean insert(int num,String name,String addr) {
Connection conn = null;
PreparedStatement pstmt=null;
int flag=0;
try {
//1. DB에 연결하고
conn=new DBConnect().getConn();
String sql="INSERT INTO member"
+ " (num,name,addr)"
+ " VALUES(?,?,?)";
//2. SQL문 준비
pstmt=conn.prepareStatement(sql);
//3. 준비된 SQL문의 물음표(?)마다 값 바인딩하기
pstmt.setInt(1, num);
pstmt.setString(2, name);
pstmt.setString(3, addr);
//4.DB에 DATA를 업데이트 한다.
flag=pstmt.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
//5. 사용한 객체를 닫아 준다.
if(conn!=null)conn.close();
if(pstmt!=null)pstmt.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}if(flag>0) {//성공
return true;
}else {//실패
return false;
}
}
- DB연결
DBConncet 객체를 생성해 DB에 접속하고 getConn() method를 호출하여 Connection 객체의 참조값을 지역변수에 저장한다. - SQL문(쿼리문) 준비
SQL문을 변수에 담아 준비한다.
Connection 객체의 참조값을 불러와 prepareStatement(쿼리문) 메소드를 호출하여 PreparedStatement 객체의 참조값을 지역변수에 저장한다. - 준비된 SQL문의 물음표 마다 값을 바인딩 한다.
setInt(n번째물음표, 정수);
setString(n번째물음표, 문자열);
4. DB에 DATA를 업데이트 한다.
executeUpdate()메소드를 호출하여 DB에 저장되어 있는 data를 수정한다.
자동 COMMIT; 된다.
//insert, update, delete를 수행한다.
// 변화된 row의 갯수를 리턴한다
executeUpdate();
5. 사용한 객체를 닫아 준다.
Finally 블럭에서 수행한다.
사용한 객체를 닫을때는 갖고 온 순서 역순으로 닫아 준다.
if(conn!=null)conn.close();
if(pstmt!=null)pstmt.close();
SELECT문
SELECT 문의 경우 다른 코드는 동일하게 사용하지만
DB에서 data를 출력하는 역할을 하기 때문에 몇가지 다른 메소드들이 사용된다.
executeQuery()메소드로 선택한 data의 결과를 ResultSet으로 받아야한다.
//SELECT문을 수행한다.
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
//ResultSet 객체에서 필요한 값 얻어내기
while (rs.next()) { //next() : select된 data의 row를 한 줄씩 읽어온다. 읽어올 row가 없다면 boolean을 리턴하고 반복문은 종료된다.
//data를 num,name,addr 객체에 담기
Int num=rs.getInt("num");
String name=rs.getString("name");
String addr=rs.getString("addr");
}
DTO
DTO(Data Transfer Object) 객체는
- 데이터를 저장할 필드,
- 모든 필드의 값을 생성자의 인자로 전달 받는 생성자,
- 각 필드에 참조값을 넣고 불러올 getter, setter 메서드
getter, setter 메서드란?
제어자(modifier) 참고 : https://sallykim5087.tistory.com/95
로 구성된다.
- DTO의 필드는 DB의 테이블과 항상 1:1 대응하는 것은 아니다.
DB에서 다른 필드와 JOIN 등의 작업을 하는 경우 다른 테이블의 값을 DTO에 저장해야할 수 있다. - DTO 필드의 이름은 반드시 DB 테이블의 컬럼 명과 일치하지 않아도 된다.
public class MemberDto {
//데이터를 저장할 필드를 private 선언
private int num;
private String name;
private String addr;
//디폴트 생성자
public MemberDto() {}
//모든 필드의 값을 생성자의 인자로 전달 받는 생성자 generate!
public MemberDto(int num, String name, String addr) {
super();
this.num = num;
this.name = name;
this.addr = addr;
}
//(마우스 오른쪽-Source-generate getter setter)
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
'JAVA' 카테고리의 다른 글
JDK / JRE / JVM / JAVA SE,EE / IDE란? (0) | 2020.04.15 |
---|---|
Static 키워드를 사용해야하는 이유 (0) | 2020.04.15 |
JAVA Template 등록하기 (0) | 2019.12.21 |
JDBC / JAVA 와 DB 연결 / CONNECTION (0) | 2019.12.18 |
JSON 라이브러리 (0) | 2019.12.18 |