You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:54:56