JAVA——prepareStatement中SQL语句中占位符(?)替换表名和字段名

52 篇文章 2 订阅

基本概念

PreparedStatement:Statement的改良版,具有预编译功能,方便使用,运行速度快。

问题描述

1.根据测试占位符?不能用于表名

String strSql="SELECT * FROM ?";
try(PreparedStatement ps=conn.prepareStatement(strSql)) {
    ps.setObject(1,"person");

会提示SQL语法错误

Exception in thread "main" java.lang.RuntimeException: java.sql.SQLSyntaxErrorException: 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 ''person''

2.占位符?用于其它变量名时,执行正常

String strSql="SELECT * FROM person WHERE name =?";
try(PreparedStatement ps=conn.prepareStatement(strSql)) {
    ps.setObject(1,"张三");
    ResultSet rs=ps.executeQuery();


参考文章

https://blog.csdn.net/L_BestCoder/article/details/70943649

https://blog.csdn.net/weixin_42509123/article/details/89842209

https://blog.csdn.net/u011510825/article/details/81807253

https://www.cnblogs.com/gklsy/archive/2012/01/10/2317934.html

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果您的SQL语句包含`${}`这样的占位符,而这些占位符与Flyway占位符冲突,可以尝试以下解决方案: 1. 使用双重转义 您可以在SQL语句使用双重转义来避免Flyway检测到占位符。例如,在SQL语句使用`${}`占位符时,您可以将其转义为`$${}`,这样Flyway就不会将其识别为占位符。 2. 使用命名参数 您可以使用JDBC的命名参数来代替占位符。例如,在使用Java语言时,您可以使用`PreparedStatement`对象和`setObject`方法来设置命名参数。示例如下: ``` PreparedStatement statement = connection.prepareStatement("INSERT INTO table_name (column1, column2) VALUES (:value1, :value2)"); statement.setObject("value1", "some_value"); statement.setObject("value2", "${some_other_value}"); statement.execute(); ``` 在这个示例,我们使用了命名参数`:value1`和`:value2`来代替SQL语句占位符。`setObject`方法可以接受任意类型的参数,并将其转换为与数据库类型相匹配的值。注意,在使用命名参数时,您需要使用`:`或`@`等符号来标识参数名。 3. 修改Flyway配置 如果您无法使用双重转义或命名参数来解决问题,您可以尝试修改Flyway的配置,以使其不检测特定的占位符。例如,您可以使用`flyway.placeholderPrefix`和`flyway.placeholderSuffix`属性来指定Flyway应该忽略哪些占位符。示例如下: ``` flyway.placeholderPrefix=<< flyway.placeholderSuffix=>> ``` 在这个示例,我们将占位符前缀和后缀修改为`<<`和`>>`,这样Flyway就不会检测SQL语句的`${}`占位符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starzkg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值