schema.sql
파일을 생성하고 테이블을 생성하는 쿼리를 작성하세요.”schema.sql
파일에는 테이블 생성 문장을 작성하고, data.sql
파일에는 초기 데이터 삽입 문장을 작성할 수 있다.jdbcTemplate.query()를 사용해 예약 리스트를 조회하려 했는데 query()가 지금 사용되지 않는다고 뜬다.
예약 생성(create)을 하고 생성된 예약의 id를 어떻게 가져올 수 있을까
SimpleJdbcInsert 사용하면 쉽게 생성하고 id를 가져올 수 있는 것 같다.
private final JdbcTemplate jdbcTemplate;
private final SimpleJdbcInsert jdbcInsert;
public StationDao(JdbcTemplate jdbcTemplate, DataSource source) {
this.jdbcTemplate = jdbcTemplate;
this.jdbcInsert = new SimpleJdbcInsert(source) // 데이터소스로 DB에 접근해라.
.withTableName("STATION") // 'STATION' 테이블에 삽입해라.
.usingGeneratedKeyColumns("id"); // 'id' 컬럼의 값을 key로 반환해라.
}
public Station insert(Station station) {
try {
Map<String, String> params = new HashMap<>();
params.put("name", station.getName());
Long id = jdbcInsert.executeAndReturnKey(params).longValue();
return new Station(id, station.getName());
} catch (DuplicationKeyException e) {
...
}
}
public Station insert(Station station) {
try {
SqlParameterSource params = new MapSqlParameterSource()
.addValue("name", station.getName())
.addValue(..., ...);
Long id = jdbcInsert.executeAndReturnKey(params).longValue();
return new Station(id, station.getName());
} catch (DuplicationKeyException e) {
...
}
}
insert 할 때 Map을 사용하지 않는 방법 2. SqlParameterSource - BeanPropertySqlParameterSource
public Station insert(Station station) {
try {
SqlParameterSource params = new BeanPropertySqlParameterSource(station);
Long id = jdbcInsert.executeAndReturnKey(params).longValue();
return new Station(id, station.getName());
} catch (DuplicationKeyException e) {
...
}
}
BeanPropertySqlParameterSource
⇒ 객체의 필드 값을 추출하기 때문에 같은 이름으로 대응되는 getter 메서드가 필요하다.참고 : https://hyeon9mak.github.io/easy-insert-with-simplejdbcinsert/
EmptyResultDataAccessException
GlobalExceptionHandler
에서 EmptyResultDataAccessException.*class
가* 발생하면 “존재하지 않는 예약(http status code = 400)” 오류가 발생하도록 하였다.