Mybatis将table表名作为参数传⼊操作
使⽤ $ 符
如在l⾥⾯的使⽤:
在mapper层就把这个表名当做普通的参数传⼊即可:
同理,其实如果真的使⽤了$ ,在不考虑安全的范畴⾥⾯,也可以把⼀些⼿动拼接的sql语句作为参数传⼊。
补充知识:MyBatis动态传⼊表名,字段名参数的解决办法--⽤于分表--表名是动态的
⼀直在使⽤Mybatis这个ORM框架,都是使⽤mybatis⾥的⼀些常⽤功能。今天在项⽬开发中有个业务是需要限制各个⽤户对某些表⾥的字段查询以及某些字段是否显⽰,如某张表的某些字段不让⽤户查询到。这种情况下,就需要构建sql来动态传⼊表名、字段名了。现在对解决⽅法进⾏下总结,希望对遇到同样问题的伙伴有些帮助。
动态SQL是mybatis的强⼤特性之⼀,mybatis在对sql语句进⾏预编译之前,会对sql进⾏动态解析,解析为⼀个BoundSql对象,也是在此处对动态sql进⾏处理。下⾯让我们先来熟悉下mybatis⾥#{}与${}的⽤法:
在动态sql解析过程,#{}与${}的效果是不⼀样的:
#{ } 解析为⼀个 JDBC 预编译语句(prepared statement)的参数标记符。
如以下sql语句
select * from user where name = #{name};
会被解析为:
select * from user where name = ?;
可以看到#{}被解析为⼀个参数占位符?。
${ } 仅仅为⼀个纯碎的 string 替换,在动态 SQL 解析阶段将会进⾏变量替换
如以下sql语句:
select * from user where name = ${name};
当我们传递参数“sprite”时,sql会解析为:
select * from user where name = "sprite";
可以看到预编译之前的sql语句已经不包含变量name了。sql语句替换表中内容
综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,⽽ #{ }的变量的替换是在 DBMS 中。 
#{}与${}的区别可以简单总结如下:
#{}将传⼊的参数当成⼀个字符串,会给传⼊的参数加⼀个双引号
${}将传⼊的参数直接显⽰⽣成在sql中,不会添加引号
#{}能够很⼤程度上防⽌sql注⼊,${}⽆法防⽌sql注⼊
${}在预编译之前已经被变量替换了,这会存在sql注⼊的风险。如下sql
select * from ${tableName} where name = ${name}
如果传⼊的参数tableName为user; delete user; --,那么sql动态解析之后,预编译之前的sql将变为:
select * from user; delete user; -- where name = ?;
--之后的语句将作为注释不起作⽤,顿时我和我的⼩伙伴惊呆了看到没,本来的查询语句,竟然偷偷的包含了⼀个删除表数据的sql,是删除,删除,删除重要的事情说三遍,可想⽽知,这个风险是有多⼤。
${}⼀般⽤于传输数据库的表名、字段名等
能⽤#{}的地⽅尽量别⽤${}
进⼊正题,通过上⾯的分析,相信⼤家可能已经对如何动态调⽤表名和字段名有些思路了。⽰例如下:
<select id="getUser" resultType="java.util.Map" parameterType="java.lang.String" statementType="STATEMENT">
select
${columns}
from ${tableName}
where COMPANY_REMARK = ${company}
</select>
要实现动态调⽤表名和字段名,就不能使⽤预编译了,需添加statementType="STATEMENT"" 。
statementType:STATEMENT(⾮预编译),PREPARED(预编译)或CALLABLE中的任意⼀个,这就告诉 MyBatis 分别使⽤Statement,PreparedStatement或者CallableStatement。默认:PREPARED。这⾥显然不能使⽤预编译,要改成⾮预编译。
其次,sql⾥的变量取值是${xxx},不是#{xxx}。
因为${}是将传⼊的参数直接显⽰⽣成sql,如${xxx}传⼊的参数为字符串数据,需在参数传⼊前加上引号,如:String name = "sprite";
name = "'" + name + "'";   
mybatis动态调⽤表名和字段名,还可以应⽤于⽇志的收集上,如数据库的⽇志表,每隔⼀个⽉动态建⼀个⽇志表,表名前缀相同(如log_201610,log_201611等),这样实现⽇志的分⽉分表存储,⽅便⽇志的分析。
以上这篇Mybatis 将table表名作为参数传⼊操作就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。