【问题标题】:Retrieving data from jdbc从 jdbc 中检索数据
【发布时间】:2012-03-27 11:29:41
【问题描述】:

我有一个包含 500 只股票名称的字符串数组。现在我的 mysql 数据库中有一个表,其中包含 1000 多只股票的符号及其名称。我想做的是从我的表中检索这 500 只股票的符号。我试过下面的代码

Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql//localhost/mydatabase","user","pass");
PreparedStatement stmt = conn.prepareStatement("SELECT (NAME) FROM stocks1 WHERE FULLNAME =?"); 
for(int i1=0;i1<i;i1++)
{   
  stmt.setString(1, name[i1]); 


  stmt.addBatch(); 
} 
ResultSet t=stmt.executeQuery(); 
while(t.next())
  System.out.println(t.getString("NAME"));

但它不起作用。什么都没有打印。我认为我在 stmt.addBatch() 中犯了一个错误。另外,如果我希望 name[i1] 后跟通配符(%),我该怎么做。

【问题讨论】:

  • 批处理用于 DML 状态,而不是用于查询。您需要为要检索的每个 ID 运行 SELECT 或使用 WHERE IN (...)(不能在准备好的语句中使用)
  • @Riddhish.Chaudhari- 上述问题的答案中的链接似乎有一些错误。@ahorsewithnoname,- 所以我必须将 select 语句放入 for 循环并运行它。

标签: java mysql jdbc


【解决方案1】:

您可以为字符串数组中的股票创建一个表,并与您的 stock1 表进行连接。

假设您的arraystocks 表名为stockperuser,其中有一列FULLNAME,代码如下所示:

Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql//localhost/mydatabase","user","pass");
PreparedStatement stmt = conn.prepareStatement("SELECT NAME FROM stocks1 WHERE FULLNAME is in (SELECT FULLNAME FROM arraystocks)"); 
ResultSet t=stmt.executeQuery(); 
while(t.next()) {
    System.out.println(t.getString("NAME"));
}

【讨论】:

  • 这意味着创建一个新表。有没有其他方法可以做到这一点。
  • 您可以使用临时表,这些表在关闭事务后会自动删除。但我不确定mysql是否支持这个。但是没有表格,你必须循环,就像你自己提到的那样。如果您的查询对性能至关重要,则必须使用“where in (..)”。但是语句的长度通常是有限的,因此您必须处理大量股票名称,例如一次查询 100 只股票。
  • 我用过你的回答,但它在 is in(SELECT FULLNAME FROM ...) 处引发语法异常。
  • 我没有要测试的数据库。但错误必须是'is in' 只使用在。SELECT NAME FROM stock1 WHERE FULLNAME in (SELECT FULLNAME FROM arraystocks)
  • 出于某种奇怪的原因它什么也没打印。但没问题。我遍历了每个选择查询。我发布了一个问题,但无论如何询问都没有害处。我如何执行不区分大小写的选择
【解决方案2】:

如需包含通配符,可如下图所示。

在您的选择语句中删除 = 并添加 LIKE

PreparedStatement stmt = conn.prepareStatement("SELECT (NAME) FROM stocks1 WHERE FULLNAME LIKE ?");   

在 setString 方法中添加 %。

ps.setString(1, name[i1]+ "%");

另外,对于空行问题,请检查两个比较列的大小写是否相同,它们应该是大写还是小写。 如果不是,那么您可以在比较时进行转换,如下所示。

SELECT (NAME) FROM stocks1 WHERE upper(FULLNAME) LIKE ?   

ps.setString(1, upper(name[i1])+ "%");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2011-11-04
    • 2021-12-06
    • 1970-01-01
    • 2015-01-20
    相关资源
    最近更新 更多