首页 专题 文章 代码 归档
@ModelAttribute注解
2020.02.01 10:38 2020.02.03 17:15

1. @ModelAttribute

1.1. 使用场景介绍

在Java中,一般情况下我们都是把数据库中的一张表映射成一个实体类,实体类的属性就是表中的各字段名。

而进行表记录的增删改查时,一般都传入的是该实体类的实例对象。

而这就有一个场景:

我们在页面中需要修改某条记录的某个字段值时,我们传给数据库框架(如Mybatis)的一定是该条记录的完整实例(也就是说,该条记录的所有字段值都必须存在,而不能是null)。

因为我们使用的Update语句一般是:

update book set name=#{name},age=#{age},price=#{price} where id=1;

也就是说:假如我们只想修改price,那前端也就传递给我们price的值,但是没有其他值传递过来(也不能通过前端页面把其他值传递过来),但是我们修改该条记录时,又必须要有其他字段的值,那怎么办呢?,这就要用到该注解了。

1.2. 使用位置

  • 方法上
  • 参数上
1.2.1. 方法加上注解

在某个方法上加上该注解,该方法就会先于目标方法执行。

例子:

@RequestMapping("/testModelAttribute")
public String testModelAttribute() {
    System.out.println("testModelAttribute方法");
    return SUCCESS;
}

// 该方法会先于其他方法执行,在该方法中可以从数据库中查询出某条记录  
@ModelAttribute
public void ModelAttribute() {
    System.out.println("加上了@ModelAttribute的方法");
}

结果:

截图-1580522616

由于该方法会先于其他方法执行,我们就可以在该方法中从数据库中查询出某条记录

1.2.2. 参数上

我们在某个方法中已经获取到数据库中的某条记录了,那么我们如何在其他需要的地方(方法上)获取到该条记录的信息呢?

// 该方法会先于其他方法执行
@ModelAttribute
public void ModelAttribute(Map<String, Object> map) {
    User user = new User("无道", 13);
    System.out.println("数据库中查到的某条记录 :" + user);
    // 将user保存起来,保存的方法可以用之前学到的Map
    map.put("user", user);
}

很简单,这就该给参数加上@ModelAttribute注解了。

@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute User user) {
    System.out.println("testModelAttribute方法中的user:" + user);
    System.out.println("testModelAttribute方法");
    return SUCCESS;
}

结果:

截图-1580523188

那如果我们给该方法传递一些值呢?比如我要修改年龄:

截图-1580523241

截图-1580523262

如上图,如果表单中我们提交了同名的参数值,那么springMVC就会覆盖原来数据库中的值。

如果表单中我们没有提交某个值,那么就会使用从数据库中查询出来的。

本节阅读完毕! (分享
二维码图片 扫描关注我们哟