package cz.nkp.differ.dao; import cz.nkp.differ.exceptions.UserDifferException; import cz.nkp.differ.model.User; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.GeneratedKeyHolder; /** * * @author xrosecky */ public class UserDAOImpl implements UserDAO { private static String ADD_USER = "INSERT INTO users(admin, username, password_hash, password_salt, mail) VALUES(?, ?, ?, ?, ?)"; private static String GET_USER_BY_USERNAME = "SELECT id, username, password_hash, password_salt, mail, admin FROM users WHERE username = ?"; private JdbcTemplate jdbcTemplate; public UserDAOImpl() { } public UserDAOImpl(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } @Override public void addUser(final User user) throws UserDifferException { GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); try { jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { PreparedStatement preparedStatement = conn.prepareStatement(ADD_USER, Statement.RETURN_GENERATED_KEYS); preparedStatement.setBoolean(1, user.isAdmin()); preparedStatement.setString(2, user.getUserName()); preparedStatement.setString(3, user.getPasswordHash()); preparedStatement.setString(4, user.getPasswordSalt()); preparedStatement.setString(5, user.getMail()); return preparedStatement; } }, keyHolder); } catch (DataIntegrityViolationException ex) { throw new UserDifferException(UserDifferException.ErrorCode.USER_ALREADY_EXISTS, "User already exists!", ex); } user.setId(keyHolder.getKey().intValue()); } @Override public User getUserByUserName(String userName) throws UserDifferException { try { return (User) jdbcTemplate.queryForObject(GET_USER_BY_USERNAME, new Object[]{userName}, new UserMapper()); } catch (EmptyResultDataAccessException ex) { return null; } } public class UserMapper implements RowMapper<User> { @Override public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setAdmin(rs.getBoolean("admin")); user.setUserName(rs.getString("username")); user.setPasswordHash(rs.getString("password_hash")); user.setPasswordSalt(rs.getString("password_salt")); user.setMail(rs.getString("mail")); return user; } } }