让我尝试说明我如何确切地得到此错误。
我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询问或检查完整代码
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
错误信息java.sql.SQLException: Can not issue data manipulation statements with executeQuery();
表明您尝试使用executeQuery()
方法执行了一个数据操作语句(如INSERT, UPDATE, DELETE等),而这个方法是专门用于执行查询并期望返回结果集(ResultSet)的。
从您提供的代码片段来看,问题可能并不直接出在展示的这部分逻辑上,因为您确实是在使用executeQuery()
来执行一个SELECT查询。不过,有几点需要注意和检查:
SQL注入风险:您的代码中直接将查询字符串拼接到SQL中,这是非常不安全的做法,容易遭受SQL注入攻击。建议使用PreparedStatement的参数化查询方式。
重复执行查询:在您的DBConnect.list
方法里,您实际上对preparedStatement.executeQuery(query)
调用了两次,一次在创建PreparedStatement时,另一次在执行时。这可能是无害的,但多余且不必要,应该只调用一次。
异常处理:您的异常打印逻辑中,System.out.print("Error" + ex);
应该是 System.out.println("Error: " + ex.getMessage());
以正确打印异常信息。
确保查询无误:虽然看起来像是一个查询操作,但请确认您的query
变量在实际运行时没有被意外修改为其他类型的操作(比如更新或删除)。
资源管理:虽然您使用了try-with-resources来自动关闭资源,这是一个好习惯,但请注意检查是否所有数据库连接、Statement和ResultSet都正确地在finally块或try-with-resources中关闭了,尽管现代IDE通常会提示这类问题。
如果以上都没有问题,那么可能需要检查外部因素,比如数据库驱动版本兼容性问题,或者是否有其他并发操作影响了数据库状态。鉴于您提到的错误信息与当前展示的代码行为不符,考虑检查整个应用中是否有其他地方执行了不当的SQL操作。