@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的方法");
}
结果:
由于该方法会先于其他方法执行,我们就可以在该方法中从数据库中查询出某条记录
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;
}
结果:
那如果我们给该方法传递一些值呢?比如我要修改年龄:
如上图,如果表单中我们提交了同名的参数值,那么springMVC就会覆盖原来数据库中的值。
如果表单中我们没有提交某个值,那么就会使用从数据库中查询出来的。
本节阅读完毕!
(分享)