전체 조회
모든 테이블에있는 데이터 조회
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 |