JDBC란 ?
JDBC(Java DataBase Connectivity)는 데이터베이스에 연결 및 작업을 하기 위한 자바 표준 인터페이스 이다. 자바는 DBMS(Oracle, MySQL, MongoDB 등)의 종류에 상관 없이 하나의 JDBC API를 이용해서 데이터베이스 작업을 처리한다. 이 JDBC는 DB에 접근해서 CRUD를 쉽고 효율적이게 할 수 있게 하고, 고성능에서의 세련된 메소드를 제공하며 쉽게 프로그래밍 할 수 있게 도와준다.
# JDBC가 생긴 이유
- JDBC API가 없던 때에는 데이터베이스의 종류 마다(ms-sql, my-sql, oracle ..) 각각의 SQL문을 사용
- 그 결과 DB의 종류에 따라 SQL문의 작성 방법이 너무나 차이가 나서 구현이 불편함.
- 그래서 메서드나 전역변수 등을 통합하는 문법으로 통일시킴. 그것이 JDBC
# 역할
- Java 코드에서 DB서버에 접속
- SQL문을 구성하고 DB서버에서 실행
- DB서버에서 처리한 결과를 가져오기
- DB의 정보를 가져오기
JDBC는 위와 같은 역할을 수행한다. 이런 기능들을 수행하기 위해 자바에서 다양한 인터페이스들을 제공한다.
제일 셋팅해줘야할게 DB와 자바를 연결해주는 코드가 있어야한다.
1. DAO(인터페이스) 또는 Service라고도 부른다. 데이터를 가공하기위해 제일 먼저 만들어준다. 어떤기능을 구현을 할 것인지!!!
DTO와 동시에 작업을 해줘도 될 만큼 DTO도 미리 준비 해두는게 좋다
2. 두번째로 DTO를 만들어준다.
DTO란 : DTO(Data Transfer Object, 데이터 전송 객체)는 프로세스 간에 데이터를 전달하는 객체이다.
Data : @Getter, @Setter, @ToString, @EqualsAndHashCode를 한꺼번에 설정해주는 매우 유용한 어노테이션이다.
@RequiredArgsConstructor : final 혹은 @NotNull이 붙은 필드의 생성자를 자동으로 만들어준다. 이를 통해 새로운 필드를 추가할 때 다시 생성자를 만들거나 하는 등의 번거로움을 없앨 수 있다. 하지만 자동적으로 생성자가 만들어지기 때문에 내가 예상하지 못한 결과나 오류가 발생할 수 있기 때문에 그런 점도 염두해둬야 한다.
DAO인터페이스를 만든걸 이제 쿼리문을 써서 DB에 데이터를 넣어주는 기능을 만들어줘야한다.
인터페이스 DAO를 구현을해서 아래와 같은 CRUD기능 코드를 작성해주면 된다.
package db_connect.ch01;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
public class MemberInfoSqlDao implements IMemberInfoDao {
private static final String TABLE_NAME = "memberTBL";
private DBClient client; // 데이터베이스 셋팅
private Connection connection; // 데이터베이스와 연결하는 객체입니다
public MemberInfoSqlDao() {
client = DBClient.getInstance();
// connection = client.getconnection();
}
// executeQuery
// executeUpdate
@Override
public ArrayList<MemberDto> selectAll() {
// 전체 select 하는 쿼리 코드 작성
// 연결해서 쿼리날리고 결과 받고 해제
connection = client.getConnection(); // 셋팅된 DB를 연결해줌
ArrayList<MemberDto> resultData = new ArrayList<>(); // 전체 조회이므로 여러개의 데이터를 ArrayList에 담아준다.
String sqlFormat = "SELECT * FROM %s"; // 쿼리문
String sql = String.format(sqlFormat, TABLE_NAME);
Statement stmt = null;
ResultSet rs = null;
try {
stmt = connection.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
MemberDto dto = new MemberDto();
dto.setMemberId(rs.getString(1));
dto.setMemberName(rs.getString(2));
dto.setMemberAddress(rs.getString(3));
resultData.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
closeDb(stmt);
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultData;
}
// memberID select 하는 쿼리 코드 작성
@Override
public MemberDto select(String memberId) {
connection = client.getConnection();
MemberDto dto = null;
// 쿼리문 생성
// 결과
String sqlFormat;
String sql;
sqlFormat = "SELECT * FROM %s WHERE memberId = '%s' ";
sql = String.format(sqlFormat, TABLE_NAME, memberId);
// SQL 구문 객체를 만들어 주어야 한다.
Statement stmt = null;
// 결과를 받을 수 있는 객체를 만들어 주어야 한다.
ResultSet rs = null;
try {
stmt = connection.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
dto = new MemberDto();
dto.setMemberId(rs.getString("memberId"));
dto.setMemberName(rs.getString("memberName"));
dto.setMemberAddress(rs.getString("memberAddress"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (stmt != null) {
try {
closeDb(stmt);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return dto;
}
private void closeDb(Statement stmt) throws SQLException {
stmt.close();
connection.close();
DBClient.connectClose();
}
@Override
public int insert(MemberDto dto) {
connection = client.getConnection();
// MemberDto를 넘겨 받아 db 저장하는 기능 구현
String sqlFormat = "insert into %s values('%s', '%s', '%s')";
String sql = String.format(sqlFormat, TABLE_NAME, dto.getMemberId(), dto.getMemberName(),
dto.getMemberAddress());
Statement stmt = null;
int result = 0;
try {
stmt = connection.createStatement();
result = stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
closeDb(stmt);
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
@Override
// MemberDto를 넘겨 받아 db 수정하는 기능 구현
public int update(MemberDto dto) {
// memberDto를 넘겨 받아 db에 수정하는 기능 구현
// 선행 검사 - 업데이트를 할 땐 먼저 select 해서 확인 이후에 데이터를 변경해 주는 것이 좋다.
MemberDto contextDto = select(dto.getMemberId());
Statement stmt = null;
int result = 0;
connection = client.getConnection();
if (contextDto != null) {
String sqlFormat = "update %s set memberName = '%s' where memberId = '%s' ";
String sql = String.format(sqlFormat, TABLE_NAME, dto.getMemberName(), dto.getMemberId());
try {
stmt = connection.createStatement();
result = stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
closeDb(stmt);
} catch (SQLException e) {
e.printStackTrace();
}
}
} else {
System.out.println("해당 하는 레코드가 존재하지 않습니다.");
}
return result;
}
@Override
public int delecte(String memberId) {
// MemberId를 넘겨 받아 삭제 하는 기능 구현
connection = client.getConnection();
String sqlFormat = "DELETE FROM %s WHERE memberId = '%s' ";
String sql = String.format(sqlFormat, TABLE_NAME, memberId);
// result Type int 값을 반환 : 삭제한 행의 갯수를 반환 하는 녀석
int result = 0;
Statement stmt = null;
try {
stmt = connection.createStatement();
// executeUpdate -- 매개변수 String 하나를 전달하는 녀석
result = stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
closeDb(stmt);
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
}
'개발일지 > Database' 카테고리의 다른 글
블로그 DB 시나리오 (0) | 2022.10.19 |
---|---|
CASCADE (0) | 2022.10.19 |
Class for Class (0) | 2022.10.18 |
JAVA와 MySQL(DB) 연결하기 (0) | 2022.10.18 |
BETWEEN 사용법 (0) | 2022.10.13 |
댓글