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