이전 글로 JdbcTemplate의 데이터 조회에 대해 간략히 알아보았습니다.
JdbcTemplate와 MyBatis - JdbcTemplate 적용(데이터 조회)
이전 글로 JdbcTemplate 소개를 다루어 보았습니다. JdbcTemplate와 MyBatis - JdbcTemplate 소개 JdbcTemplate 소개 SQL Mapper 기술인 JdbcTemplate 설정의 편리함 반복 문제 해결 JdbcTemplate만 사용할 시 단점 에 대해 다
hhhhicode.tistory.com
이번 글로 JdbcTemplate의 데이터 변경에 대해 간략히 알아보겠습니다.
JdbcTemplate 데이터 변경
- save
- update
에 대해 다룹니다.
save
사용 시 여러가지 상황이 있습니다.
두 가지 예제를 들어보겠습니다.
SimpleJdbcInsert 사용
public H2DataBaseRepository(DataSource dataSource, PoeCurrencyDtoMapper poeCurrencyDtoMapper) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
this.jdbcInsert = new SimpleJdbcInsert(dataSource)
.withTableName("poeitemvalues");
this.poeCurrencyDtoMapper = poeCurrencyDtoMapper;
}
...
public void save(UpdateParamDto updateParamDto) {
SqlParameterSource param = new BeanPropertySqlParameterSource(updateParamDto);
jdbcInsert.execute(param);
}
- SimpleJdbcInsert
- SimpleJdbcInsert를 사용하고 있습니다.
- JdbcTemplate에서 Insert SQL의 작성은 꽤나 귀찮습니다.
그래서 편하게 사용할 수 있도록 SimpleJdbcInsert 객체를 제공해줍니다.
이게 편하고 이것만 사용하다보니, 저는 다른 방법으로 Insert 하는 방법은 잊어먹었을 정도입니다. - withTableName으로 Insert하는 Table의 이름을 지정해주고 있습니다.
- BeanPropertySqlParameterSource
- DB Table의 Column들과 매칭되는 필드를 가진 객체가 있다면
그것을 가지고 편리하게 Parameter를 설정할 수 있도록 해줍니다.
- DB Table의 Column들과 매칭되는 필드를 가진 객체가 있다면
SimpleJdbcInsert 사용, DB의 자동생성 Key 사용
public PoeCurrencyRepository(DataSource dataSource, PoeCurrencyDtoMapper mapper) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
this.jdbcInsert = new SimpleJdbcInsert(dataSource)
.withTableName("POE_CURRENCY")
.usingGeneratedKeyColumns("id");
this.poeCurrencyDtoMapper = mapper;
}
...
public PoeCurrencyDto save(PoeCurrencyDto poeCurrencyDto) {
SqlParameterSource param = new BeanPropertySqlParameterSource(poeCurrencyDto);
Number key = jdbcInsert.executeAndReturnKey(param);
poeCurrencyDto.setId(key.longValue());
return poeCurrencyDto;
}
- SimpleJdbcInsert
- 여전히 withTableName으로 대상 테이블을 지정해주고 있습니다.
- 만약 대상 테이블이 DB에서 자동으로 생성해주는 key를 사용하고 있다면(예를 들면 테이블 생성 시 auto_increment 설정을 했다면), 설정해줍니다.
- save 메서드에서 executeAndReturnKey를 사용하고 있습니다.
이것은 Insert SQL문을 실행하고 DB에서 자동으로 생성해주는 Key를 반환 받아 줍니다.- DB가 생성하는 id 값은 데이터베이스에서 INSERT할 때 생성되므로,
SQL을 실행시키는 당시에는 알 수 없습니다.
그러므로 INSERT 완료 후 Key인 id컬럼의 값을 반환받는 것입니다.
- DB가 생성하는 id 값은 데이터베이스에서 INSERT할 때 생성되므로,
jdbcTemplate.update()
JdbcTemplate에서 데이터를 변경할 때는 update()를 사용합니다.
데이터를 변경하는 SQL로는 INSERT, UPDATE, DELETE가 있습니다.
update()의 반환값은 int인데, 이는 영향을 받은 row의 수를 뜻합니다.
INSERT에서는 구태어 update()를 사용하지 않고 편리한 SimpleJdbcInsert를 사용하도록 합시다.
update
갱신에 대한 예제를 들어보겠습니다.
public H2MemberRepository(DataSource dataSource) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
this.jdbcInsert = new SimpleJdbcInsert(dataSource)
.withTableName("MEMBERS")
.usingGeneratedKeyColumns("id");
}
...
public int update(Long id, MemberUpdateDto memberUpdateDto) {
String sql = "UPDATE members SET user_id=:userId, password=:password, " +
"icon=:icon, user_name=:userName, " +
"email_address=:emailAddress, display_programs=:displayPrograms, memo=:memo " +
"WHERE id=:id";
SqlParameterSource param = new MapSqlParameterSource()
.addValue("userId", memberUpdateDto.getUserId())
.addValue("password", memberUpdateDto.getPassword())
.addValue("icon", memberUpdateDto.getIcon())
.addValue("userName", memberUpdateDto.getUserName())
.addValue("emailAddress", memberUpdateDto.getEmailAddress())
.addValue("displayPrograms", memberUpdateDto.getDisplayPrograms())
.addValue("memo", memberUpdateDto.getMemo())
.addValue("id", id);
return jdbcTemplate.update(sql, param);
}
- NamedParameterJdbcTemplate
- 기존에는 ?를 사용하면서 순서를 가지고 파라미터를 맵핑하던 것을
이름으로 매핑할 수 있도록 해줍니다. - 순서를 가지고 파라미터를 맵핑하는 것은 간단히 생각해보아도 좋지 않습니다.
실수할 수 있고 괜히 머리써야하고 변경에 취약합니다.
- 기존에는 ?를 사용하면서 순서를 가지고 파라미터를 맵핑하던 것을
- MapSqlParameterSource()
- Map을 사용하여 Parameter를 설정할 수 있습니다만,
Sql의 Parameter를 설정하는것에 특화시켜놓은 객체입니다. - 체인을 사용하여 편리하게 파라미터를 설정할 수 있습니다. 마치 팩토리 같은 모습입니다.
- Map을 사용하여 Parameter를 설정할 수 있습니다만,
- jdbcTemplate.update(sql, param)
- jdbcTemplate에서 데이터의 변경은 update() 메서드를 사용합니다.
- 영향을 받은 row의 수를 반환합니다.
댓글