Mysql DB select from table where field语句java

Posted

技术标签:

【中文标题】Mysql DB select from table where field语句java【英文标题】:Mysql DB select from table where field statement java 【发布时间】:2017-02-15 09:05:24 【问题描述】:

我正在尝试使用 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")));

【问题讨论】:

如果这会返回“垃圾值”,我会感到非常惊讶,我会更早地期待未知列 cusDB 或类似的异常。 【参考方案1】:

您可以使用两种方法,第一种是将您的查询与您要搜索的名字连接起来:

"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 的名字。 Always(tm) 使用准备好的语句

【讨论】:

不要使用第一个版本,您很容易受到 SQL 注入的攻击,例如带有 '; delete from customers; // 的名字将从您的数据库中删除所有客户。 Always(tm) 使用准备好的语句 是的@AndréSchild 我建议使用 PreparedStement,我认为他错过了一些关于字符串连接的事情,因为我发布了第一个非常感谢你【参考方案2】:

您不能只在查询字符串中包含 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&lt;T&gt; rowMapper) 的文档。

【讨论】:

以上是关于Mysql DB select from table where field语句java的主要内容,如果未能解决你的问题,请参考以下文章

从 Zend_Db_Table_Select 获取表别名

Mysql select id from table1 and select count(id) from table2

使用 ENUM 字段复制 mysql 表

MYSQL:SELECT * FROM customer_table 隐藏 customer_password? [复制]

MYSQL中 select * from table1 t1, table2 t2 where t1.name= t2.name

MYSQL IF SELECT COUNT() 大于零 select * from table else return nothing found