Skip to content

Commit 4ce57c3

Browse files
committed
feat: NamedParameterJdbcTemplate 적용
1 parent aa240ca commit 4ce57c3

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.peter.churchservice.repository.jdbctemplate;
2+
3+
import com.peter.churchservice.domain.member.Gender;
4+
import com.peter.churchservice.domain.member.Member;
5+
import com.peter.churchservice.repository.MemberRepository;
6+
import com.peter.churchservice.repository.dto.MemberSearchParam;
7+
import com.peter.churchservice.repository.dto.MemberUpdateParam;
8+
import com.peter.churchservice.repository.jdbctemplate.common.BeanPropertySqlParameterSourceForEnum;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.Optional;
12+
import javax.sql.DataSource;
13+
import org.springframework.context.annotation.Primary;
14+
import org.springframework.dao.EmptyResultDataAccessException;
15+
import org.springframework.jdbc.core.RowMapper;
16+
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
17+
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
18+
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
19+
import org.springframework.jdbc.support.GeneratedKeyHolder;
20+
import org.springframework.jdbc.support.KeyHolder;
21+
import org.springframework.stereotype.Repository;
22+
import org.springframework.util.StringUtils;
23+
24+
/**
25+
* NamedParameterJdbcTemplate 적용
26+
*/
27+
@Primary
28+
@Repository
29+
public class JdbcTemplateMemberRepositoryV2 implements MemberRepository {
30+
31+
private final NamedParameterJdbcTemplate template;
32+
33+
public JdbcTemplateMemberRepositoryV2(DataSource dataSource) {
34+
this.template = new NamedParameterJdbcTemplate(dataSource);
35+
}
36+
37+
@Override
38+
public Member save(Member member) {
39+
String sql = "INSERT INTO members (name, gender, position, birth_date, address, phone_number)"
40+
+ " VALUES (:name,:gender,:position,:birthDate,:address,:phoneNumber)";
41+
42+
// enum 처리 기능을 추가한 BeanPropertySqlParameterSourceForEnum 적용
43+
SqlParameterSource param = new BeanPropertySqlParameterSourceForEnum(member);
44+
45+
KeyHolder keyHolder = new GeneratedKeyHolder();
46+
template.update(sql, param, keyHolder);
47+
48+
long key = keyHolder.getKey().longValue();
49+
member.setId(key);
50+
return member;
51+
}
52+
53+
@Override
54+
public void update(Long memberId, MemberUpdateParam updateParam) {
55+
String sql = "UPDATE members SET name = :name"
56+
+ ", gender = :gender"
57+
+ ", position = :position"
58+
+ ", birth_date = :birthDate"
59+
+ ", address = :address"
60+
+ ", phone_number = :phoneNumber"
61+
+ " WHERE id = :id";
62+
63+
SqlParameterSource param = new MapSqlParameterSource()
64+
.addValue("name", updateParam.getName())
65+
.addValue("gender", updateParam.getGender().name())
66+
.addValue("position", updateParam.getPosition())
67+
.addValue("birthDate",updateParam.getBirthDate() )
68+
.addValue("address", updateParam.getAddress())
69+
.addValue("phoneNumber", updateParam.getPhoneNumber())
70+
.addValue("id", memberId);
71+
72+
template.update(sql, param);
73+
}
74+
75+
@Override
76+
public Optional<Member> findById(Long id) {
77+
String sql = "SELECT id, name, gender, position, birth_date, address, phone_number FROM members WHERE id=:id";
78+
Map<String, Long> param = Map.of("id", id);
79+
try {
80+
Member member = template.queryForObject(sql, param, memberRowMapper());
81+
return Optional.ofNullable(member);
82+
} catch (EmptyResultDataAccessException e) {
83+
return Optional.empty();
84+
}
85+
}
86+
87+
private RowMapper<Member> memberRowMapper() {
88+
return ((rs, rowNum) -> Member.builder()
89+
.id(rs.getLong("id"))
90+
.name(rs.getString("name"))
91+
.gender(Gender.valueOf(rs.getString("gender")))
92+
.position(rs.getString("position"))
93+
.birthDate(rs.getDate("birth_date").toLocalDate())
94+
.address(rs.getString("address"))
95+
.phoneNumber(rs.getString("phone_number"))
96+
.build());
97+
}
98+
99+
@Override
100+
public List<Member> findAll(MemberSearchParam cond) {
101+
String name = cond.getName();
102+
String sql = "SELECT id, name, gender, position, birth_date, address, phone_number FROM members";
103+
104+
if (StringUtils.hasText(name)) {
105+
sql += " WHERE name Like CONCAT('%',:name,'%')";
106+
}
107+
108+
return template.query(sql, new BeanPropertySqlParameterSourceForEnum(cond), memberRowMapper());
109+
}
110+
111+
@Override
112+
public void delete(Long memberId) {
113+
String sql = "DELETE FROM members WHERE id=:id";
114+
Map<String, Object> param = Map.of("id", memberId);
115+
template.update(sql, param);
116+
}
117+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.peter.churchservice.repository.jdbctemplate.common;
2+
3+
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
4+
5+
public class BeanPropertySqlParameterSourceForEnum extends BeanPropertySqlParameterSource {
6+
7+
/**
8+
* Create a new BeanPropertySqlParameterSource for the given bean.
9+
*
10+
* @param object the bean instance to wrap
11+
*/
12+
public BeanPropertySqlParameterSourceForEnum(Object object) {
13+
super(object);
14+
}
15+
16+
@Override
17+
public Object getValue(String paramName) throws IllegalArgumentException {
18+
Object value = super.getValue(paramName);
19+
if(value instanceof Enum enumValue) {
20+
return enumValue.name();
21+
}
22+
return value;
23+
}
24+
}

0 commit comments

Comments
 (0)