You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis Mapper请求变量未替换,无法动态创建表

MyBatis动态创建表参数未替换问题解决

错误原因

你用#{name}传递表名是错误的。MyBatis中#{ }是预编译参数占位符,它会把传入值作为SQL参数处理,自动添加引号并通过JDBC预编译执行,但表名属于SQL标识符(不是参数值),不能用这种方式处理,所以日志里会显示?占位符,导致执行报错。

解决方法

动态替换表名这类SQL标识符,需要用MyBatis的${ }语法,它会直接将传入字符串替换到SQL语句中,修改后的Mapper代码如下:

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;

@Mapper
@Repository
public interface TableMapper {
    @Update("""
        create table if not exists ${name}
        (table_name varchar(50) NOT NULL,
        update_date varchar(20) NOT NULL)
        """)
    void createTableByName(@Param("name") String name);
}

注意事项

使用${ }会直接拼接SQL,存在SQL注入风险,必须对传入的表名做严格校验:

  • 限制表名只能包含字母、数字、下划线等合法字符
  • 采用白名单机制,只允许创建预先定义的表名
  • 禁止直接使用未过滤的用户输入作为表名

内容的提问来源于stack exchange,提问作者Руслан Кузнецов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:10:20