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
相关产品推荐
相关产品推荐

