Java/JDBC

[Java / JDBC] Select

2025. 1. 2. 17:55

전체 조회

모든 테이블에있는 데이터 조회

Mapper

데이터베이스에서 조회한 데이터를 `DTO` 형식으로 변환하는 클래스

  • 테이블명+`Mapper`로 클래스명 작성
  • 재정의 메서드는 클래스명에 빨간밑줄이 뜨는데 Add unimplements method를 클릭하면 생성
public class PokemonMapper implements RowMapper<PokemonDto> {
	@Override
	public PokemonDto mapRow(ResultSet rs, int idx) throws SQLException {
		PokemonDto pokemonDto = new PokemonDto();
		pokemonDto.setPokemonNo(rs.getInt("pokemon_no"));
		pokemonDto.setPokemonName(rs.getString("pokemon_name"));
		pokemonDto.setPokemonType(rs.getString("pokemon_type"));
		return pokemonDto;
	}
}

 

RowMapper

데이터베이스 결과를 특정 객체(`DTO`)로 변환해주는 인터페이스

  • 제네릭타입으로 해당 `DTO` 클래스를 알려줌

mapRow()

데이터베이스에서 한 행을 읽고 값을 `DTO` 객체로 변환하는 메서드

  • 매개변수 순서대로 `ResultSet` 객체와 현재 처리 중인 행의 인덱스를 나타냄

 

ResultSet

`SQL` 쿼리가 반환하는 행 단위로 순차적으로 읽을 수 있는 인터페이스

  • `.getInt()`, `.getString()` 뿐만 아닌 다른 타입으로도 반환할 수 있음

.getInt()

특정 컬럼의 값을 `int`형으로 가져오는 메서드

  • `null` 값이 0으로 반환
  • `.getString()`을 제외한 모든 메서드도 `null` 값을 0으로 반환
rs.getInt("pokemon_no")

 

.getString()

특정 컬럼의 값을 `String`으로 가져오는 메서드

rs.getString("pokemon_name")

 

.getObject()

특정 컬럼의 값을 `Object`로 가져오는 메서드

  • `String`을 제외한 타입은 `Object`로 받고 해당 타입으로 다운캐스팅
  • `null`값이 0으로 반환되는 것을 방지 
rs.getObject("item_discount_rate", Float.class)

 

DAO

  • `Mapper` 객체를 통해 `select` 조회
private PokemonMapper pokemonMapper = new PokemonMapper();

public class PokemonDao {
	private PokemonMapper pokemonMapper = new PokemonMapper();
	
	public List<PokemonDto> selectList() {
		JdbcTemplate jdbcTemplate = JdbcFactory.createTemplate();
		String sql = "select * from pokemon";
		return jdbcTemplate.query(sql, pokemonMapper);
	}
}
PokemonDao pokemonDao = new PokemonDao();
List<PokemonDto> list = pokemonDao.selectList();

for (PokemonDto pokemonDto : list) {
    System.out.println(pokemonDto);
}

.query()

데이터베이스에서 쿼리 결과를 가져와 각 행을 `RowMapper`에 정의된 방식으로 매핑하여 결과 리스트를 반환하는 메서드

  • 인자 순서대로 실행할 `sql` 쿼리와 정의한 `Mapper` 객체가 들어감
jdbcTemplate.query(sql, pokemonMapper)

검색

`column`과 `keyword`를 통해 속성으로 검색

DAO

  • 검색을 통해 찾을 `column` 목록을 `Map`에 `keyword`와 같이 매핑
  • `columnName`이 `null`이면 검색 항목 오류 예외 처리
  • `Mapper` 객체를 통해 `select` 조회
  • `.query()`는 `sql`은 맨앞, `data`는 맨뒤에 자리함
private Map<String, String> columnExample = Map.of(
    "이름", "pokemon_name",
    "속성", "pokemon_type"
);

public List<PokemonDto> selectList(String column, String keyword) {
    String columnName = columnExample.get(column);
    if(columnName == null) {
        throw new RuntimeException("항목 오류");
    }

    JdbcTemplate jdbcTemplate = JdbcFactory.createTemplate();
    String sql = "select * from pokemon "
                    + "where instr("+columnName+", ?) > 0 "
                    + "order by "+columnName+" asc, pokemon_no asc";
    Object[] data = {keyword};
    return jdbcTemplate.query(sql, pokemonMapper, data);
}
String column = "이름";
String keyword = "테스트";

PokemonDao pokemonDao = new PokemonDao();
List<PokemonDto> list = pokemonDao.selectList(column, keyword);

for(PokemonDto pokemonDto : list) {
    System.out.println(pokemonDto);
}

상세 조회

`PK`를 통해 데이터 한 행 조회

DAO

  • `Mapper` 객체를 통해 조회
  • 데이터 한 행을 조회하므로 리스트가 비어있거나 한 행이 조회됨
  • 리스트가 비어있는 경우는 `null`을 반환
  • 리스트가 비어있지 않는 경우는 0번째 요소를 반환
public PokemonDto selectOne(int pokemonNo) {
    JdbcTemplate jdbcTemplate = JdbcFactory.createTemplate();
    String sql = "select * from pokemon where pokemon_no=?";
    Object[] data = {pokemonNo};
    List<PokemonDto> list = jdbcTemplate.query(sql, pokemonMapper, data);
    return list.isEmpty() ? null : list.get(0);
}
int pokemonNo = 1;
		
PokemonDao pokemonDao = new PokemonDao();
PokemonDto pokemonDto = pokemonDao.selectOne(pokemonNo);

if(pokemonDto == null) {
    System.out.println("존재하지 않는 포켓몬 번호");
}
else {
    System.out.println(pokemonDto);
}

단일 조회

행이 아닌 컬럼(단일 항목)을 조회

DAO

  • 시퀀스를 따로 생성하거나 집계함수를 사용하는 경우
  • `.queryForObject()`에는 가운데 인자로 반환 타입 정보가 들어옴
public int sequence() {
	String sql = "select board_seq.nextval from dual";
	return jdbcTemplate.queryForObject(sql, Long.class);
}

.queryForObject()

데이터베이스 쿼리 실행 결과에서 단일 값을 반환하는 메서드

jdbcTemplate.queryForObject(sql, Long.class);

 

'Java > JDBC' 카테고리의 다른 글

[Java / JDBC] VO  (0) 2025.02.10
[Java / JDBC] DTO와 DAO (INSERT/UPDATE/DELETE)  (0) 2025.01.02
[Java / JDBC] 정적 Sql / 동적 Sql  (0) 2025.01.02
[Java / JDBC] JDBC 연결  (0) 2024.12.31
'Java/JDBC' 카테고리의 다른 글
  • [Java / JDBC] VO
  • [Java / JDBC] DTO와 DAO (INSERT/UPDATE/DELETE)
  • [Java / JDBC] 정적 Sql / 동적 Sql
  • [Java / JDBC] JDBC 연결
개발하는 벌꿀오소리
개발하는 벌꿀오소리
겁없는 벌꿀오소리처럼 끊임없이 도전하자!
  • 글쓰기 관리
  • 개발하는 벌꿀오소리
    벌꿀오소리의 개발 노트
    개발하는 벌꿀오소리
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • Java (60)
        • 기본 (23)
        • 모듈 (8)
        • 자료구조 (5)
        • 알고리즘 (0)
        • 파일 입출력 (5)
        • JDBC (5)
        • Spring Boot (14)
      • Oracle (13)
      • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 공지사항

  • hELLO· Designed By정상우.v4.10.3
개발하는 벌꿀오소리
[Java / JDBC] Select
상단으로

티스토리툴바