BE/Spring

JdbcTemplate를 이용한 데이터 통신

멍목 2024. 9. 19. 11:27
반응형

환경) H2 DB

 

1. INSERT(UPDATE)

update(query, ...) 를 사용하는 경우 추가된 행의 갯수를 반환받을 수 있다.

@Override
public int insert(ReviewDto dto) {
    int result =  jdbcTemplate.update(
            "INSERT INTO REVIEWS (SEQ, USER_SEQ, PRODUCT_SEQ, CONTENT, CREATE_AT) VALUES (null, ?, ?, ?, null)",
            dto.getUserSeq(), dto.getProductId(), dto.getContent()
    );
    return result;
}

 

 

2. SELECT

  • 쿼리를 통해 얻은 데이터 결과값을 dto, vo로 변환해주는 작업이 필요하다.
  • 이 작업을 RowMapper라는 객체를 이용해서 할 수 있다.
// Lambda Expression
static RowMapper<Product> mapper = (rs, rowNum) ->
    new Product.Builder()
            .seq(rs.getLong("seq"))
            .name(rs.getString("name"))
            .details(rs.getString("details"))
            .reviewCount(rs.getInt("review_count"))
            .createAt(dateTimeOf(rs.getTimestamp("create_at")))
            .build();
   
   
// Anonymous Expression
static RowMapper<OrderDto> mapper = new RowMapper<OrderDto>() {
    @Override
    public OrderDto mapRow(ResultSet rs, int rowNum) throws SQLException {
      ReviewDto reviewDto = null;
      if((rs.getLong("review_seq") != 0)){
        reviewDto = new ReviewDto(rs.getLong("review_seq"), rs.getLong("review_product_seq"), rs.getString("review_content"), dateTimeOf(rs.getTimestamp("review_create_at")) );
      }
      return new OrderDto(rs.getLong("seq"), rs.getLong("user_seq"), rs.getLong("product_seq"), 
      reviewDto, State.valueOf(rs.getString("state")), rs.getString("request_msg"), rs.getString("reject_msg"), dateTimeOf(rs.getTimestamp("completed_at")), dateTimeOf(rs.getTimestamp("rejected_at")), dateTimeOf(rs.getTimestamp("create_at")));
    }
  };

 

 

단건 조회

  • null이 반환될 수 있으므로, Optional로 반환한다.
  • mapper는 RowMapper이며, id는 Parameter 이다.
@Override
public Optional<Product> findById(long id) {
    List<Product> results = jdbcTemplate.query(
            "SELECT * FROM products WHERE seq=?",
            mapper,
            id
    );
    return ofNullable(results.isEmpty() ? null : results.get(0));
}

 

 

다건 조회

  • 다건을 조회하는 경우, LIst로 반환한다.
  • 아래의 예제에는 페이징, join이 포함되어 있다.
@Override
public List<OrderDto> findAll(Pageable simplePageRequest) {
    return jdbcTemplate.query(
            "SELECT o.*, r.product_seq as review_product_seq, r.content as review_content, r.create_at as review_create_at FROM orders o left outer join reviews r on o.review_seq = r.seq ORDER BY o.seq DESC limit ? offset ?",
            mapper, simplePageRequest.getSize(), simplePageRequest.getOffset()
    );
}
반응형