向表中所有的列插入数据(插入多行数据):
insert into 表名 values
(列值1,列值2,列值3...列值n),
(列值a,列值b,列值c...列值n),
...........
(列值A,列值B,列值C...列值N)
向表中指定的列插入数据(插入单行数据):
insert into 表名(列名1,列名2,列名3...列名n) value (列值1,列值2,列值3...列值n)
注意:
- 表名()中列名必须跟values()中列值,一一对应
- 使用INSERT INTO table_name指定要添加记录的表名。
- 在VALUES关键字后,按照表中定义的列的顺序,用逗号分隔添加要插入的值。
- 可以选择指定列名,也可以直接提供值
- 虽然在数据库中,两者可能只是效率上有差距,但是在Spring框架中,进行单行数据插入最好还是使用value,插入多行数据才使用values,否则,会导致很多奇怪的问题出现。
以下是结合Spring框架所产生的问题以及解决方法。
在使用SpringMVC做数据库增删改查的业务中,尝试插入业务,于是在controller里面使用
@PostMapping
public type save(@Validated @RequestBody User user, BindingResult result){
if (result.hasErrors()){
return xxx;
}
xxxx;
return xxx;
}
进行参数传递,此时mapper里是这样的:
<insert id="insert">
insert into user(id,age,name) values (#{id},#{age},#{name})
</insert>
使用postman进行接口测试时,控制台总是报错,提示:JSON parse error: Invalid UTF-8 start byte 0x80.
postman显示400,由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。
于是,开始查找是否是注解有问题,可是查阅了各种资料并未发现其问题。
此时,甚至怀疑是否又是Spring版本问题导致的,但是项目使用的版本全是最新版本,应该没有版本不兼容问题。
在尝试了其他方法(方法注解设置编码格式等等,但参数上的注解已经告诉Spring框架默认的处理方式是能够满足需求的),问题仍然未得到解决。
最终在maper里找到了问题所在,insert字句使用时,可以使用value与values,可我的业务是单条执行,按照道理来说并不需要values,于是尝试修改values为value,问题得到解决。
<insert id="insert">
insert into user(id,age,name) value (#{id},#{age},#{name})
</insert>
但此时,查找文章,value和values并无冲突之处,但在SpringMVC框架中,做参数传递时,mapper里面还是按照要求书写,否则可能会产生意想不到的问题。
参考文章:
MySQL insert value与values - 小白菜» - 博客园
Mysql插入语句之value与values区别_mysql values和value-优快云博客
感谢大佬