코딩 노트
데이터베이스6 - 모듈화 본문
JDBC - 삭제(Delete)
- 삭제 구문 ▶ delete 테이블 조건 = ?
// 포켓몬스터 정보 삭제 프로그램
//delete pocketmon no = ?
//데이터
int no = 5;
//DB처리
String sql = "delete pocketmon where no =?";
Object[] data = {no};
JdbcTemplate jdbcTemplate = jdbcUtils.getJdbcTemplate();
int result = jdbcTemplate.update(sql, data);
System.out.println("result = " + result);
JDBC 도우미 클래스 만들기
- 클래스 이름에 s가 붙으면 도우미 클래스를 뜻한다.
- JDBC의 연결작업을 쉽게 처리할 수 있도록 도와주는 도우미 클래스이다.
- 매번 만들던 JDBC 도구를 클래스로 만드는 것
public class jdbcUtils {
//연결 정보를 상수로 저장
public static final String driver = "oracle.jdbc.OracleDriver";
public static final String url = "jdbc:oracle:thin:@localhost:1521:xe";
public static final String username = "C##KH";
public static final String password = "KH";
//실행도구 생성 메소드
public static JdbcTemplate getJdbcTemplate() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate;
}
}
JDBC - 조회(Select)
- 테이블을 조회한 결과를 결과집합(ResultSet)이라고 한다.
- 두 가지 준비물이 필요하다.
- 첫 번째는 조회 결과 중 한 줄을 담을 객체(DTO)
- 두 번째는 조회 결과를 DTO에 옮겨 담는 방법을 가진 객체(Mapper)
//기본 조회는 홀더(?)가 없다. 그러므로 미리 준비해놓을 데이터가 없다. (ex. Object[] data = {};)
String sql = "select * from pocketmon order by no asc"; //기왕이면 정렬
PocketmonMapper mapper = new PocketmonMapper();
JdbcTemplate jdbcTemplate = jdbcUtils.getJdbcTemplate();
List<PocketmonDto> list = jdbcTemplate.query(sql, mapper);
System.out.println("조회 결과: " + list.size());
//리스트는 반복문 가능
for(PocketmonDto dto : list) {
System.out.println(dto);
}
DTO 클래스
- 멤버 필드, 기본 생성자, setter/getter 메소드, toString
- 데이터베이스의 한 줄을 그대로 옮겨담기 위한 자바 Wrapper(포장) 클래스이다.
- 하나의 객체 정보이고 테이블 당 최소 한 개가 있어야 한다.
- Data Transfer Object. 데이터 변환용 객체(포장 상자)이다.
- 필드는 데이터베이스의 컬럼과 동일하게 작성한다.
- 기본 생성자와 setter/getter 메소드를 추가한다.
- toString() 재정의를 한다.
public class PocketmonDto {
//필드는 데이터베이스의 컬럼과 동일하게 작성
private int no;
private String name;
private String type;
//기본 생성자와 setter/getter 메소드를 추가, toString() 재정의
public PocketmonDto() {
super();
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "PocketmonDto [no=" + no + ", name=" + name + ", type=" + type + "]";
}
}
(Q1) 게시판(Board) 테이블 DTO 클래스
public class BoardDto {
private int boardNo;
private String boardTitle;
private String boardContent;
private String boardWriter;
private int boardReadcount;
public BoardDto() {
super();
}
public int getBoardNo() {
return boardNo;
}
public void setBoardNo(int boardNo) {
this.boardNo = boardNo;
}
public String getBoardTitle() {
return boardTitle;
}
public void setBoardTitle(String boardTitle) {
this.boardTitle = boardTitle;
}
public String getBoardContent() {
return boardContent;
}
public void setBoardContent(String boardContent) {
this.boardContent = boardContent;
}
public String getBoardWriter() {
return boardWriter;
}
public void setBoardWriter(String boardWriter) {
this.boardWriter = boardWriter;
}
public int getBoardReadcount() {
return boardReadcount;
}
public void setBoardReadcount(int boardReadcount) {
this.boardReadcount = boardReadcount;
}
@Override
public String toString() {
return "BoardDto [boardNo=" + boardNo + ", boardTitle=" + boardTitle + ", boardContent=" + boardContent
+ ", boardWriter=" + boardWriter + ", boardReadcount=" + boardReadcount + "]";
}
Mapper 클래스
- 테이블의 조회 결과를 DTO로 옮기는 방법을 적은 객체이다.
- Select에서만 필요하며 테이블 당 최소 1개 이상이 필요하다.
- Spring JDBC에서 제공받은 RowMapper 클래스를 상속 받아서 Mapper를 이용하여 자동변환을 수행한다.
- 데이터베이스 조회결과(ResultSet)를 어떻게 PoketmonDto에 넣어야 하는지 알려주기 위한 클래스이다.
- 1대 1로 변환 시켜주는 것이다.
- ex. 어디에 있는 걸 어디에 담아라...
public class PocketmonMapper implements RowMapper<PocketmonDto>{
//변환 메소드
//- ResultSet은 데이터베이스에서 조회된 결과물을 의미
//- idx는 현재 변환 중인 회차를 의미
@Override
public PocketmonDto mapRow(ResultSet rs, int idx) throws SQLException {
PocketmonDto dto = new PocketmonDto();
// dto.setNo(rs의 no 컬럼에 있는 값;
dto.setNo(rs.getInt("no"));
// dto,setName(rs의 name 컬럼에 있는 값);
dto.setName(rs.getString("name")); //name에 있는 것을 String 형태로 꺼내서 넣어라
// dto.setType(rs의 type 컬럼에 있는 값);
dto.setType(rs.getString("type"));
return dto;
}
}
(Q1) 게시판(Board) Mapper 클래스
public class BoardMapper implements RowMapper<BoardDto> {
@Override
public BoardDto mapRow(ResultSet rs, int idx) throws SQLException {
BoardDto dto = new BoardDto();
dto.setBoardNo(rs.getInt("board_no"));
dto.setBoardTitle(rs.getString("board_title"));
dto.setBoardContent(rs.getString("board_content"));
dto.setBoardWriter(rs.getString("board_writer"));
dto.setBoardReadcount(rs.getInt("board_readcount"));
return dto;
}
(Q1) 게시판(Board) 테이블 정보 조회 후 출력
//게시판 테이블(Board) 정보 조회 후 출력
//- 준비물 : BoardDto, BoardMapper
//게시글은 나중에 쓴 게 먼저 나오기 때문에 desc
String sql = "select * from board order by board_no desc";
BoardMapper mapper = new BoardMapper();
JdbcTemplate jdbcTemplate = jdbcUtils.getJdbcTemplate();
List<BoardDto> list = jdbcTemplate.query(sql, mapper);
if(list.isEmpty()) {
//if(list.size() == 0) {
System.out.println("게시글이 존재하지 않습니다");
} else {
for(BoardDto dto : list) {
System.out.println(dto); //dto.toString()
//System.out.println(dto.getBoardTitle()); //제목만 찍겠다
}
}
+ 검색
//게시판 테이블 검색
//- 준비물 : BoardDto, BoardMapper
//게시글은 나중에 쓴 게 먼저 나오기 때문에 desc
String keyword = "테스트";
String sql = "select * from board "
+ "where instr(board_title, ?) > 0"
+ "order by board_no desc";
Object[] data = {keyword};
BoardMapper mapper = new BoardMapper();
JdbcTemplate jdbcTemplate = jdbcUtils.getJdbcTemplate();
List<BoardDto> list = jdbcTemplate.query(sql, mapper, data);
if(list.isEmpty()) {
//if(list.size() == 0) {
System.out.println("게시글이 존재하지 않습니다");
} else {
for(BoardDto dto : list) {
System.out.println(dto); //dto.toString()
//System.out.println(dto.getBoardTitle()); //제목만 찍겠다
}
}
(Q) 로그인 프로그램-
- SQL구문 : select * from member where member_id = ? (권장)
- SQL구문 : select * from member where member_id = ? and member_pw = ? (권장하지 않음)
- Primary key로 항목을 조회하는 것을 '단일조회'라고 한다.
- 모든 테이블은 단일 조회가 가능해야 한다.
- 단일 조회는 결과가 없거나 한 개이다.
//데이터
String memberId ="testuser1";
String memberPw = "Testuset1!";
//DB처리
String sql = "select * from member where member_id = ?";
Object[] data = {memberId};
MemberMapper mapper = new MemberMapper();
JdbcTemplate jdbcTemplate = JdbcUtils.getJdbcTemplate();
List<MemberDto> list = jdbcTemplate.query(sql, mapper, data);
//list.size() == 0 or 1 //왜? 조건이 애초에 primary key니까
// MemberDto dto;
// if(list.isEmpty()) {
// dto = null;
// } else {
// dto = list.get(0);
// }
MemberDto dto = list.isEmpty() ? null : list.get(0); //3항 연산자(if문 축소)
// System.out.println(dto);
// boolean isLogin = dto가 null이 아니면서 dto의 비밀번호와 사용자 비밀번호가 일치하는가?
//비밀번호를 자바에서 비교하도록 구현해야 한다.
boolean isLogin = dto != null && dto.getMemberPw().equals(memberPw);
System.out.println(isLogin);
모듈화(Java Beans 패턴)
- 'DAO'와 'DTO'를 이용하여 코드를 단순명료하게 바꾸는 개발방법론
DAO 클래스
- 데이터베이스 작업을 처리하기 위한 객체이다.
- Data Access Object. DB 담당 처리반
- 테이블 당 1개이다.
- 내가 뭔가를 주문했을 때 가지고 오는 게 목적(데이터 베이스를 접속하는)이다.
- 해당 테이블에 필요한 기능(주요 작업)들을 '메소드'로 구현한다.
- 기본적으로 C(등록), R(목록), R(상세), U(수정), D(삭제)가 필요하다.
- C/insert R/selectList R/selectOne U/update D/delete
그 외 기능은 자율적으로 이해하기 쉽게 작명한다.
public class PocketmonDao {
//C(등록) 메소드
public void insert(int no, String name, String type) {
String sql = "insert into pocketmon(no, name, type) "
+ "values(?, ?, ?)";
Object[] data = {no, name, type};
JdbcTemplate jdbcTemplate = JdbcUtils.getJdbcTemplate();
jdbcTemplate.update(sql, data);
}
//바람직한 형태의 등록 메소드
public void insert(PocketmonDto dto) {
String sql = "insert into pocketmon(no, name, type) "
+ "values(?, ?, ?)";
Object[] data = {dto.getNo(), dto.getName(), dto.getType()};
JdbcTemplate jdbcTemplate = JdbcUtils.getJdbcTemplate();
jdbcTemplate.update(sql, data);
}
}
포켓몬스터 등록 메인 클래스(이런 식으로 구현)
public static void main(String[] args) {
PocketmonDto dto = new PocketmonDto();
PocketmonDao dao = new PocketmonDao();
dao.insert(dto);
System.out.println("등록 완료!");
}
(Q) 도서 등록 프로그램 최종형태
public class Test03 {
public static void main(String[] args) {
//도서 등록 프로그램
//데이터 - DTO
BookDto dto = new BookDto();
dto.setBookTitle("Harry Potter 1");
dto.setBookAuthor("J.K. Rowling");
dto.setBookPublicationDate("2001-06-26");
dto.setBookPrice((float) 19.99);
dto.setBookPublisher("Scholastic");
dto.setBookPageCount(320);
dto.setBookGenre("Fantasy");
//DB처리
BookDao dao = new BookDao();
dao.insert(dto);
System.out.println("등록 완료");
}
}
public class BookDao {
public void insert(BookDto dto) {
String sql = "insert into book("
+ "book_id, book_title, book_author, book_publication_date, "
+ "book_price, book_publisher, book_page_count, "
+ "book_genre) values(book_seq.nextval, ?, ?, ?, ?, ?, ?, ?)";
Object[] data = {dto.getBookTitle(), dto.getBookAuthor(),
dto.getBookPublicationDate(), dto.getBookPrice(),
dto.getBookPublisher(), dto.getBookPageCount(),
dto.getBookGenre()};
JdbcTemplate jdbcTemplate = JdbcUtils.getJdbcTemplate();
jdbcTemplate.update(sql,data);
}
}
'Database' 카테고리의 다른 글
데이터베이스 조회 최종 형태2(product) (0) | 2023.07.24 |
---|---|
데이터베이스 조회 최종 형태1(member) (0) | 2023.07.24 |
데이터베이스5 - JDBC (0) | 2023.07.21 |
데이터베이스4 - Top N Query (0) | 2023.07.20 |
데이터베이스3 - CRUD (0) | 2023.07.20 |