一个关于前端参数传参很奇怪的问题

前端代码就是一个


  <input type="text" name="userage"/>

Controller层代码

@Controller
@RequestMapping("/user")
public class UsersController {
    @Autowired
    private UsersService usersService;
    @RequestMapping("/addUser")
    public String addUser(Users users){
        this.usersService.addUser(users);
            return "redirect:/ok";
    }


mapper配置文件

    <insert id="addUser" parameterType="Users">
        insert into users values(null,#{username},#{userage});
    </insert>

img


现在我在前端表单里元素是“userage” 就会存到数据库姓名里
填“username” 就会存到年龄里
实在是搞不明白了

原因在于表结构中的字段顺序和 mybatis xml 文件中的 sql values 中指定的字段顺序不一致,有两种解决方案。

  1. 修改 SQL 为:insert into users values(null,#{userage},#{username}); 调换了 sql 中 username,userage 的顺序,将 SQL 中的字段顺序和数据库保持一致,因此需要关注数据库表字段的顺序,不太推荐。
  2. 修改 SQL 为:insert into users(userid,username,userage) values(null,#{username},#{userage}); 这种方式将参数自动匹配到手动指定的字段顺序,推荐使用这个。

如有帮助,请采纳。

指定inser语句顺序

insert into users(userid,userage,username) values(null,#{username},#{userage});

mapper中的@Param设置的是否有问题呢 再就是1楼说的修改 SQL 为:insert into users(userid,username,userage) values(null,#{username},#{userage}); 这种方式将参数自动匹配到手动指定的字段顺序,推荐使用这个。

img


在这个位置时这个对象的值正确的话,那换一下SQL里值的顺序insert into users values(null,#{username},#{userage});

问题不在于你取的值,你从前端拿到的值是正确的,问题出在你的SQL上面:
你看一下你的列定义顺序,也就是查出来的列顺序,分别是第一个userid,第二个userage,第三个username。然后再看你的SQL:

 insert into users values(null,#{username},#{userage});

并没有指定列顺序,那么就解析器就会默认列顺序为定义顺序,所以这个SQL等价于:

 insert into users(userid,userage,username) values(null,#{username},#{userage});

这就会导致name存到age里面, age存到name里面。因此你需要修改你的SQL,指定列顺序:

insert into users(userid,username,userage) values(null,#{username},#{userage});

Mapper里字段顺序需调整

修改一下sql语句,
insert into users(userid,username,userage) values(null,#{username},#{userage});

推荐使用 insert into tablename ( 字段1,字段2) values(参数1,参数2)

insert into users values(null,#{userage},#{username});

Java中实体类定义的属性名 与 MySQL表中定义的字段名顺序不一样引起。

另,以下写法很不规范

insert into 表名 values(值1,值2,值3);

强烈建议加上字段名,参数与之一一对齐,不仅直观,同时避免出错。

insert into 表名(字段名1, 字段名2, 字段名3) values(参数值1, 参数值2, 参数值3);

1、调整mapper中对应的表字段顺序
2、insert into 表名(字段名1, 字段名2, 字段名3) values(参数值1, 参数值2, 参数值3);

user 表 只有3个字段,id 是自增的,所以: mapper 文件sql 文 去掉null; 另外 你实体类要和你的参数名称对应起来。