mapper是个接口,能调用方法去执行数据库操作?

Mybatis它底层呢,会为Mapper接口去创建JDK的动态代理,执行数据库操作。

当执行一个查询SQL呢?

image

 

 

 在XML里面,它是怎么拿到的,

SQL是怎么执行的?怎么解析的,一二级缓存

又是什么时候获取的。

这我们就得把整个执行流程,分析清楚。

如当我们去调用UserMppaer

image

 点select by lD 那代理对象呢 帮你。

第一步 查缓存。它会根的你的mapper的全类名·方法名+参数

去生成一个缓存的唯一key,然后呢先查一级缓存,它是SqlSession级别的。

整合了Spring之后,会和事务一起开启和关闭,所以同一个事务中,如果你执行同一个查询,就会从一级缓存当中获取,从而提升性能。

那要是一级缓存当中没有,那就会再看这个mapper接口,有没有开启二级缓存,比如,我们就需要在XML里面,配置<Cache/>来开启二级 缓存,那二级缓存呢,

是整个进程级别的,你在不同的事务当中,去查询同一个数据啊,也会进行缓存命中,那如果二级缓存,也没有获取到啊。

就会进行第二步sql的解析,那代理对象,它底层就会开始找对应的Sql语句,如果是动态sql,它会在启动的时候通过 sqlSessionFactory

来进行解析,并且把解析好的sql呢,缓存到一个map当中,key就是这个mapper接口的全类名+方法名,这也是为了性能的考虑啊,就不需要每次执行sql都去解析了.

所以在执行SOL的时候呢,就只需要根据mapper接口的全类名加方法名就可以找到对应的SQL,然后解析参数,把#{}里面的参数,换成JDBC能识别的占位符,这样呢就可以通过JDBC的statement的对象

来设置参数了,这就是#{}为什么可以防注入的关键啊,因为它的参数是单独传入的,不是直接去拼接的sql,那SOL有了之后呢,就会进行第三步SQL的执行,

那MyBatis会把解析完的SQL,通过JDBC的Statement,execute的方法去执行SQL,拿到ResultSet,然后通过反射呢,去创建对应的Pojo对象,再把ReSultSet里面的字段呃。比如ID,name啊,通过set方法来塞进去,或者根据<ResultMap>映射赋值,第四步更新缓存,拿到数据后,会先把数据存到一级缓存,如果开启了二级缓存,还会同步到二级缓存。

image

 

posted @ 2025-12-17 00:06  堭鍙銤  阅读(9)  评论(0)    收藏  举报