Spring Boot
JdbcTemplate
NamedParameterJdbcTemplate
Insert, Update, Delete
지난 글에서 Post 방식으로 파라메터를 받는 방법도 알아봤었는데요. 지난 글 참고
보통 insert, update, delete 등은 get 방식보다는 post 방식으로 쓰죠.
일단 Controller 에서 post 방식으로 데이터를 받습니다.
<참고 City.java>
package com.bryan.hello.preword.info.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class City {
private Integer id;
private String name;
private String countryCode;
private String district;
private Integer population;
}
INSERT
InfoController.java
@PostMapping(value="cityAdd")
public ResponseEntity<City> cityAdd(@RequestBody City city) {
try {
log.debug("city = {}", city.toString());
return new ResponseEntity<>(infoService.insert(city), HttpStatus.OK);
}catch (Exception e) {
log.error(e.toString());
return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
InfoService.java 에 insert() 라는 메소드를 만듭니다.
public City insert(City city) {
return this.cityRepository.insert(city);
}
repository/CityRepository.java 에 insert() 메소드를 만듭니다.
public City insert(City city) {
KeyHolder keyHolder = new GeneratedKeyHolder();
SqlParameterSource parameterSource = new MapSqlParameterSource("name", city.getName())
.addValue("countryCode", city.getCountryCode())
.addValue("district", city.getDistrict())
.addValue("population", city.getPopulation());
int affectedRows = namedParameterJdbcTemplate.update(CitySql.INSERT, parameterSource, keyHolder);
log.debug("{} inserted, new id = {}", affectedRows, keyHolder.getKey());
city.setId(keyHolder.getKey().intValue());
return city;
}
그리고 쿼리를 만들어야죠.
repository/CitySql.groovy
public static final String INSERT = """
INSERT INTO city (Name, CountryCode, District, Population) values (:name, :countryCode, :district, :population)
""";
id 컬럼은 Auto Incremental 이라서 쿼리에 없습니다.
실행
City Table 에 CountryCode 는 Foreign key 가 걸려있으므로, country table 에 있는 countryCode 를 입력해야합니다.
입력 파라메터는
{
"name": "NY",
"countryCode": "KOR",
"district": "NewYork",
"population": 100
}
결과
AutoIncrement 된 id 를 추가한 city 객체가 return 되었습니다.
Update
update 도 쿼리 빼고는 다를게 없습니다.
이번엔 쿼리부터 만들어보죠.
repository/CitySql.groovy
public static final String UPDATE = """
UPDATE city SET Name = :name, CountryCode = :countryCode, District = :district, Population = :population WHERE 1=1
""";
public static final String ID_CONDITION = """
AND id = :id
""";
repository/CityRepository.java
public Integer updateById(City city) {
String qry = CitySql.UPDATE + CitySql.ID_CONDITION;
SqlParameterSource parameterSource = new MapSqlParameterSource("id", city.getId())
.addValue("name", city.getName())
.addValue("countryCode", city.getCountryCode())
.addValue("district", city.getDistrict())
.addValue("population", city.getPopulation());
return namedParameterJdbcTemplate.update(qry, parameterSource);
}
InfoService.java
public Integer updateById(City city) {
log.debug("city id = {}", city.getId());
return cityRepository.updateById(city);
}
InfoController.java
@PostMapping(value="cityEdit")
public ResponseEntity<String> cityEdit(@RequestBody City city) {
try {
log.debug("city = {}", city.toString());
Integer updatedCnt = infoService.updateById(city);
return new ResponseEntity<>(String.format("%d updated", updatedCnt), HttpStatus.OK);
}catch (Exception e) {
log.error(e.toString());
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
실행
URL 바꿔주시고, 파라메터에 id 가 포함되어 있어야 합니다.
DELETE
실제 서비스에서는 delete는 잘 안쓰고 flag column 을 만들고 그 상태를 update 합니다.
repository/CitySql.groovy
public static final String DELETE = """
DELETE FROM city WHERE 1=1
""";
where 절은 아까 만들었던 ID_CONDITION 을 쓰면 되겠네요.
repository/CityRepository.java
public Integer deleteById(Integer id) {
SqlParameterSource parameterSource = new MapSqlParameterSource("id", id);
return namedParameterJdbcTemplate.update(CitySql.DELETE + CitySql.ID_CONDITION, parameterSource);
}
InfoService.java
public Integer deleteById(Integer id) {
log.debug("city id = {}", id);
return cityRepository.deleteById(id);
}
InfoController.java
@ResponseBody
@PostMapping(value="cityDelete")
public ResponseEntity<String> cityDelete(@RequestParam(value="id") Integer id) {
try {
log.debug("city id = {}", id);
Integer deletedCnt = infoService.deleteById(id);
return new ResponseEntity<>(String.format("%d deleted", deletedCnt), HttpStatus.OK);
}catch (Exception e) {
log.error(e.toString());
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
이번에는 id 만 받아보는 걸 해보려고 @RequestParam 을 써봤습니다.
위에서 했던 insert, update 처럼 City 를 받아와서 id만 빼서 해도되고, 뭐, 상관없습니다.
실행
이상 기본적인 쿼리를 실행해봤습니다.
Spring Boot Tutorial 시리즈
- 2021.07.03 - [Java] - [SpringBoot] RestApi 만들기 (1) 프로젝트 생성
- 2021.07.03 - [Java] - [SpringBoot] RestApi 만들기 (2) JSON 형식 리턴
- 2021.07.04 - [Java] - [SpringBoot] RestApi 만들기 (3) Log (slf4j+logback)
- 2021.07.04 - [Java] - [SpringBoot] RestApi 만들기 (4) Service 생성 (의존성 주입)
- 2021.07.04 - [Java] - [SpringBoot] RestApi 만들기 (5.1) MySQL + JDBC Template. 1
- 2021.07.05 - [Java] - [SpringBoot] RestApi 만들기 (5.2) DBCP - HikariCP
- 2021.07.08 - [Java] - [SpringBoot] RestApi 만들기 (5.3) jdbcTemplate - Select
- 2021.07.10 - [Java] - [SpringBoot] RestApi 만들기 (5.4) GetMapping, PostMapping
- 2021.07.10 - [Java] - [SpringBoot] RestApi 만들기 (5.5) Insert, Update, Delete
- 2021.07.11 - [Java] - [SpringBoot] RestApi 만들기 (6) File Upload / Download / List
Spring Boot Tutorial 부록
- 2021.07.02 - [Java] - [eclipse] 이클립스 설치, STS(Spring Tools 4) 설치
- 2021.07.04 - [Java] - [SpringBoot] MyBatis 보다 Spring JDBC 를 사용해야 하는 이유
- 2021.06.19 - [Java] - [Spring-boot] 시작하기 전 알아야 할 것들
- 2021.06.19 - [Java] - [Spring-boot] 수동으로 설정 초기화
- 2021.07.04 - [Java] - Eclipse 에 groovy 설치 하기
- 2021.07.02 - [Java] - [eclipse] 이클립스 설치, STS(Spring Tools 4) 설치
- 2021.07.07 - [Java] - [SpringBoot] Controller 에 Route 적용 (RequestMapping)
'Java' 카테고리의 다른 글
[SpringBoot] Controller 에서 form-data 여러 파일과 json list string 같이 받기 (Converter) (2) | 2021.08.21 |
---|---|
[SpringBoot] RestApi 만들기 (6) File Upload / Download / List (3) | 2021.07.11 |
[SpringBoot] RestApi 만들기 (5.4) GetMapping, PostMapping (0) | 2021.07.10 |
[SpringBoot] RestApi 만들기 (5.3) jdbcTemplate - Select (0) | 2021.07.08 |
[SpringBoot] Controller 에 Route 적용 (RequestMapping) (0) | 2021.07.07 |
댓글