mybatis动态调用表名和字段名
今天遇见一个问题,就是查询的时候想把表名当成参数传过去。按照正常的写法#{表名}发现不好使。
这种情况下,就需要构建sql来动态传入表名、字段名了。现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助。
动态SQL
mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。下面让我们先来熟悉了mybatis里#{}与${}的用法:
在动态sql解析过程,#{}与${}的效果是不一样的:
- #{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
如以下sql语句
1 | select * from user where name = #{name}; |
可以看到#{}被解析为一个参数占位符?。
- ${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换
如一下sql语句:
1 | select * from user where name = ${name}; |
可以看到预编译之前的sql语句已经不包含变量name了。
综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。
参考文档:
https://yq.aliyun.com/ziliao/127049
https://www.cnblogs.com/heyonggang/archive/2016/10/12/5953070.html