全自动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。
标签:总结,xml,封装,对象,面经,MyBatis,Statement,sql,mybatis
来源: https://www.cnblogs.com/sjj123/p/16684924.html