嗨,我想知道是否可以使用JDBC执行这样的操作,因为它目前提供了一个异常,尽管在MySQL查询浏览器中是可能的。
"SELECT FROM * TABLE;INSERT INTO TABLE;"
虽然我确实意识到有可能将SQL查询字符串拆分并将语句执行两次,但我想知道是否有一次性的方法。
String url = "jdbc:mysql://localhost:3306/";
String dbName = "databaseinjection";
String driver = "com.mysql.jdbc.Driver";
String sqlUsername = "root";
String sqlPassword = "abc";
Class.forName(driver).newInstance();
connection = DriverManager.getConnection(url+dbName, sqlUsername, sqlPassword);
6条答案
按热度按时间syqv5f0l1#
是的,有可能。据我所知,有两种方法。它们是
1.通过设置数据库连接属性以允许多个查询,默认情况下以分号分隔。
1.通过调用隐式返回游标的存储过程。
以下示例说明了上述两种可能性。
发送连接请求时,需要将连接属性
allowMultiQueries=true
附加到数据库url。这是已存在的连接属性的附加属性,如autoReConnect=true
等。allowMultiQueries
属性的可接受值为true
、false
、yes
、和no
。任何其他值都将在运行时被SQLException
拒绝。除非传递此类指令,否则将引发
SQLException
。您必须使用
execute( String sql )
或它的其他变体来获取查询执行的结果。要迭代和处理结果,需要执行以下步骤:
1.使用一个或多个
select
和DML
查询创建过程。1.使用
CallableStatement
从java调用它。1.您可以捕获在过程中执行的多个
ResultSet
。无法捕获DML结果,但可以发出另一个
select
以了解表中的行是如何受到影响的。
z0qdvdin2#
您可以使用批量更新,但查询必须是操作(即插入、更新和删除)查询
iszxjhcz3#
提示:如果有多个连接属性,请使用以下内容将它们分隔:
给你一些东西,比如:
我希望这能帮助到一些人。
此致,
格林
8tntrjer4#
根据我的测试,正确的标志是“allowMultiQueries=true”
093gszye5#
为什么不尝试为此编写一个
Stored Procedure
?你可以把
Result Set
拿出来,在同一个Stored Procedure
里你可以得到你想要的Insert
。唯一的问题是,如果在
Select
之后执行Insert
,则可能无法获得Result Set
中新插入的行。wpx232ag6#
我认为这是多选择/更新/插入/删除的最简单的方法。你可以在选择后运行任意多的更新/插入/删除(你必须先选择(如果需要的话是一个虚拟的)),使用executeUpdate(str)(只使用new int(count1,count2,...)),如果你需要一个新的选择,关闭"statement"和"connection",然后为下一个选择新建一个。例如:
希望能有所帮助