如何解决更新方法中的可选项始终运行并将值设置为0
我正在使用Optionals的更新方法,该方法一旦运行将更新其各自的postgres db列,前几个是字符串,并且更新良好。最后两个是INT(授权和ChapterProgress),当我调用它们中的第一个以更新其值时,它将另一个基于INT的可选值设置为0,反之亦然。问题代码是下面的最后两个可选选项:
private final UserDao userDao;
//constructor
@Autowired
public UserService(@Qualifier("postgres1")UserDao userDao) {
this.userDao= userDao;
}
//methods
public int addUser(UUID id,User user) {
UUID newId = Optional.ofNullable(id)
.orElse(UUID.randomUUID());
return userDao.insertUser(newId,user);
}
public List<User> getAllUsers(){
return userDao.selectAllUsers();
}
@GetMapping
public Optional<User> getUserById(UUID id){
return userDao.selectUserByID(id);
}
public int deleteUser(UUID id) {
return userDao.deleteUserById(id);
}
@PutMapping
public void updateUser(UUID id,User user) {
Optional.ofNullable(user.getSurname())
.filter(surname -> !StringUtils.isEmpty(surname))
.map(StringUtils::capitalize)
.ifPresent(surname -> userDao.updateSurname(id,surname));
Optional.ofNullable(user.getFirstname())
.filter(firstname -> !StringUtils.isEmpty(firstname))
.map(StringUtils::capitalize)
.ifPresent(firstname -> userDao.updateFirstname(id,firstname));
Optional.ofNullable(user.getUsername())
.filter(uname -> !StringUtils.isEmpty(uname))
.ifPresent(uname -> userDao.updateUsername(id,uname));
Optional.ofNullable(user.getPassword())
.filter(pw -> !StringUtils.isEmpty(pw))
.ifPresent(pw -> userDao.updatePassword(id,pw));
Optional.ofNullable(user.getAuthorisation())
.filter(auth -> !StringUtils.isEmpty(auth))
.ifPresent(auth -> userDao.updateAuthorisation(id,auth));
Optional.ofNullable(user.getChapterProgress())
.filter(cp -> !StringUtils.isEmpty(cp))
.ifPresent(cp -> userDao.updateChapterProgress(id,cp));
}
我尝试注释掉每个过滤器上的.filter行,但没有任何改变。
使用者Dao看起来像这样。
public interface UserDao {
int insertUser(UUID id,User user);//good
default int insertUser(User user) {//good
UUID id = UUID.randomUUID();
return insertUser(id,user);
}
List<User> selectAllUsers();//good
Optional<User> selectUserByID(UUID id);//good
int deleteUserById(UUID id);//good
int updateUserById(UUID id,User newUser);//good
int updateSurname(UUID id,String surname);//good
int updateFirstname(UUID id,String firstname);//good
int updateUsername(UUID id,String username);//good
int updatePassword(UUID id,String password);//good
int updateAuthorisation(UUID id,int authorisation);//
int updateChapterProgress(UUID id,int chapterProgress);//
并在UserDataAccessServcie中实现,如下所示:
private JdbcTemplate jdbcTemplate;
@Autowired
public UserDataAccessService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate= jdbcTemplate;
}
@Override//create
public int insertUser(UUID id,User user) {
String sql ="INSERT INTO users(id,surname,firstname,username,password,authorisation,chapterprogress) VALUES (?,?,?);";
return jdbcTemplate.update(sql,id,user.getSurname(),user.getFirstname(),user.getUsername(),user.getPassword(),user.getAuthorisation(),user.getChapterProgress()
);
}
@Override//read all
public List<User> selectAllUsers() {
final String sql= "SELECT * FROM users";
return jdbcTemplate.query(sql,(resultSet,i)->{
return new User(UUID.fromString(
resultSet.getString("id")),resultSet.getString("surname"),resultSet.getString("firstName"),resultSet.getString("userName"),resultSet.getString("password"),resultSet.getInt("authorisation"),resultSet.getInt("chapterProgress"));
});
}
@Override//read single
public Optional<User> selectUserByID(UUID id) {
final String sql= "SELECT * FROM users WHERE id=?";
User user= jdbcTemplate.queryForObject(sql,new Object[] {id},i) ->{
return new User(
UUID.fromString(resultSet.getString("id")),("firstName"),("userName"),("password"),resultSet.getInt("chapterProgress"));
});
return Optional.ofNullable(user);
}
@Override//update//possibly to authorisation problem,consider changing
//to void to stop returning a '0'
public int updateUserById(UUID id,User newUser) {
return 1;
}
@Override
public int updateSurname(UUID id,String surname) {
String sql ="UPDATE users"
+ " SET surname = ? "
+ "WHERE id = ?";
return jdbcTemplate.update(sql,id);
}
@Override
public int updateFirstname(UUID id,String firstname) {
String sql ="UPDATE users SET firstName = ? WHERE id = ?";
return jdbcTemplate.update(sql,id);
}
@Override
public int updateUsername(UUID id,String username) {
String sql = "UPDATE users SET username = ? WHERE id = ?";
return jdbcTemplate.update(sql,id);
}
@Override
public int updatePassword(UUID id,String password) {
String sql = "UPDATE users SET password = ? WHERE id = ?";
return jdbcTemplate.update(sql,id);
}
@Override
public int updateAuthorisation(UUID id,int authorisation) {
String sql = "UPDATE users SET authorisation = ? WHERE id = ?";
return jdbcTemplate.update(sql,id);
}
@Override
public int updateChapterProgress(UUID id,int chapterProgress) {
String sql = "UPDATE users SET chapterprogress = ? WHERE id = ?";
return jdbcTemplate.update(sql,chapterProgress,id);
}
@Override//delete
public int deleteUserById(UUID id) {
final String sql= "DELETE FROM users WHERE id=?";
jdbcTemplate.update(sql,id);
return 1;
}
我有种忘记/做一些简单的事情的感觉,但是对我的帮助非常感谢
谢谢
解决方法
结果是这是两个get方法的返回类型。通过使用Integer作为数据类型并返回Integer而不是int,它允许db操作并存储它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。