无法使用 executeQuery() 发出数据操作语句

Posted

技术标签:

【中文标题】无法使用 executeQuery() 发出数据操作语句【英文标题】:Cannot issue data manipulation statements with executeQuery() 【发布时间】:2009-12-15 06:44:39 【问题描述】:

mysql 中,我有两个表,tableAtableB。我正在尝试执行两个查询:

executeQuery(query1) 
executeQuery(query2)

但我收到以下错误:

can not issue data manipulation statements with executeQuery().

这是什么意思?

【问题讨论】:

除了通过 JDBC - MySQL 管理员之外,您是否可以访问 MySQL?还是命令行? 我可以访问 mysql 管理员。但是要求是这样的。 mysql 数据库将使用 mysql admin 创建、修改、更新等,但之后所有操作都需要使用 java 完成。 在创建数据库的脚本中包含索引创建比通过 JDBC 更好,可能在您已经使用它们之后。 【参考方案1】:

要操作数据,您实际上需要executeUpdate() 而不是executeQuery()

这是来自executeUpdate() javadoc 的摘录,它本身就是一个答案:

执行给定的 SQL 语句,可能是 INSERT、UPDATE 或 DELETE 语句或不返回任何内容的 SQL 语句,例如 SQL DDL 语句。

【讨论】:

【参考方案2】:

执行DML语句时,应使用executeUpdate/execute而不是executeQuery

这是一个简短的比较:

【讨论】:

这很有帮助。谢谢@JaskeyLam【参考方案3】:

如果你使用的是spring boot,只需添加一个@Modifying 注解即可。

@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();

【讨论】:

for delete statement in spring boot repository @Transactional 会有所帮助 codar.club/blogs/5cd7f06bec80a.html 解释了修改、事务和查询注释的用法。我使用以下方法解决了我的问题:@Modifying(clearAutomatically = true) @Transactional 就在定义我的删除查询的@Query 注释上方 正是我想要的【参考方案4】:

对于删除查询 - 在 @Query 之前使用 @Modifying@Transactional,例如:-

@Repository
public interface CopyRepository extends JpaRepository<Copy, Integer> 

    @Modifying
    @Transactional
    @Query(value = "DELETE FROM tbl_copy where trade_id = ?1 ; ", nativeQuery = true)
    void deleteCopyByTradeId(Integer id);


它不会给出java.sql.SQLException: Can not issue data manipulation statements with executeQuery() 错误。

编辑:

由于这个答案得到了很多人的支持,我也会向您推荐文档以获得更多理解。

@Transactional

By default, CRUD methods on repository instances are transactional. For read operations, 
the transaction configuration readOnly flag is set to true. 
All others are configured with a plain @Transactional so that default transaction 
configuration applies.

@Modifying

Indicates a query method should be considered as modifying query as that changes the way 
it needs to be executed. This annotation is only considered if used on query methods defined 
through a Query annotation). It's not applied on custom implementation methods or queries 
derived from the method name as they already have control over the underlying data access 
APIs or specify if they are modifying by their name.

Queries that require a @Modifying annotation include INSERT, UPDATE, DELETE, and DDL 
statements.

【讨论】:

【参考方案5】:

使用executeUpdate() 发出数据操作语句。 executeQuery() 仅适用于 SELECT 查询(即返回结果集的查询)。

【讨论】:

【参考方案6】:

这就是executeUpdate 的用途。

这里是一个非常简短的区别总结:http://www.coderanch.com/t/301594/JDBC/java/Difference-between-execute-executeQuery-executeUpdate

【讨论】:

【参考方案7】:

此代码对我有用:我通过 INSERT 设置值并通过 SELECT 获取该值的 LAST_INSERT_ID();我使用 java NetBeans 8.1、MySql 和 java.JDBC.driver

                try 

        String Query = "INSERT INTO `stock`(`stock`, `min_stock`,   
                `id_stock`) VALUES ("

                + "\"" + p.get_Stock().getStock() + "\", "
                + "\"" + p.get_Stock().getStockMinimo() + "\","
                + "" + "null" + ")";

        Statement st = miConexion.createStatement();
        st.executeUpdate(Query);

        java.sql.ResultSet rs;
        rs = st.executeQuery("Select LAST_INSERT_ID() from stock limit 1");                
        rs.next(); //para posicionar el puntero en la primer fila
        ultimo_id = rs.getInt("LAST_INSERT_ID()");
         catch (SqlException ex)  ex.printTrace;

【讨论】:

【参考方案8】:
@Modifying
@Transactional
@Query(value = "delete from cart_item where cart_cart_id=:cart", nativeQuery = true)
public void deleteByCart(@Param("cart") int cart); 

不要忘记在@query 之前添加@Modifying 和@Transnational。它对我有用。

要使用带有 JPA 的本机查询删除具有某些条件的记录,上述注释很重要。

【讨论】:

【参考方案9】:

executeQuery() 返回一个ResultSet。我对 Java/MySQL 不太熟悉,但要创建索引,您可能需要 executeUpdate()

【讨论】:

它不需要ResultSet。相反,它返回 ResultSet 它期望来自数据库的结果集就是我的意思。【参考方案10】:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java_swing_db", "root", "root");

Statement smt = conn.createStatement();

String sql = "SELECT * FROM `users` WHERE `email` = " + email + " AND `password` = " + password + " LIMIT 1;";

String registerSql = "INSERT INTO `users`(`email`, `password`, `name`) VALUES ('" + email + "','" + password + "','" + name + "')";

System.out.println("SQL: " + registerSql);
            
int result = smt.executeUpdate(registerSql);
System.out.println("Result: " + result);

if (result == 0) 
   JOptionPane.showMessageDialog(this, "This is alredy exist");
 else 
  JOptionPane.showMessageDialog(this, "Welcome, Your account is sucessfully created");
  App.isLogin = true;
  this.dispose();
  new HomeFrame().show();

conn.close();

【讨论】:

【参考方案11】:

除了括号中的 executeUpdate() 之外,您还必须添加一个变量才能使用 SQL 语句。

例如:

PreparedStatement pst =  connection.prepareStatement(sql);
int numRowsChanged = pst.executeUpdate(sql);

【讨论】:

您好!请注意,有关 Stack Overflow 的问题和答案必须用英文书写(否则它们会面临删除和/或谷歌翻译的风险)。干杯! (Hola! Como las cabezas para arriba, las preguntas y respuestas sobre Stack Overflow debe estar escrito en Inglés (de lo contrario corren el riesgo de eliminación y / o Google Traductor)。¡Salud!)跨度>

以上是关于无法使用 executeQuery() 发出数据操作语句的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 executeQuery() 发出数据操作语句 [重复]

java.sql.SQLException:无法使用 executeQuery() 发出数据操作语句。 23

无法使用 executeQuery() 发出数据操作语句 [重复]

SQLException:“无法使用 executeQuery() 发出数据操作语句”[重复]

无法从 Statement.executeQuery() 中获取选定的列

Can not issue data manipulation statements with executeQuery() 异常处理