当前位置: 首页 > 知识库问答 >
问题:

JDBC spring中出现错误的Sql语法异常

沃皓轩
2023-03-14

我是第一个

org.springframework.jdbc.BadSqlGrammarException:准备状态回调;错误的SQL语法[选择cid,临床医生代码,密码,名字,临床医生的姓氏,其中临床医生代码= ?]; 嵌套异常com.mysql.jdbc.exceptions.jdbc4. MySQLSyntaErrorException:字段列表中的未知列“临床医生”

以下代码出错,您还可以在屏幕截图中看到Table,除了cid所有其他属性都是VARCHAR(45)

行映射器类

public class CClinicianRowMapper implements RowMapper {

@Override
public Object mapRow(ResultSet rs, int line) throws SQLException {
    CClinicianResultSetExtractor extractor = new CClinicianResultSetExtractor();
    return extractor.extractData(rs);
}

}

结果提取器类公共类CClinicianResultTextRactor实现ResultTextRactor{

  @Override
  public Object extractData(ResultSet rs) throws SQLException {
    CClinician clinician = new CClinician();
    clinician.setCid(rs.getLong("cid"));
    clinician.setClinicianCode(rs.getString("clinician-code"));
    clinician.setPassword(rs.getString("password"));
    clinician.setFirstName(rs.getString("first-name"));
    return clinician;
  }

}

用于从表中选择数据的类

public List<CClinician> findClinician(CClinician _clinician) {
    // TODO Auto-generated method stub
    JdbcTemplate select = new JdbcTemplate(dataSource);
    try
    {
    return select.query("select cid, clinician-code, password, first-name, last-name from Clinician where clinician-code= ?",
            new Object[] {_clinician.getClinicianCode()}, new CClinicianRowMapper());

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return null;
}

共有3个答案

顾烨磊
2023-03-14

正确检查查询语法是否缺失;“错误的SQL语法异常”仅与SQL查询中的语法错误有关<在使用Spring JDBC时,我在以下代码中遇到了相同的错误:

String query= "update student set name=?, city=?, where id=?"; // due to extra comma after city=?,

将代码更改为

String query= "update student set name=? city=?, where id=?"; 

错误已解决。

张嘉佑
2023-03-14

为了在列名中使用破折号,需要使用反勾号对其进行转义。

"SELECT cid, `clinician-code`, password, `first-name`, `last-name` 
     FROM Clinician 
     WHERE `clinician-code` = ?"
孙泉
2023-03-14

我知道这是一条老线索,但希望任何遇到这个问题的人都会发现这个答案很有用。

我在我的spring应用程序中也遇到了同样的异常。根据输出,我认为我的查询有语法问题。事实证明,我的映射器方法中确实存在语法错误。我遇到这个问题是因为我最初创建的Product类的字段名与列名不同。

public class ProductMapper implements RowMapper<Product> {
public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
  Product product = new Product();
  product.setProduct_id(rs.getInt("product_id"));  //was id.  was causing BadSqlGrammarException
  product.setProduct_name(rs.getString("product_name")); //was name.  was causing BadSqlGrammarException
  product.setPrice(rs.getDouble("price"));
  product.setQuantity(rs.getInt("quantity"));
  return product;
   }
}

一旦我做了上述更改(我的字段命名为product_id和product_name),我的应用程序就可以正常工作了。请记住,您对列名或java字段所做的任何更改不仅应该对您的查询语句进行,还应该对您的映射器方法进行。我看到OP这样做是正确的,但我认为值得重申。我希望有人觉得这很有帮助。

 类似资料:
  • 问题内容: 嗨,我无法执行以下功能而没有遇到以下异常。我不确定为什么会这样。我认为这可能与报价有关。如果有问题,我正在使用derby数据库。 这是我尝试执行的以下代码: 这是例外: 问题答案: 您的代码中有两个问题: SQL语句最后不需要分号。它将使代码失败。 该代码易于进行SQL注入并且难以维护。请改用: 这应该是工作代码: 在 大 平原字符串连接而这种做法对于你的情况之间的区别就是参数会逃跑任

  • 我在第7行遇到语法错误-“BEGIN”for while- 有什么建议或建议吗?

  • 问题内容: 下面是用户单击“ 应用余额” 时的代码 。 这适用于第一部分,用户的余额更新很好,但是当我尝试执行第二条语句时,出现SQL语法错误。是什么原因引起的? 下面是运行此命令时得到的堆栈跟踪。 问题答案: 您的第二个查询缺少子句中的右括号。 代替直接在查询中附加参数,请使用参数化查询。 这样看起来会更干净,更容易编写。最重要的是,它将使您免受SQL Injection 攻击。 这是用于参数化

  • 我需要帮助。我正在开发上传文本文件的应用程序。就在这一刻,我遇到了错误,我不能清楚地理解。下面是我的代码: 使用TextFilesDB; 创建表(int(11)NOT NULL AUTO_INCREMENT, varchar(45)NOT NULL,varchar(45)默认NULL,varchar(45)默认NULL,mediumblob,主键()))

  • 我有以下代码: 行:public static void main(String args[}){I得到三个错误:1.令牌“void”的语法错误,@expected 2.令牌的语法错误,classheader的结果相反3.令牌的语法错误,结构放错了 希望你们能帮帮我。 提前道谢。

  • 你好,我想用SQLite数据库创建一个JTable。数据应该来自一个SQLite数据库,并存储在这个。现在,在文本字段中输入新的细节。但是,我得到错误消息:“java.sql.SQLException: near”(“:语法错误” 怎么了? 公共静态void main(String args[]){