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

Spring MVC CRUD项目报BadSqlGrammarException错误,求解决

解决Spring MVC中JDBC的BadSqlGrammarException错误

嘿,这个问题我太熟悉了!咱们先揪出问题的根源:

看错误日志里的SQL语句:select * from assignment where username=reza——这里的reza没有被单引号包裹,MySQL会把它当成列名来解析,自然就抛出了Unknown column 'reza' in 'where clause'的错误。这通常是因为你在DAO里直接拼接字符串到SQL语句中,而没有用Spring推荐的参数绑定方式。

错误的写法(大概率是你的代码问题)

假设你的DAO代码片段是这样的:

@Override
public List<Assignment> findByUsername(String username) {
    String sql = "select * from assignment where username=" + username;
    return jdbcTemplate.query(sql, new AssignmentRowMapper());
}

这种直接拼接字符串的方式不仅会导致语法错误,还会带来SQL注入的安全风险,绝对要避免!

正确的解决方案:使用参数绑定

Spring JDBC提供了安全的参数绑定方式,会自动帮你处理字符串的引号和转义,推荐两种写法:

1. 使用占位符?的JdbcTemplate查询

@Override
public List<Assignment> findByUsername(String username) {
    // 用?作为参数占位符
    String sql = "select * from assignment where username=?";
    // 传入参数数组,Spring会自动处理参数格式
    return jdbcTemplate.query(sql, new Object[]{username}, new AssignmentRowMapper());
}

2. 使用命名参数(更直观)

如果参数较多,推荐用NamedParameterJdbcTemplate,参数名可以和SQL里的占位符对应,可读性更强:

@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

@Override
public List<Assignment> findByUsername(String username) {
    String sql = "select * from assignment where username=:username";
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("username", username);
    return namedParameterJdbcTemplate.query(sql, paramMap, new AssignmentRowMapper());
}

为什么要这么做?

  • 彻底解决SQL语法错误:Spring会自动为字符串参数添加单引号,避免MySQL把值当成列名
  • 防范SQL注入:参数绑定会对特殊字符进行转义,避免恶意SQL语句执行
  • 代码更易维护:参数和SQL逻辑分离,可读性更高

内容的提问来源于stack exchange,提问作者Agnes Palit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:31:49