开发者社区 问答 正文

不能使用SELECT *通过executeQuery()发出数据操作语句

让我尝试说明我如何确切地得到此错误。

我credentials在数据库中表

凭证表

我有CredentialsEntity.java类

...
@Entity
@Table(name = "credentials", schema = "project")
public class CredentialsEntity {
    private int id;
    private String userName;
    private String password;
    ...

我也有DBConnect.java类,其中的一部分是

public static List<CredentialsEntity> list(String query){
    List<CredentialsEntity> credencials = new ArrayList<>();
    try (
            Connection conn = DriverManager.getConnection(DEFAULT_DB_URL, DEFAULT_user, DEFAULT_pass);
            PreparedStatement preparedStatement = conn.prepareStatement(query);
            ResultSet resultSet = preparedStatement.executeQuery(query)
    ){
        while (resultSet.next()){
            CredentialsEntity credentialsEntity = new CredentialsEntity();
            credentialsEntity.setId(resultSet.getInt("id"));
            credentialsEntity.setUserName(resultSet.getString("userName"));
            credentialsEntity.setPassword(resultSet.getString("password"));
            credencials.add(credentialsEntity);
        }
    }catch (Exception ex){
        System.out.print("Error" + ex);
    }
    return credencials;
}

在Main.java中,我这样调用DBConnect.list

query = "select * from credentials";
List<CredentialsEntity> credentials = DBConnect.list(query);
System.out.print(credentials.toString() + "\n");

错误是:

Errorjava.sql.SQLException: Can not issue data manipulation statements with executeQuery().

因此,我正在正确连接到数据库,并且正在正确更新表。问题在于将数据库记录保存到ArrayList中。我不知道为什么我不能通过executeQuery()

如果您还有其他疑问,可以通过https://github.com/DawidGrzejek/TheChoosenOne询问或检查完整代码

展开
收起
垚tutu 2019-12-19 16:01:35 667 分享 版权
阿里云 AI 助理回答

错误信息java.sql.SQLException: Can not issue data manipulation statements with executeQuery();表明您尝试使用executeQuery()方法执行了一个数据操作语句(如INSERT, UPDATE, DELETE等),而这个方法是专门用于执行查询并期望返回结果集(ResultSet)的。

从您提供的代码片段来看,问题可能并不直接出在展示的这部分逻辑上,因为您确实是在使用executeQuery()来执行一个SELECT查询。不过,有几点需要注意和检查:

  1. SQL注入风险:您的代码中直接将查询字符串拼接到SQL中,这是非常不安全的做法,容易遭受SQL注入攻击。建议使用PreparedStatement的参数化查询方式。

  2. 重复执行查询:在您的DBConnect.list方法里,您实际上对preparedStatement.executeQuery(query)调用了两次,一次在创建PreparedStatement时,另一次在执行时。这可能是无害的,但多余且不必要,应该只调用一次。

  3. 异常处理:您的异常打印逻辑中,System.out.print("Error" + ex); 应该是 System.out.println("Error: " + ex.getMessage()); 以正确打印异常信息。

  4. 确保查询无误:虽然看起来像是一个查询操作,但请确认您的query变量在实际运行时没有被意外修改为其他类型的操作(比如更新或删除)。

  5. 资源管理:虽然您使用了try-with-resources来自动关闭资源,这是一个好习惯,但请注意检查是否所有数据库连接、Statement和ResultSet都正确地在finally块或try-with-resources中关闭了,尽管现代IDE通常会提示这类问题。

如果以上都没有问题,那么可能需要检查外部因素,比如数据库驱动版本兼容性问题,或者是否有其他并发操作影响了数据库状态。鉴于您提到的错误信息与当前展示的代码行为不符,考虑检查整个应用中是否有其他地方执行了不当的SQL操作。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: