MySQL字符串未在Java中执行[重复]
Posted
技术标签:
【中文标题】MySQL字符串未在Java中执行[重复]【英文标题】:MySQL String not executing in Java [duplicate] 【发布时间】:2015-06-11 05:43:33 【问题描述】:我正在尝试使用 Netbeans 8.0.2 中的简单测试程序在现有 mysql 数据库上执行 String SQL 命令,但未能成功。奇怪的是,同样的 SQL 命令在直接放入 IDE 时执行得很好。感谢您的帮助,并请纠正我的任何术语,我是新手,并从在线教程中解决。谢谢
package testdb1;
/**
*
* @author x
*/
import java.sql.*;
public class TestDB1
//Driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/mynewdatabase?zeroDateTimeBehavior=convertToNull";
static final String username = "****";
static final String password = "**********";
public static void main(String[] args)
Connection conn = null;
Statement stmnt = null;
try
System.out.println("Connecting...");
//Open connection
conn = DriverManager.getConnection(DB_URL, username, password);
//Execute query
System.out.println("Creating statement...");
stmnt = conn.createStatement();
String sql = "START TRANSACTION; " +
"UPDATE customer_test_accounts " +
"SET balance = balance + 1000 " +
"WHERE accountnumber = 2; " +
"COMMIT; " +
"ROLLBACK;";
stmnt.executeQuery(sql);
输出:
Connecting...
Creating statement...
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 'UPDATE customer_test_accounts SET balance = balance + 1000 WHERE accountnumber =' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
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:1053)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2788)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2738)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1617)
at testdb1.TestDB1.main(TestDB1.java:45)
BUILD SUCCESSFUL (total time: 2 seconds)
【问题讨论】:
我猜accountnumber
是varchar
类型并采用字符串类型,试试accountnumber= '2'
JDBC 基于“每次执行单个语句”模型(尽管 MySQL 连接器/J 可以选择允许执行多个语句)。 JDBC 自己处理事务,您不得使用语句自己启动和提交事务(而是通过禁用自动提交并调用Connection.commit()
或Connection.rollback()
。默认情况下,JDBC 使用自动提交,这意味着每次执行都使用自动提交(或回滚)的自己的事务。
【参考方案1】:
您以错误的方式执行 JDBC 事务。将所有垃圾放入 sql 字符串中是行不通的。
改为使用:
con.setAutoCommit(false);将自动提交设置为 false
创建连接时,它处于自动提交模式。这意味着每个单独的 SQL 语句都被视为一个事务,并在执行后立即自动提交。
con.commit();提交
con.rollback();用于回滚
See Using Transactions and follow examples
【讨论】:
很好奇为什么它甚至需要交易。没看到 可能是 OP 分享的示例与实际不同。我还分享了 Using Transactions 链接,所以让 OP 了解一下 - 是否需要交易? 即使更新命中多行也不需要事务 有时您不希望一个语句生效,除非另一个语句完成。 同意。这不是那些时代之一,因为只有一个 stmt【参考方案2】:只需编写这个简单的 sql 语句并尝试.... "UPDATE customer_test_accounts SET balance = balance + 1000 WHERE accountnumber = 2"
【讨论】:
你觉得String str1 = "hey"; String str2 = "guru";
str1 + str2
和heyguru
会有区别
两者都是一样的。它们产生相同的字符串。
@UmaKanth 我认为他的回答很有道理。不需要交易(关于字符串的评论也让我感到困惑)。也许我很密集;)
写String str = "this is " + "a string";
和String str = "this is a string"
没有区别。两者都是一样的,所以这不会是错误。
我认为错误在于将一段命令放在一起并执行它们,没有人怀疑如何连接【参考方案3】:
你可以试试下面的代码: String sql = "UPDATE customer_test_accounts" + "SET balance = balance + 1000" + "WHERE accountnumber = 2"; stmnt.executeUpdate(sql);
【讨论】:
【参考方案4】:@Jens 为 java 指出的问题非常简单。 php 也一样。为什么要谈论你想知道的 php?概念相同,mysql需要开启或允许多个stmt批处理。
How to execute multiple SQL statements from java
Executing multiple SQL queries in one statement with PHP
否则它会爆炸,你专注于清理 sql 字符串,它是 不是问题。问题再次是准备连接或 stmt 允许这样一批。在这里的情况下,它在内脏后爆炸 到达第一个分号,不管它的结构如何 出现在运行它的 .sql 文件脚本的眼中,或者它位于 一个存储过程。
【讨论】:
以上是关于MySQL字符串未在Java中执行[重复]的主要内容,如果未能解决你的问题,请参考以下文章
JAVA_HOME 变量未在 Windows 中设置 [重复]