2016-07-18 188 views
1

我想从hibernate中的基本DELETE列插入-regBroj参数是一样的基地。无法删除表单数据库SQLGrammarException

这是我在控制方法deleting.But我不断得到 SQLGrammarException: 产生的原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知列 'BG026CH' 在 'where子句'

这个'BG026CH'是regBroj的值,我用它作为参数来查找数据库中的车辆并删除它。并且我将它插入到adminPage中的文本区域。

public String izbrisi(String regBroj) { 
    List<Vozilo> lista = listaj(); 
     Session s = HibernateUtil.getSessionFactory().getCurrentSession(); 
     Transaction t = s.beginTransaction(); 

     for (int i = 0; i < lista.size(); i++) { 
      if (regBroj .equals(lista.get(i).getRegBroj())) { 
       String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk=" + regBroj + ""; 
       Query q = s.createQuery(izbrisiquery); 
       int a = q.executeUpdate(); 
       t.commit(); 
       return "adminPage"; 
      } 
     } 
     t.commit(); 
     return "error"; 


    } 
+0

下面的@Dhaval给出的答案应该可以解决您的直接问题,但是您应该严格考虑使用预准备语句来避免SQL注入。 –

回答

2

请与其中之一

String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk='" + regBroj + "'"; 
+0

伟大的作品,我忘记添加 - '' - 在我的查询。 – Stanimir

2

您应该考虑使用准备好的陈述,因为它们会自动照顾引号转义字段值替换下面的字符串,而他们也将保护您免受SQL注入。

// obtain a Connection object using your Hibernate session, or through some other means 
Connection conn = getDBConnection(); 

for (int i = 0; i < lista.size(); i++) { 
    if (regBroj .equals(lista.get(i).getRegBroj())) { 
     String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk = ?"; 
     PreparedStatement ps = conn.prepareStatement(izbrisiquery); 
     ps.setString(1, regBroj); 
     ps.executeUpdate(); 
     t.commit(); 

     return "adminPage"; 
    } 
} 

要查看恶意用户可以注入SQL如何工作,或如何破坏了Korisnik表,假设有人黑客的UI传递的'' OR TRUE一个值brojLK。这是导致DELETE声明会是什么样子:

DELETE FROM Korisnik WHERE brojLk = '' OR TRUE 

换句话说,这种注射查询会放弃你的整个表!准备好的语句会扼杀这个输入,黑客不会执行查询。

+0

这可能是一个愚蠢的问题。你知道一些好的教程准备好的声明 – Stanimir

+0

从[MKYong]开始(http://www.mkyong.com/jdbc/jdbc-preparestatement-example-select-list-of-the-记录/),他们通常很擅长解释事情。 –

+0

@Stanimir除此之外,准备好的语句更适合缓存它。 –