-
Notifications
You must be signed in to change notification settings - Fork 861
/
JdbcUserRepositoryImpl.java
68 lines (56 loc) · 2.72 KB
/
JdbcUserRepositoryImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package org.springframework.samples.petclinic.repository.jdbc;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.samples.petclinic.model.Role;
import org.springframework.samples.petclinic.model.User;
import org.springframework.samples.petclinic.repository.UserRepository;
import org.springframework.stereotype.Repository;
@Repository
@Profile("jdbc")
public class JdbcUserRepositoryImpl implements UserRepository {
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
private SimpleJdbcInsert insertUser;
@Autowired
public JdbcUserRepositoryImpl(DataSource dataSource) {
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
this.insertUser = new SimpleJdbcInsert(dataSource).withTableName("users");
}
@Override
public void save(User user) throws DataAccessException {
BeanPropertySqlParameterSource parameterSource = new BeanPropertySqlParameterSource(user);
try {
getByUsername(user.getUsername());
this.namedParameterJdbcTemplate.update("UPDATE users SET password=:password, enabled=:enabled WHERE username=:username", parameterSource);
} catch (EmptyResultDataAccessException e) {
this.insertUser.execute(parameterSource);
} finally {
updateUserRoles(user);
}
}
private User getByUsername(String username) {
Map<String, Object> params = new HashMap<>();
params.put("username", username);
return this.namedParameterJdbcTemplate.queryForObject("SELECT * FROM users WHERE username=:username",
params, BeanPropertyRowMapper.newInstance(User.class));
}
private void updateUserRoles(User user) {
Map<String, Object> params = new HashMap<>();
params.put("username", user.getUsername());
this.namedParameterJdbcTemplate.update("DELETE FROM roles WHERE username=:username", params);
for (Role role : user.getRoles()) {
params.put("role", role.getName());
if (role.getName() != null) {
this.namedParameterJdbcTemplate.update("INSERT INTO roles(username, role) VALUES (:username, :role)", params);
}
}
}
}