我正在尝试使用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 :(得分:3)
您可以使用两种方法,第一种方法是将查询与要搜索的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
修改强>
就像@AndréSchild在评论中所说:
您很容易受到SQL注入攻击,例如'; delete from customers; //will remove all customers from your database
的名字。始终(tm)使用准备好的陈述
答案 1 :(得分: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
documentation的JdbcTemplate.query(String sql, Object[] args, RowMapper<T> rowMapper)
和文档。