mybatis 面经总结

全自动ORM与半自动ORM的区别:都是对JDBC的封装,全自动把SQL也封装了,程序员不需要写sql,mybatis没有封装sql,只封装了加载驱动、建立连接、创建 Statement 对象、处理返回结果、关闭连接。

MyBatis 的 xml 映射⽂件和 MyBatis 内部数据结构之间的映射关系:MyBatis 将所有 xml 配置信息都封装到对象,每个标签都对应一个对象。
执行器Executor:
  SimpleExecutor:每执⾏⼀次 update 或 select,就开启⼀个 Statement 对象,⽤完⽴刻关闭
  ReuseExecutor:执⾏ update 或 select,以 sql 作为 key 查找 Statement 对象,存在就使⽤,不存在就创建,⽤完后,不关闭 Statement 对象,⽽是放置于 Map<String, Statement>内,供下⼀次使⽤。简⾔之,就是重复使⽤ Statement 对象。
  BatchExecutor:执⾏ update(没有 select,JDBC 批处理不⽀持 select),将所有 sql 都添加到批处理中(addBatch()),等待统⼀执⾏(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()完毕后,等待逐⼀执⾏ executeBatch()批处理。与JDBC 批处理相同。
MyBatis 是如何将 sql 执⾏结果封装为⽬标对象:1.<resultMap>  2.别名 (忽视大小写) ;有了列名与属性名的映射关系后,MyBatis 通过反射创建对象,同时使⽤反射给对象的属性逐⼀赋值并返回,那些找不到映射关系的属性,是⽆法完成赋值的。
动态SQL:https://cloud.tencent.com/developer/article/1943349    https://segmentfault.com/a/1190000039335704
分页:
  物理分页:limit ,pagehelp插件,拦截SQL后重写limit
  内存分页:rowband,容易oom
#{}与${}: 前者是预编译,SQL结构已经固定,会把#{}转换为?,调用PreparedStatement的set方法来赋值。后者是把{}内的值替换
dao接口全限定名+方法名与xml的namespace+id对应,接口方法内的参数就是传给sql的参数。接口全限定名+方法名 对应key,value为一个mappedstatement。 每个sql语句都会被解析为一个mappedstatement对象。
Dao 接⼝⾥的⽅法可以重载,但是xml里的id不能重复。(一个id可以对应多个接口重载方法,然后根据动态sql对应)
dao原理:JDK动态代理,代理对象拦截接口方法,然后执行mappedstatement所代表的sql。
 缓存:
  一级缓存:sessionsql级别(sqlsession结束后缓存消失,事务),默认开启,hashmap存储缓存(使用 [ namespace:sql:参数 ] 作为key,查询返回的语句作为value保存的),增删改操作会删除缓存
  二级缓存:与一级类似原理,区别在于用域为 Mapper ( Namespace ),不同线程之间就可以共用二级缓存。流程:当一个sqlseesion执行了一次select后,关闭此session的时候,会将查询结果缓存到二级缓存;当另一个sqlsession执行select时,首先会在他自己的一级缓存中找,如果没找到,就回去二级缓存中找,找到了就返回,就不用去数据库了,从而减少了数据库压力提高了性能。cache-enabled: true 开启二级缓存
posted @ 2022-09-11 21:42  无极是一种信仰  阅读(58)  评论(0编辑  收藏  举报