[Spring] DB 관련 : JdbcTemplate
JdbcTemplate
- [Spring JDBC] Spring JDBC를 이용한 데이터 접근 방식
- [Spring JDBC] JdbcTemplate의 기본 사용법
- JdbcTemplate query~ 다양한 타입 예제
- Spring 기준이라 살짝 더 manual한데, SpringBoot에서는 application.properties에 설정해둔 datasource 설정을 바탕으로 JdbcTemplate을 이미 만들어두기 때문에 그냥 JdbcTemplate을 바로 DI받아서 사용하면 된다.
```java
// query 결과가 없는 경우 EmptyResultDataAccessException가 발생한다. DAO 내에서 try-catch해주자.
Product product = jdbcTemplate.queryForObject(query, new Object[]{productCode}, new BeanPropertyRowMapper<>(Product.class));
List<DisposalHistory> disposalHistoryList = jdbcTemplate.query(query, new Object[]{dateDate}, new BeanPropertyRowMapper<>(DisposalHistory.class));
/* new BeanPropertyRowMapper<>()를 사용해 자동으로 mapping 하는 경우
@AllArgsConstructor 뿐만 아니라
@NoArgsConstructor도 필요하다!
*/
// queryForList는 컬럼 이름을 key로 해서 Map<String, Object>를 리턴한다.
[{id = 1, name="qer"} , {id = 2, name="asdf"}, ...]
// queryForMap은 Map<K,V>를 리턴하는데 queryForList의 원소에 해당하는게 V이고, 지정한 컬럼값이 K가 된다.
// id 컬럼을 K로 지정한 경우
{
1 : {id = 1, name="qer"} ,
2 : {id = 2, name="asdf"},
}
// 그래서 결과로 반환받은 행 중에 id = ?인 레코드의 존재를 판단하거나 접근할 때 유용.
result.get(1).get(name) // qer을 반환.
// 자동 mapping(BeanPropertyRowMapper)를 안쓸거면 그냥 query()를 사용해서 람다 등을 이용해 직접 1:1로 필드에 넣어준다.
```
jdbcTemplate.update()로 레코드를 삽입하는 동시에 해당 레코드의 Key값( sequence )을 반환받기
KeyHolder와 PreparedStatement를 사용하면 된다.
```java
String query = "INSERT INTO SALES(sales_id, customer_id, branch_id, sales_time, receipt_id, cancel_check, amount) "
+ "VALUES(sales_id_seq.nextval, ?, ?, TO_DATE(?,'YYYYMMDD HH24:MI:SS'), sales_id_seq.currval)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection
.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS);
ps.setString(1, (sales.getCustomerId() != null) ? sales.getCustomerId().toString() : "NULL");
ps.setString(2, Long.toString(sales.getBranchId()));
ps.setString(3, sales.getSalesTime());
return ps;
}, keyHolder);
return keyHolder.getKey().longValue();
```
- 근데 오라클에서는 포기하는게 좋다. 계속 삽질하다 결국 jdbcTemplate에서 지원 안한다는 것을 알아냄.
- 그래서 오라클에서는 이렇게 처리...
update를 쓸 때는 주의할 것.
DB 툴과 같이 쓰는 경우 같은 테이블에 대해서 update를 툴에서도 수행하고 자바에서도 수행하게 되면
툴은 보통 Commit을 하기 전 까지 수정사항이 반영이 안되니까, update한 테이블에 대해서 Lock을 가지고 있는 경우가 있다.
그래서 자바에서 뭔가 Blocking이 걸리면서 안되는데?? 싶은 상황이 벌어질 수 있음.
'Java Stack > Spring' 카테고리의 다른 글
RestTemplate 사용 시 ResponseType으로 generic 타입 받기 (ParameterizedTypeReference) (1) | 2019.07.11 |
---|---|
[Spring] annotation : bean constraints, validation (0) | 2019.07.11 |
[Spring] annotation : lombok, builder (0) | 2019.07.10 |
Spring boot security 로그인 처리 (0) | 2019.06.04 |
Spring Framework의 IoC 컨테이너 / 빈(Bean) / DI 방식 정리 (0) | 2019.05.13 |