1.报错
本地SpringBoot服务启动后,访问一个接口,接口需要向mysql中更新数据,结果报错
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: INSERT command denied to user 'root'@'ip'....
2.分析和解决
2.1 原因1-配置错误
看报错是向数据库中插入数据出错,检查数据库地址、端口号、数据库名称、用户名、密码等基本信息,发现无误,说明不是这里的问题。
2.2 原因2-语法错误
网上查找原因时发现一部分人遇到同样报错是因为语法出错,将mysql关键字用于表名、字段名等,例如表名写做order、字段名写做like等;或者是在写mapper.xml时不小心写错了哪里。
因为我的项目直接使用MBP,mapper由其直接生成,不存在语法错误,字段名也不涉及关键字,所以也不是这里的问题。
2.3 原因3-字段名映射
数据库表名是下划线,例如user_id,java中对象属性名是驼峰命名,例如userId,所以需要在application.yml中指明这种映射,否则可能找不到对应的字段:
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
但是不是本项目的问题。
2.4 原因4-权限不足
如果字段、名称、配置等均无误,可能是权限不足。

通过该指令可以看出,该数据库允许其所在的机器的客户端访问,但是我使用的mysql在服务器上,项目在本地,而项目每次访问服务器的mysql都会随机生成一个ip地址,所以我们允许所有ip对该数据库操作就可以了
GRANT ALL PRIVILEGES ON database_name.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
然后通过指令查看更新后的权限信息:
show grants for 'root'@'%';
此时再次访问该接口,成功。
3.补充
今天使用idea连接远程mysql遇到一个新的报错:
Access denied for user 'root'@'ip'(using password: YES)
感觉应该也是权限问题,打开服务器控制台修改权限时报错如下:
ERROR 1133 (42000): Can't find any matching row in the user table

是因为MySQL不允许创建没有密码的用户连接,所以把指令更改一下就好了:
grant all privileges on websocket.* to 'root'@'%' identified by 'root';