mybatis动态调用表名和字段名

mybatis动态调用表名和字段名

今天遇见一个问题,就是查询的时候想把表名当成参数传过去。按照正常的写法#{表名}发现不好使。

这种情况下,就需要构建sql来动态传入表名、字段名了。现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助。

动态SQL

mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。下面让我们先来熟悉了mybatis里#{}与${}的用法:

在动态sql解析过程,#{}与${}的效果是不一样的:

  • #{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
    如以下sql语句
1
2
3
4
5
select * from user where name = #{name};

会被解析为:

select * from user where name = ?;

可以看到#{}被解析为一个参数占位符?。


  • ${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换
    如一下sql语句:
1
2
3
4
5
select * from user where name = ${name};

当我们传递参数“sprite”时,sql会解析为:

select * from user where name = "sprite";

可以看到预编译之前的sql语句已经不包含变量name了。

综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。

参考文档:
https://yq.aliyun.com/ziliao/127049
https://www.cnblogs.com/heyonggang/archive/2016/10/12/5953070.html

-------------已经触及底线 感谢您的阅读-------------

本文标题:mybatis动态调用表名和字段名

文章作者:趙小傑~~

发布时间:2018年02月28日 - 00:00:00

最后更新:2019年09月16日 - 19:34:10

原始链接:https://cnsyear.com/posts/eab4a77c.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%