【发布时间】:2013-09-02 03:41:50
【问题描述】:
我的 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)
但是当我从命令行运行相同的查询(以分号分隔)时,它可以完美运行并按预期输出两个表。
【问题讨论】:
-
可能不会——sql 会返回两个结果集,execute() 会返回什么?如果您只有一个语句,大概一切正常?
-
在一个查询中禁止多个语句也是一种安全保障,尽管它不是完美的。如果您可以执行多个查询,则注入可以让入侵者执行完全任意的 SQL:xkcd.com/327。你应该做
select fullName from user WHERE user_id=1 OR user_id=2。您还应该使用准备好的语句,以提高效率和安全性以防止 SQL 注入。