#13 spring db: JdbcTemplate - SimpleJdbcInsert
This commit is contained in:
@@ -11,7 +11,8 @@ import org.springframework.context.annotation.Profile;
|
|||||||
|
|
||||||
//@Import(MemoryConfig.class)
|
//@Import(MemoryConfig.class)
|
||||||
//@Import(JdbcTemplateV1Config.class)
|
//@Import(JdbcTemplateV1Config.class)
|
||||||
@Import(JdbcTemplateV2Config.class)
|
//@Import(JdbcTemplateV2Config.class)
|
||||||
|
@Import(JdbcTemplateV3Config.class)
|
||||||
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
|
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
|
||||||
public class ItemServiceApplication {
|
public class ItemServiceApplication {
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package hello.itemservice.config;
|
||||||
|
|
||||||
|
import hello.itemservice.repository.ItemRepository;
|
||||||
|
import hello.itemservice.repository.jdbctemplate.JdbcTemplateItemRepositoryV3;
|
||||||
|
import hello.itemservice.service.ItemService;
|
||||||
|
import hello.itemservice.service.ItemServiceV1;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class JdbcTemplateV3Config {
|
||||||
|
|
||||||
|
private final DataSource dataSource;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ItemService itemService() {
|
||||||
|
return new ItemServiceV1(itemRepository());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ItemRepository itemRepository() {
|
||||||
|
return new JdbcTemplateItemRepositoryV3(dataSource);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
package hello.itemservice.repository.jdbctemplate;
|
||||||
|
|
||||||
|
import hello.itemservice.domain.Item;
|
||||||
|
import hello.itemservice.repository.ItemRepository;
|
||||||
|
import hello.itemservice.repository.ItemSearchCond;
|
||||||
|
import hello.itemservice.repository.ItemUpdateDto;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.dao.EmptyResultDataAccessException;
|
||||||
|
import org.springframework.jdbc.core.BeanPropertyRowMapper;
|
||||||
|
import org.springframework.jdbc.core.RowMapper;
|
||||||
|
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
|
||||||
|
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||||
|
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
||||||
|
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
||||||
|
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
|
||||||
|
import org.springframework.jdbc.support.GeneratedKeyHolder;
|
||||||
|
import org.springframework.jdbc.support.KeyHolder;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SimpleJdbcInsert
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class JdbcTemplateItemRepositoryV3 implements ItemRepository {
|
||||||
|
|
||||||
|
private final NamedParameterJdbcTemplate jdbcTemplate;
|
||||||
|
private final SimpleJdbcInsert jdbcInsert;
|
||||||
|
|
||||||
|
public JdbcTemplateItemRepositoryV3(DataSource dataSource) {
|
||||||
|
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
|
||||||
|
this.jdbcInsert = new SimpleJdbcInsert(dataSource)
|
||||||
|
.withTableName("item") // 테이블 명
|
||||||
|
.usingGeneratedKeyColumns("id") // pk 컬럼
|
||||||
|
// .usingColumns("item_name", "price", "quantity") // 생략 가능
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item save(Item item) {
|
||||||
|
SqlParameterSource param = new BeanPropertySqlParameterSource(item);
|
||||||
|
Number key = jdbcInsert.executeAndReturnKey(param);
|
||||||
|
item.setId(key.longValue());
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(Long itemId, ItemUpdateDto updateParam) {
|
||||||
|
String sql =
|
||||||
|
"update item set item_name=:itemName, price=:price, quantity=:quantity where id=:id";
|
||||||
|
|
||||||
|
SqlParameterSource param = new MapSqlParameterSource()
|
||||||
|
.addValue("itemName", updateParam.getItemName())
|
||||||
|
.addValue("price", updateParam.getPrice())
|
||||||
|
.addValue("quantity", updateParam.getQuantity())
|
||||||
|
.addValue("id", itemId);
|
||||||
|
|
||||||
|
jdbcTemplate.update(sql, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<Item> findById(Long id) {
|
||||||
|
String sql =
|
||||||
|
"select id, item_name, price, quantity from item where id = :id";
|
||||||
|
|
||||||
|
try {
|
||||||
|
Map<String, Object> param = Map.of("id", id);
|
||||||
|
Item item = jdbcTemplate.queryForObject(sql, param, itemRowMapper());
|
||||||
|
return Optional.of(item);
|
||||||
|
} catch (EmptyResultDataAccessException e) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private RowMapper<Item> itemRowMapper() {
|
||||||
|
return BeanPropertyRowMapper.newInstance(Item.class); // camel 변환 지원
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Item> findAll(ItemSearchCond cond) {
|
||||||
|
String itemName = cond.getItemName();
|
||||||
|
Integer maxPrice = cond.getMaxPrice();
|
||||||
|
|
||||||
|
SqlParameterSource param = new BeanPropertySqlParameterSource(cond);
|
||||||
|
|
||||||
|
String sql = "select id, item_name, price, quantity from item";
|
||||||
|
|
||||||
|
// 동적 쿼리
|
||||||
|
if (StringUtils.hasText(itemName) || maxPrice != null) {
|
||||||
|
sql += " where";
|
||||||
|
}
|
||||||
|
boolean andFlag = false;
|
||||||
|
if (StringUtils.hasText(itemName)) {
|
||||||
|
sql += " item_name like concat('%',:itemName,'%')";
|
||||||
|
andFlag = true;
|
||||||
|
}
|
||||||
|
if (maxPrice != null) {
|
||||||
|
if (andFlag) {
|
||||||
|
sql += " and";
|
||||||
|
}
|
||||||
|
sql += " price <= :maxPrice";
|
||||||
|
}
|
||||||
|
log.info("sql={}", sql);
|
||||||
|
return jdbcTemplate.query(sql, param, itemRowMapper());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user