mapper是个接口,能调用方法去执行数据库操作?
Mybatis它底层呢,会为Mapper接口去创建JDK的动态代理,执行数据库操作。
当执行一个查询SQL呢?

在XML里面,它是怎么拿到的,
SQL是怎么执行的?怎么解析的,一二级缓存
又是什么时候获取的。
这我们就得把整个执行流程,分析清楚。
如当我们去调用UserMppaer

点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>映射赋值,第四步更新缓存,拿到数据后,会先把数据存到一级缓存,如果开启了二级缓存,还会同步到二级缓存。


浙公网安备 33010602011771号