鱼C论坛

 找回密码
 立即注册
查看: 535|回复: 7

[已解决]请问在spring boot 工程里 下列代码是如何实现其更新用户信息功能的?

[复制链接]
发表于 2024-3-5 00:31:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以下是一个spring boot 工程代码 其目的是修改某用户的的一些信息


controller类有如下代码
        @PutMapping("/update")
        public Result update(@RequestBody User user) {
                userService.update(user);
                return Result.success();

service实现类有如下代码
        @Override
        public void update(User user) {
                userMapper.update(user);

mapper接口有如下代码?
        @Update("update user set nickname=#{nickname}, email=#{email}, update_time=now() where id=#{id}")
        void update(User user);

pojo层的User类里有如下代码

@Data
public class User {
    private Integer id;//主键ID
    private String username;//用户名
    private String password;//密码
    private String nickname;//昵称
    private String email;//邮箱
    private String userPic;//用户头像地址
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}


上述代码成功的实现了更改用户信息的功能  我的问题是写代码是如何实现这些功能的

首先在controller类里 是如何把传入的json数据转换成User对象的 是@RequestBody这个注解的了作用吗?
然后 在mapper接口里又是如何把这个User对象分拆成数据库里的各个字段 然后对应id 更新字段数据的
最佳答案
2024-3-5 00:32:09
首先,@PutMapping("/update")注解表示这个方法处理PUT请求,并使用"/update"路径。它接收一个User对象作为参数,并返回一个Result对象。

在controller中,@RequestBody注解用于将请求体中的json数据转换为User对象。Spring Boot会根据请求体中的json数据,自动将其转换为对应的Java对象。

然后,UserController调用userService的update方法来更新用户信息。在service中,update方法接收一个User对象,并调用userMapper的update方法来更新数据库中对应用户的信息。

在mapper接口中,@Update注解表示这是一个更新操作的SQL语句。其中,使用了占位符#{nickname}、#{email}和#{id}来映射User对象的属性值。这样,在执行SQL语句时,MyBatis会根据User对象的属性值替换相应的占位符,从而实现更新操作。

所以,整个流程是这样的:Controller接收到请求并将请求体中的json数据转换为User对象,然后调用Service的update方法。在Service的update方法中,调用Mapper的update方法,该方法执行SQL语句将User对象的属性值更新到数据库中。

通过这种方式,我们可以实现更新用户信息的功能。当然,在实际应用中还需要进行参数验证、异常处理等一系列操作,上述代码只是简单演示了基本的实现方式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-5 00:32:09 | 显示全部楼层    本楼为最佳答案   
首先,@PutMapping("/update")注解表示这个方法处理PUT请求,并使用"/update"路径。它接收一个User对象作为参数,并返回一个Result对象。

在controller中,@RequestBody注解用于将请求体中的json数据转换为User对象。Spring Boot会根据请求体中的json数据,自动将其转换为对应的Java对象。

然后,UserController调用userService的update方法来更新用户信息。在service中,update方法接收一个User对象,并调用userMapper的update方法来更新数据库中对应用户的信息。

在mapper接口中,@Update注解表示这是一个更新操作的SQL语句。其中,使用了占位符#{nickname}、#{email}和#{id}来映射User对象的属性值。这样,在执行SQL语句时,MyBatis会根据User对象的属性值替换相应的占位符,从而实现更新操作。

所以,整个流程是这样的:Controller接收到请求并将请求体中的json数据转换为User对象,然后调用Service的update方法。在Service的update方法中,调用Mapper的update方法,该方法执行SQL语句将User对象的属性值更新到数据库中。

通过这种方式,我们可以实现更新用户信息的功能。当然,在实际应用中还需要进行参数验证、异常处理等一系列操作,上述代码只是简单演示了基本的实现方式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-5 15:25:44 | 显示全部楼层
FishC 发表于 2024-3-5 00:32
首先,@PutMapping("/update")注解表示这个方法处理PUT请求,并使用"/update"路径。它接收一个User对象作为 ...

请问用Md5Util对用户密码加密 代码写咋Service层和Controller层 有什么不一样吗? 写那里更好呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-5 15:26:14 | 显示全部楼层
mumei2018 发表于 2024-03-05 15:25
请问用Md5Util对用户密码加密 代码写咋Service层和Con ...


在对用户密码进行加密的过程中,通常建议将加密逻辑放在Service层而不是Controller层。这是因为Service层负责处理业务逻辑,包括对数据的处理和操作,而Controller层则负责接收请求和返回响应,起到了一个中间层的作用。

在Service层中,我们可以通过依赖注入的方式将Md5Util工具类注入到Service类中,然后在需要加密密码的地方调用Md5Util进行加密操作。示例如下:
@Service
public class UserService {
    @Autowired
    private Md5Util md5Util;
    
    public void register(User user) {
        // 对密码进行加密
        String encryptedPassword = md5Util.encrypt(user.getPassword());
        // 将加密后的密码存储到数据库中
        user.setPassword(encryptedPassword);
        userDao.save(user);
        // 其他业务逻辑...
    }
}

在Controller层中,我们通常不直接调用Md5Util进行加密操作,而是将加密逻辑交给Service层处理。Controller层主要负责接收请求、验证参数、调用Service层处理业务逻辑,并返回响应。
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    
    @PostMapping("/register")
    public Result register(@RequestBody User user) {
        // 其他参数验证逻辑...
        userService.register(user);
        return Result.success();
    }
}

总结来说,加密操作更适合放在Service层,因为Service层负责处理业务逻辑,而加密密码是一种数据处理操作。Controller层则更适合处理请求和返回响应的逻辑。这样的分层结构可以使代码更清晰、易于维护,并遵循了单一职责原则。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-5 16:38:07 | 显示全部楼层
FishC 发表于 2024-3-5 15:26
在对用户密码进行加密的过程中,通常建议将加密逻辑放在Service层而不是Controller层。这是因为Service ...

下面一段全局异常处理器的代码  请给我详细解释一下这段代码  并且解释他的作用机制 是否也是因为添加了@RestControllerAdvice,@ExceptionHandler(Exception.class)这些注解 在mybatis或者是spring的作用下 当程序出现异常时 这个异常处理器会被自动调用?
@RestControllerAdvice
public class GlobalExceptionHandler {
       
        @ExceptionHandler(Exception.class)
        public Result handleException(Exception e) {
                e.printStackTrace();
                return Result.error(StringUtils.hasLength(e.getMessage())? e.getMessage(): "操作失败");
               
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-5 16:38:25 | 显示全部楼层
mumei2018 发表于 2024-03-05 16:38
下面一段全局异常处理器的代码  请给我详细解释一下这 ...


这段代码是一个全局异常处理器,用于处理在运行过程中发生的异常。整个类被注解@RestControllerAdvice修饰,表示它是一个全局异常处理器,可以处理所有Controller中抛出的异常。

@ExceptionHandler(Exception.class)注解表示该方法是一个异常处理方法,可以处理指定类型的异常,这里指定的是Exception类,也就是处理所有异常的通用处理方法。

在handleException方法中,首先通过e.printStackTrace()打印异常堆栈信息,以便开发人员查看异常详细信息。然后,根据异常的具体情况,返回一个Result对象作为响应。如果异常的错误信息不为空,则将错误信息作为错误提示返回给前端;否则,返回一个默认的操作失败提示。这样,在发生异常时,前端可以得到相应的错误提示,并根据提示信息进行处理。

当程序发生异常时,在Spring框架的作用下,会自动调用全局异常处理器中对应的异常处理方法。这种机制可以有效地处理异常,并给出合理的反馈信息,避免了系统崩溃或用户无法理解的错误提示。

需要注意的是,在使用全局异常处理器时,还可以根据业务需求,编写多个不同类型的异常处理方法,来处理特定类型的异常,以实现更精细化的异常处理和响应。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-5 16:47:29 | 显示全部楼层
FishC 发表于 2024-3-5 16:38
这段代码是一个全局异常处理器,用于处理在运行过程中发生的异常。整个类被注解@RestControllerAdvice ...

public Result handlerException(Exception e)
在上述方法的参数了 有个 Exception 类型的 e 是不是在spring的作用下  这个参数是程序可以自动捕获并传入方法的?

另外在方法的上面 有“@ExceptionHandler(Exception.class)”注解 请问 这个括号里的Exception.class是什么意思

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-5 16:47:45 | 显示全部楼层
mumei2018 发表于 2024-03-05 16:47
public Result handlerException(Exception e)
在上 ...


是的,这个参数e是在Spring的作用下,由Spring自动捕获并传入方法的。当程序发生异常时,Spring框架会将异常对象包装起来,并将其作为方法参数传递给对应的异常处理方法。

在方法的上方,@ExceptionHandler(Exception.class)注解表示该方法是一个异常处理方法,用于处理指定类型的异常。其中,Exception.class表示处理所有的Exception类及其子类的异常。也就是说,被这个注解修饰的方法可以捕获和处理的异常类型是Exception及其子类的异常。

通过在全局异常处理器中编写多个不同类型的异常处理方法,可以实现对不同类型的异常进行不同的处理和响应。比如,可以针对特定的业务异常,编写专门的异常处理方法,提供详细的错误提示或执行特定的操作。

需要注意的是,在使用全局异常处理器时,最好将Exception类的处理方法放在最后,以兜底处理未被其他处理方法捕获的异常。这样,在发生未知异常时,仍能返回一个合理的错误提示给前端用户。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-31 02:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表