大家使用的时候都知道#{}是起到一个占位符的作用,在JDBC中也就是对应的一个预编译,也就是对应JDBC中的PreparedStatement
,源码中看到示例如下:
1 | ini复制代码 |
- 猜想
所以Mybatis中的#{}是怎么完成预编译的效果呢?根据这里可以猜想,应该是Mybatis中将#{}最后解析成了?
占位符。
- 验证
那就写个例子来debug看一下,我们以查询为例
1 | vbnet复制代码@Data |
Mapper如下
1 | java复制代码 |
测试类ADAOTest
1 | less复制代码 |
@Select执行原理
这里只在关键地方打上断点,org.apache.ibatis.builder.SqlSourceBuilder#parse
已经完成了占位符?
的替换,接下来就是获取PreparedStatement
,在org.apache.ibatis.executor.SimpleExecutor#prepareStatement
中。
这里的核心步骤已经标注出来了,有兴趣的话可以打个断点看看详细流程
1 | ini复制代码 |
最后执行查询org.apache.ibatis.executor.statement.PreparedStatementHandler#query
1 | scss复制代码 |
- 总结
猜想是对的,mybatis自定义的占位符#{} 最后被替换成JDBC的占位符?
所以,其实可以总结一下,其实所有的ORM框架,底层的原理都是JDBC的标准。
所以不管是Mybatis的占位符,还是JPA中的占位符,最终的执行流程都是解析成?
这个占位符,别问为什么,问这就是标准。
本文转载自: 掘金