前端代码就是一个
<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>
原因在于表结构中的字段顺序和 mybatis xml 文件中的 sql values 中指定的字段顺序不一致,有两种解决方案。
insert into users values(null,#{userage},#{username});
调换了 sql 中 username,userage 的顺序,将 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}); 这种方式将参数自动匹配到手动指定的字段顺序,推荐使用这个。
问题不在于你取的值,你从前端拿到的值是正确的,问题出在你的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; 另外 你实体类要和你的参数名称对应起来。