1

我有一张名为 Produkt 的表,在这张表中有几个名为 test 的产品。

当我想做那个代码时:

public Produkt findByName(String name) throws SQLException{
    log.error("Enter findByName with parameters: " + name);
    PreparedStatement ps;
    ResultSet rs = null;
    String query = "SELECT * FROM Produkt WHERE name=" + name;
    ps=hsqlmanager.getConnection().prepareStatement(query);
    rs = ps.executeQuery();
    ps.close();
    if(rs.next()) return(new Produkt(rs));
    else return(null);
}

它总是给我一个sql错误:

Exception in thread "main" java.sql.SQLSyntaxErrorException: user
lacks privilege or object not found: TEST   at
org.hsqldb.jdbc.Util.sqlException(Unknown Source)   at
org.hsqldb.jdbc.Util.sqlException(Unknown Source)   at
org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)    at
org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)     at
dao.DAOProdukt.findByName(DAOProdukt.java:157)  at
dao.test_produkt_dao.main(test_produkt_dao.java:23)

为什么?我很欣赏你的回答!!!

更新:

为什么 PS 使用不当?请告诉我,以便我可以从中学习?

4

3 回答 3

5

name您正在生成无效的 SQL 语句,参数周围没有引号

String query = "SELECT * FROM Produkt WHERE name='" + name + "'";
                                                 ^--      ^^^^^^
于 2012-09-26T16:16:32.903 回答
1

您应该正确使用 PreparedStatements 来防止 SQL 注入。它还会在参数周围写上引号,这是必要的。

String query = "SELECT * FROM Produkt WHERE name=?";
PreparedStatement ps=hsqlmanager.getConnection().prepareStatement(query);
ps.setString(1, name);
于 2012-09-26T16:23:39.807 回答
1

您根本不应该在 SQL 中包含该值。除非您在引用时非常小心,否则这样做会引发 SQL 注入攻击。(对于非字符串值,它还引入了潜在不正确的字符串转换。哦,它有效地将代码与数据混合在一起。只需对 SQL 中的变量值说“不”......)

相反,使用 aPreparedStatement和 a 参数,然后将参数的值设置为您要查找的名称。例如:

String query = "SELECT * FROM Produkt WHERE name = ?";
PreparedStatement ps = hsqlmanager.getConnection().prepareStatement(query);
ps.setString(1, name);
ResultSet rs = ps.executeQuery();

请注意,您还应该close()在块中包含语句,finally以避免在引发异常时泄漏资源。

有关 HSQLDB 特定的详细信息,请参阅 HSQLDB 用户指南的数据访问和更改部分,或有关准备好的语句的 JDBC 教程以获取更多通用信息。

于 2012-09-26T16:24:42.917 回答