mybaties源码面试常问之#「」和$「」

Mybaties面试中经常问到的一个问题就是#{}和${}这两者的区别,今天我们就从源码方面学习下:

知识储备(我们需要有原生JDBC操作数据库和对字符串拼接的认知)

首先我们创建一个Mapper其中一个Insert方法见图1(楼主用的mybaties-3.4.5版本,基于注解开发),在注解Insert编写插入sql,其中sex字段用的${},name和age用的#{}。


mybaties源码面试常问之#「」和$「」

图1

下来我们创建一个User对象,利用前面的Mapper做插入操作见图2。

mybaties源码面试常问之#「」和$「」

图2

中间步骤略。

我们直接看相关的代码,在mybaties的这个类中org.apache.ibatis.parsing.GenericTokenParser#parse方法完成了${sex}替换为user对象中的值见图3,可以看到原来sql中的${sex}被替换为-男-,mybaties用字符串截取和拼接直接生成的。详细步骤可见GenericTokenParser的parse方法。

mybaties源码面试常问之#「」和$「」

图3

接下来继续,mybaties还是用同一个类GenericTokenParser做的#{name}和#{age}替换为?的工作,替换前的sql见图4和替换完成见图5。

mybaties源码面试常问之#「」和$「」

图4

mybaties源码面试常问之#「」和$「」

图5

最后可以看到mybaties用的原生JDBC操作完成的数据库操作见图6。

org.apache.ibatis.executor.statement.PreparedStatementHandler#update

mybaties源码面试常问之#「」和$「」

图6

总结下:${}为值替换,就是字符串拼接形式将参数拼接起来,比如要做动态查询一个表select * from table 其中表名table不能写固定值根据传来的参数查询就可以用${table}来做,而#{}是以preparedstatement预处理来执行可以防止sql注入问题,通常用#{}。

以上就是今天的分享内容,共同努力,如有错误还请指出。


分享到:


相關文章: