Java 已准备语句setString正在执行子查询

Java 已准备语句setString正在执行子查询,java,mysql,jdbc,prepared-statement,Java,Mysql,Jdbc,Prepared Statement,我正在使用java+mysql。我有以下代码: String sql = "INSERT INTO tableA (id, age) VALUES (1, ?)"; PreparedStatement statement = connection.prepareStatement(sql); stmt.setString(age); stmt.execute(); 假设字符串age:-是来自用户的输入,我希望上面的代码可以防止SQL注入。我发现mysql驱动程序不允许在一个语句中执行多个查询

我正在使用java+mysql。我有以下代码:

String sql = "INSERT INTO tableA (id, age) VALUES (1, ?)";

PreparedStatement statement = connection.prepareStatement(sql);
stmt.setString(age);
stmt.execute();
假设字符串age:-是来自用户的输入,我希望上面的代码可以防止SQL注入。我发现mysql驱动程序不允许在一个语句中执行多个查询,所以输入

76); Drop table tableB; -- )
将被mysql拒绝,即使我没有使用准备好的语句。 但是,在后一种情况下,输入

(select id from tableB where age = 10) // lets assume this returns 20
将接受在数据库中插入1,20。 通过以我上面描述的方式使用preparedStatement,我希望这种输入会被拒绝,从而防止SQL注入攻击。然而,我看到的是非常奇怪的。我不确定是否执行了此子查询,但我看到数据库中插入了一条记录1,0。 我希望我能从mysql中得到一个异常


在这一点上,我完全糊涂了。有什么想法吗?我的假设正确吗?谢谢你的帮助

如果我能知道downvote的原因,我将非常感激。当使用一个准备好的语句时,该语句是预先设置的,并且您将值绑定到参数,而不是修改该语句。在本例中,您将从tableB(其中age=10)中选择id字符串绑定到表示age的参数,而不以任何方式修改sql语句结构。年龄是一个数字列吗?如果是,则对字符串进行隐式转换,结果为0值。应使用stmt.setIntage;不是固定串。此外,您可能希望在存储出生日期而不是年龄时存储出生日期,以便始终可以计算最新的年龄。我认为您是对的Glenn。确实如此,很抱歉在问题中遗漏了此信息。我也得出了完全相同的结论。实际上,我很好奇,如果我将子查询传递给准备好的语句,这段代码会触发什么样的行为。我现在正在处理一些非常古老的代码,而这个时代正在以字符串的形式到来。SetIntenteger.PasrSetage抛出了NumberFOrmatException,但正如我所说,我很好奇preparedStatement的行为及其对子查询的处理。后来我意识到,当我将setString用于int时,mysql驱动程序可能在插入数据之前执行Integer.parseInt之类的操作,因此,为输入字符串插入0。当preparedStatement查询插入1时,使用输入1进行进一步分析,并从表B中选择id,其中age=10确认了这一点。非常感谢你的帮助。