java - 我可以使用 MySQL Connector/J 执行以分号分隔的多个查询吗?

标签 java mysql jdbc

我的 mysql db jdbc 驱动程序版本为 5.1.25。

我想像这样执行sql查询:

statement.execute("select fullName from user where user_id=1; select fullName from user where user_id=2");

我总是收到异常:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select fullName from user where user_id=2' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2758)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:894)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:732)
    at dbViewer.model.UserConnectionManager.retrieveRoutinesNames1(UserConnectionManager.java:622)
    at dbViewer.model.UserConnectionManager.main(UserConnectionManager.java:637)

但是当我从命令行运行相同的查询(用分号分隔)时,它完美地工作并按预期输出两个表。

最佳答案

在大多数数据库的查询中使用 ; 不起作用,因为它通常不是语句语法本身的一部分,而是命令行或脚本输入到单独语句的终止符。命令行或脚本处理器将分号视为语句已完成并可以发送到服务器的信号。

此外,在 JDBC 中,单个语句准备(或执行)应该只是一个实际语句,因此不允许多个语句,因此也不需要有分号,至于某些(大多数?)数据库分号不是语句语法的一部分,包含分号只是一种语法错误。

如果要执行多个语句,则需要使用单独的执行。从技术上讲,MySQL 确实有一个支持多次执行的选项,可以通过连接属性来启用。此行为不符合 JDBC 规范/API,并且会降低您的代码的可移植性。请参阅 Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J 上的 allowMultiQueries

关于java - 我可以使用 MySQL Connector/J 执行以分号分隔的多个查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60896692/

相关文章:

php - 在 MySQL 中包含 $variable

java - 正则表达式替代PreparedStatement IN子句?

java - 在准备好的语句中将负 java long 转换为 clickhouse Uint64

java - 从 android 调用 Web 服务 - NullPointerException

java - 从 JavaFX Openjfx Dialogs 元素中设计对话框样式

PHP产品价格与数量不成倍增加

java - 从 ireports (Jaspersoft) 连接到 SQlite (Spiceworks) 数据库

java - 连接eclipse和数据库

java - Java中杀死进程

java - 何时执行 Superclass var = Subclass()