在preparedstatement中如何处理单引号

问题描述 投票:0回答:2

嗨,我想使用这样的准备好的语句:

acl = conn.prepareStatement("INSERT INTO acls_t(user,topic,rw) values((SELECT id from users_t where username=?),'?/#',1);");
mqtt_acl.setString(1, name);
mqtt_acl.setString(2, uuid);

我的数据库是mariadb,因此不接受。返回:

java.sql.SQLException: Could not set parameter at position 2 (values was '3aa4ea54-3105-47a3-9bfb-c17c4348d84a')
Query - conn:56(M)  - "INSERT INTO acls_t(user,topic,rw) values((SELECT id from users_t where username=?),'?/#',1);"

我该如何处理?

java jdbc mariadb prepared-statement
2个回答
1
投票

执行以下操作:

acl = conn.prepareStatement("INSERT INTO acls_t(user,topic,rw) values((SELECT id from users_t where username=?),?,1);");
mqtt_acl.setString(1, name);
mqtt_acl.setString(2, uuid + "/#");

1
投票

您的sql语句可以简化为:

INSERT INTO acls_t(user,topic,rw) SELECT id, CONCAT(?, '/#'), 1 FROM users_t WHERE username = ?;

不使用VALUES,必须为其嵌套SELECT语句。因此,将代码更改为:

acl = conn.prepareStatement("INSERT INTO acls_t(user,topic,rw) SELECT id, CONCAT(?, '/#'), 1 FROM users_t WHERE username = ?;");
mqtt_acl.setString(1, uuid);
mqtt_acl.setString(2, name);

使用此代码,如果表users_t中没有用户且username等于变量name的值,则不会插入任何行,但是您的代码将尝试向表中插入一行[ C0]并将acls_t列设置为user

© www.soinside.com 2019 - 2024. All rights reserved.