即使db中有实体,SQL语句也会失败

时间:2012-09-26 16:15:16

标签: java sql eclipse hsqldb

我有一个名为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使用不当?请告诉我,以便我可以从中吸取教训?

3 个答案:

答案 0 :(得分:5)

您生成的SQL语句无效,name参数

没有引号
String query = "SELECT * FROM Produkt WHERE name='" + name + "'";
                                                 ^--      ^^^^^^

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

而是使用PreparedStatement和参数,然后将参数的值设置为您要查找的名称。例如:

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用户指南的Data Access and Change部分;有关更多常规信息,请参阅JDBC tutorial on prepared statements