昨天临近下班的时候遇到个问题,我在 Navicat Premium 12 中使用 {drop table USER},这样是可以正常执行成功的,但是当我用在 mybatis 中的时,就是死活没有执行,看控制台也没有报错。这就很奇怪了,这让我不得不仔细审查问题所在,本来还以为是不是在 SQL 中使用 “${ }” 导致的问题,后边改成 “#{ }” 后发现会报错:
### Error updating database. Cause: 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 ''user'' at line 1
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: drop table ?;
### Cause: 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 ''user'' at line 1
从报错可以看出,USER 表被两个单引号 ‘ ‘ USER ‘ ‘ 包装了,而实际情况我们只需要 ‘user’ 这样的格式就行了,所以可以得知:使用 “#{ }” 是自带单引号 ‘ xxx ‘ 的,所以当我们传递过来的参数是表名的时候,我必须要使用 “${ }” 来正确获取参数值。 于是又改成 “${ }”,结果:
org.apache.ibatis.binding.MapperProxy@18352f5
这个看起来是缺少注解 @Param 的问题,于是又在 mapper 接口加上,再次测试,果不其然。
完整的示例:
dao 接口:
void deleteDeviceTable(@Param(value = "deviceId") String deviceId);
xml 文件:
<update id="deleteDeviceTable">
drop table ${deviceId};
</update>
补充:
- drop table //删除整个表结构和数据,不可恢复。
- truncate table //只清空表里的数据,表结构会得到保留。
- delete table //一行行删除表里数据,效率低。(删除内容,不删除结构,且不会释放空间)
未经允许不得转载:极客萌动 » mybatis 中使用 drop table 删除表