java - 更新方法中的选项始终运行并将值设置为 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 行,但没有任何改变。
用户道是这样的。
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}, (resultSet,i) ->{
return new User(
UUID.fromString(resultSet.getString("id")),
resultSet.getString("surname"), ("firstName"), ("userName"), ("password"),
resultSet.getInt("authorisation"),
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, surname, id);
}
@Override
public int updateFirstname(UUID id, String firstname) {
String sql ="UPDATE users SET firstName = ? WHERE id = ?";
return jdbcTemplate.update(sql, firstname, id);
}
@Override
public int updateUsername(UUID id, String username) {
String sql = "UPDATE users SET username = ? WHERE id = ?";
return jdbcTemplate.update(sql, username, id);
}
@Override
public int updatePassword(UUID id, String password) {
String sql = "UPDATE users SET password = ? WHERE id = ?";
return jdbcTemplate.update(sql, password, id);
}
@Override
public int updateAuthorisation(UUID id, int authorisation) {
String sql = "UPDATE users SET authorisation = ? WHERE id = ?";
return jdbcTemplate.update(sql, authorisation, 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 操作并存储它。
推荐阅读
- javascript - 我如何等待列表中的每个元素使用 cypress 更新为特定文本
- amazon-dynamodb - 错误:表尚未注册,在 DynamoDB 中
- kubernetes - k8s:由于内存不足,无法删除部署
- javascript - Javascript/Codeigniter 中的价格计算
- sequelize.js - Sequelize 按字母顺序读取迁移文件,但我需要不同的排序
- excel - Do While freq.Value <> " " 'if freq in range >< empty --> ERROR BUG
- python-3.x - 如何从胶囊层打印输出向量?
- java - 如何从一个流中过滤不包含在另一个流中的字符串?
- git - 我对很多文件进行了更改,但还没有提交。如何退出所有更改?
- r - 在包含值的间隔表中查找行 - 需要匹配 2 个其他条件