2017-02-15 117 views
1

我想查询数据库使用java,我不明白这个函数的问题。它返回一个垃圾值。Mysql数据库从表中选择字段语句java

我只想从MySQL数据库中检索与first_name匹配的值。

public List<Customer> select(String cusDB) { 
    return jdbcTemplate.query(
      "SELECT id, first_name, last_name FROM customers WHERE first_name= cusDB", 
      (rs, rowNum) -> new Customer(rs.getLong("id"), 
        rs.getString("first_name"), rs.getString("last_name"))); 
} 
+0

如果这会返回“垃圾值”,我会很惊讶,我很快就会期望有关于未知列“cusDB”或类似的异常。 –

回答

1

您不能只在查询字符串中具有Java参数的名称。您需要明确提供参数给查询。

public List<Customer> select(String cusDB) { 
    return jdbcTemplate.query(
      "SELECT id, first_name, last_name FROM customers WHERE first_name= ?", 
      new Object[] { cusDB }, 
      (rs, rowNum) -> new Customer(rs.getLong("id"), 
        rs.getString("first_name"), rs.getString("last_name"))); 
} 

也就是说,你介绍的查询字符串中的参数占位符(?),并为每个参数占位符添加参数值的数组的方法调用(一个值:要做到这一点,更改代码在你的查询中)。另见JdbcTemplate documentationJdbcTemplate.query(String sql, Object[] args, RowMapper<T> rowMapper)的文件。

3

您可以使用两种方法,第一是concatinate与FIRST_NAME查询要搜索:

"SELECT id, first_name, last_name FROM customers WHERE first_name= '" + cusDB + "'" 

二使用PrepapredStatement像这样:

"SELECT id, first_name, last_name FROM customers WHERE first_name= ?" 
st.setString(1, cusDB); 

但我没有看到有关PrepapredStatement的任何标志,因此您可以在这里了解到Prepared Statement doc

编辑

像@安德烈·施尔德在评论说:

你很容易受到SQL注入,例如用'; delete from customers; //will remove all customers from your database一个名字。始终(tm)使用准备好的语句

+0

不要使用第一个版本,你很容易受到SQL注入的影响,例如带有''的名字;从客户删除; //'将从您的数据库中删除所有客户。总是(tm)使用预先准备的语句 –

+0

是@AndréSchild因为我建议使用PreparedStement,我想他错过了一些关于String concatenation的事情,因为我发布了第一个非常感谢你 –