SpringBoot使用JDBC出现Bad SQL Grammar Exception问题求助
问题分析与解决
核心问题1:关键字冲突
user是MySQL的保留关键字,MySQL Workbench对关键字的兼容性处理更宽松,但JDBC驱动解析时会将其识别为关键字而非表名,直接触发语法错误。需要用反引号将表名包裹,明确标识为数据库表。
核心问题2:SQL语句格式与拼接隐患
- 你测试的硬编码SQL末尾带分号
;,部分JDBC驱动不允许SQL语句携带末尾分号,这会被判定为非法语法。 - 注释掉的字符串拼接写法存在致命问题:如果参数包含单引号、特殊字符,会直接破坏SQL语法结构,触发语法错误,同时还会引发SQL注入风险,这种写法绝对不能使用,必须用参数化查询替代。
修正后的代码
public int fetchUserByEmailAndPassword(String email, String password) { try { // 用反引号包裹user表名避免关键字冲突,去掉末尾分号,使用参数化占位符 String sql = "SELECT userId FROM authentication.`user` WHERE email= ? AND password= ?"; return getJdbcTemplate().queryForObject(sql, new Object[]{email, password}, Integer.class); } catch(EmptyResultDataAccessException e) { return 0; } catch(Exception e) { System.out.println(e); return 0; } }
额外说明
- 参数化查询是JDBC操作的标准规范,既能彻底避免语法错误,又能防范SQL注入攻击。
- 若问题仍存在,可开启SpringBoot的SQL日志打印实际执行语句,对比Workbench中运行的语句,排查是否存在数据库驱动版本、连接配置(如字符集)的差异。
内容的提问来源于stack exchange,提问作者Mishaal Naeem
相关产品推荐
相关产品推荐

