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,提问作者Руслан Кузнецов
相关产品推荐
相关产品推荐

