内容分类 | 详情 |
---|---|
Java高频面试题 | 汇总入口 |
JVM | JVM面试题 |
并发 | 并发面试题 |
Spring | Spring面试题 |
分布式 | 分布式面试题 |
SpringBoot | SpringBoot面试题 |
SpringCloud | SpringCloud面试题 |
Dubbo | Dubbo面试题 |
MySQL | MySQL面试题 |
Mybatis | Mybatis面试题 |
Redis | Redis面试题 |
RocketMQ | RocketMQ面试题 |
算法 | 算法面试题 |
遇到的问题 | 遇到的问题 |
面试官的其他问题 | 面试官的其他问题 |
Git | Git面试题 |
文章目录
DAO都是接口它是怎么执行SQL的
- 解析XML文件,Mybatis在初始化SqlSessionFactoryBean的时候,找到mapperLocations路径去解析里面所有的XML文件。
创建SqlSource:
根据sql语句的不同,分为staticSqlSource和DynamicSqlSource。
创建创建MappedStatement:
XML文件中的每一个SQL标签就对应一个MappedStatement对象,这里面有两个属性很重要。
id:全限定类名+方法名组成的ID。
sqlSource:当前SQL标签对应的SqlSource对象。
创建完MappedStatement对象,将它缓存到Configuration#mappedStatements中。
当我们执行Mybatis方法的时候,就通过全限定类名+方法名找到MappedStatement对象,然后解析里面的SQL内容,执行即可。
-
spring对接口生成动态代理对象,扫描MapperScan注解的范围,通过JDK动态代理的方式,返回了一个Dao接口的代理对象,这个代理对象的处理器是MapperProxy对象。
-
调用DAO方法
在调用DAO方法时,实际上调用的代理对象的sqlsession,它通过全限定类型和方法名称从configuration中获取一个MappedStatement对象,底层也是HashMap存放MappedStatment对象的。
拿到MappedStatement 对象,然后通过执行器Executor去执行具体SQL并返回。
public class DefaultSqlSession implements SqlSession {
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
try {
MappedStatement ms = configuration.getMappedStatement(statement);
return executor.query(ms,
wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
}
}
}