#13 spring db: JdbcTemplate - basic
This commit is contained in:
@@ -21,6 +21,10 @@ repositories {
|
||||
dependencies {
|
||||
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
|
||||
|
||||
runtimeOnly 'com.h2database:h2'
|
||||
|
||||
compileOnly 'org.projectlombok:lombok'
|
||||
annotationProcessor 'org.projectlombok:lombok'
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
|
||||
@@ -9,7 +9,8 @@ import org.springframework.context.annotation.Import;
|
||||
import org.springframework.context.annotation.Profile;
|
||||
|
||||
|
||||
@Import(MemoryConfig.class)
|
||||
//@Import(MemoryConfig.class)
|
||||
@Import(JdbcTemplateV1Config.class)
|
||||
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
|
||||
public class ItemServiceApplication {
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package hello.itemservice.config;
|
||||
|
||||
import hello.itemservice.repository.ItemRepository;
|
||||
import hello.itemservice.repository.jdbctemplate.JdbcTemplateItemRepositoryV1;
|
||||
import hello.itemservice.repository.memory.MemoryItemRepository;
|
||||
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 JdbcTemplateV1Config {
|
||||
|
||||
private final DataSource dataSource;
|
||||
|
||||
@Bean
|
||||
public ItemService itemService() {
|
||||
return new ItemServiceV1(itemRepository());
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ItemRepository itemRepository() {
|
||||
return new JdbcTemplateItemRepositoryV1(dataSource);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
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.JdbcTemplate;
|
||||
import org.springframework.jdbc.core.RowMapper;
|
||||
import org.springframework.jdbc.support.GeneratedKeyHolder;
|
||||
import org.springframework.jdbc.support.KeyHolder;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* JdbcTemplate
|
||||
*/
|
||||
@Slf4j
|
||||
public class JdbcTemplateItemRepositoryV1 implements ItemRepository {
|
||||
|
||||
private final JdbcTemplate jdbcTemplate;
|
||||
|
||||
public JdbcTemplateItemRepositoryV1(DataSource dataSource) {
|
||||
this.jdbcTemplate = new JdbcTemplate(dataSource);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Item save(Item item) {
|
||||
String sql = "insert into item(item_name, price, quantity) values (?, ?, ?)";
|
||||
KeyHolder keyHolder = new GeneratedKeyHolder();
|
||||
|
||||
jdbcTemplate.update(connection -> {
|
||||
// 자동 증가 키
|
||||
PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});
|
||||
ps.setString(1, item.getItemName());
|
||||
ps.setInt(2, item.getPrice());
|
||||
ps.setInt(3, item.getQuantity());
|
||||
|
||||
return ps;
|
||||
}, keyHolder);
|
||||
|
||||
long key = keyHolder.getKey().longValue();
|
||||
item.setId(key);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(Long itemId, ItemUpdateDto updateParam) {
|
||||
String sql = "update item set item_name=?, price=?, quantity=? where id=?";
|
||||
|
||||
jdbcTemplate.update(sql,
|
||||
updateParam.getItemName(),
|
||||
updateParam.getPrice(),
|
||||
updateParam.getQuantity(),
|
||||
itemId
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Item> findById(Long id) {
|
||||
String sql = "select id, item_name, price, quantity from item where id = ?";
|
||||
|
||||
try {
|
||||
Item item = jdbcTemplate.queryForObject(sql, itemRowMapper(), id);
|
||||
return Optional.of(item);
|
||||
} catch (EmptyResultDataAccessException e) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private RowMapper<Item> itemRowMapper() {
|
||||
return ((rs, rowNum) -> {
|
||||
Item item = new Item();
|
||||
item.setId(rs.getLong("id"));
|
||||
item.setItemName(rs.getString("item_name"));
|
||||
item.setPrice(rs.getInt("price"));
|
||||
item.setQuantity(rs.getInt("quantity"));
|
||||
|
||||
return item;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Item> findAll(ItemSearchCond cond) {
|
||||
String itemName = cond.getItemName();
|
||||
Integer maxPrice = cond.getMaxPrice();
|
||||
|
||||
String sql = "select id, item_name, price, quantity from item";
|
||||
|
||||
// 동적 쿼리
|
||||
if (StringUtils.hasText(itemName) || maxPrice != null) {
|
||||
sql += " where";
|
||||
}
|
||||
boolean andFlag = false;
|
||||
List<Object> param = new ArrayList<>();
|
||||
if (StringUtils.hasText(itemName)) {
|
||||
sql += " item_name like concat('%',?,'%')";
|
||||
param.add(itemName);
|
||||
andFlag = true;
|
||||
}
|
||||
if (maxPrice != null) {
|
||||
if (andFlag) {
|
||||
sql += " and";
|
||||
}
|
||||
sql += " price <= ?";
|
||||
param.add(maxPrice);
|
||||
}
|
||||
log.info("sql={}", sql);
|
||||
return jdbcTemplate.query(sql, itemRowMapper(), param.toArray());
|
||||
}
|
||||
}
|
||||
@@ -1 +1,7 @@
|
||||
spring.profiles.active=local
|
||||
spring.profiles.active=local
|
||||
|
||||
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
|
||||
spring.datasource.username=sa
|
||||
|
||||
#jdbcTemplate sql log
|
||||
#logging.level.org.springframework.jdbc=debug
|
||||
@@ -1 +1,4 @@
|
||||
spring.profiles.active=test
|
||||
spring.profiles.active=test
|
||||
|
||||
#jdbcTemplate sql log
|
||||
#logging.level.org.springframework.jdbc=debug
|
||||
Reference in New Issue
Block a user