无法在 sqlite 数据库查询(JAVA)中使用输入作为参数

Posted

技术标签:

【中文标题】无法在 sqlite 数据库查询(JAVA)中使用输入作为参数【英文标题】:Not able to use input as parameter in sqlite database query (JAVA) 【发布时间】:2016-04-13 09:22:35 【问题描述】:

我将尝试更好地解释我的标题,但首先是我在这里尝试做的一些背景。我正在开发一个游戏,我需要在本地数据库中搜索用户给程序提供的单词。这样做是为了验证用户是否确实使用了符合游戏规则的单词。在这段代码中,我想搜索一个国家数据库,以验证用户实际上给了游戏一个国家而不是一个随机词。

由于我对 java 还很陌生,并且刚刚开始了解 SQLite 和 JDBC,所以我在互联网上搜索了如何查询我的数据库,我发现了一些有用的代码,我根据自己的喜好进行了调整。现在的问题是,从一开始,主方法就会建立到数据库的连接,然后从数据库中挑选出每一件事。不是我真正的意图,所以我想我可以向用户询问一些输入,将其存储在一个字符串中(下面称为“单词”)并使用 SQL 命令 SELECT * FROM [table] WHERE [column] LIKE [条件]

当我将新创建的字符串“word”作为条件并尝试搜索数据库时,程序似乎无法识别单词的本质,甚至根本无法使用它。 Intellij 将“单词”标记为灰色,因此据说它从未使用过。

为什么 .executeQuery(SQL-command) 不会识别它应该使用 word 作为参数?我怎样才能使这项工作,以便用户可以决定搜索什么,而无需自己显式输入 SQL 命令?

代码:

package SQL;

//STEP 1. Import required packages
import javax.swing.*;
import java.sql.*;

public class SQLTests 

    public static void main(String[] args) throws Exception 
        String word = JOptionPane.showInputDialog(null, "Input Country name:", 
                                                  "Country search", 1);
        Class.forName("org.sqlite.JDBC");
        Connection connection = DriverManager.getConnection("jdbc:sqlite:countries.db");
        Statement stat = connection.createStatement();


        ResultSet rs = stat.executeQuery("select * from Country where name like word;");
        while (rs.next()) 
            System.out.println(rs.getString("name"));
        
        rs.close();
        connection.close();
    

【问题讨论】:

也许:ResultSet rs = stat.executeQuery("select * from Country where name like " + word + ";"); 首先,当您的查询应该搜索“word”时,您必须在其周围放置引号“,当您准确搜索孔词“word”时,您可以使用等于“=”参数. 如果你想在某个地方搜索字符串部分“word”,你必须使用“%”作为通配符。 如果你希望“word”是一个参数,你可以用其他东西替换它,然后用问号“?”替换它。并创建查询字符串的准备语句,然后您可以在其上将参数设置为包括问号 @ReneM。我注意到引号丢失了。我的错。由于我一直在搜索整个单词,因此我将尝试使用 equals,并且我假设您的意思是将其用作:SELECT * FROM table WHERE name = "word"。 是的,这将是精确字符串比较和区分大小写的正确查询。但正如我所说,学习如何使用准备好的语句。 docs.oracle.com/javase/7/docs/api/java/sql/… 【参考方案1】:

不要使用Statement,而是使用PreparedStatement

PreparedStatement stat = connection.prepareStatement("select * from Country
                          where name like ?");
stat.setString(1, word);
ResultSet rs = stat.executeQuery();

同时检查Difference Between Statement and PreparedStatement

希望它会起作用。

【讨论】:

以上是关于无法在 sqlite 数据库查询(JAVA)中使用输入作为参数的主要内容,如果未能解决你的问题,请参考以下文章

尝试编写使用开关从 sqlite 数据库中选择数据的 java 代码

SQLite无法在频繁的“SELECT”查询中打开数据库文件(代码14)

SQLITE 查询性能差异太大而无法可靠或理解

无法使用 Entity Framework 5 在 SQLite 数据库中插入记录

使用 AsyncTask 运行 Sqlite ArrayList<Float> 查询

FMDB MODIFY 查询无法在现有 SQLite 数据库中设置约束