微信网站开发 js框架,wordpress支付宝红包,114百事通做网站600,做公众号网站有哪些目录#xff1a; 第一题. MyBatis的框架架构设计是怎么样的?第二题. 为什么需要预编译?第三题. Mybatis都有哪些Executor执行器#xff1f;它们之间的区别是什么#xff1f;第四题. Mybatis中如何指定使用哪一种Executor执行器#xff1f;第五题. Mybatis是否支持延迟加载… 目录 第一题. MyBatis的框架架构设计是怎么样的?第二题. 为什么需要预编译?第三题. Mybatis都有哪些Executor执行器它们之间的区别是什么第四题. Mybatis中如何指定使用哪一种Executor执行器第五题. Mybatis是否支持延迟加载如果支持它的实现原理是什么 第一题. MyBatis的框架架构设计是怎么样的? 这张图从上往下看。MyBatis的初始化会从mybatis-config.xml配置文件解析构造成Configuration这个类就是图中的红框。 (1)加载配置配置来源于两个地方一处是配置文件一处是Java代码的注解将SQL的配置信息加载成为一个个MappedStatement对象包括了传入参数映射配置、执行的SQL语句、结果映射配置存储在内存中。 (2)SQL解析当API接口层接收到调用请求时会接收到传入SQL的ID和传入对象可以是Map、JavaBean或者基本数据类型Mybatis会根据SQL的ID找到对应的MappedStatement然后根据传入参数对象对MappedStatement进行解析解析后可以得到最终要执行的SQL语句和参数。 (3)SQL执行将最终得到的SQL和参数拿到数据库进行执行得到操作数据库的结果。 (4)结果映射将操作数据库的结果按照映射的配置进行转换可以转换成HashMap、JavaBean或者基本数据类型并将最终结果返回。
第二题. 为什么需要预编译?
定义 SQL 预编译指的是数据库驱动在发送 SQL 语句和参数给 DBMS 之前对 SQL 语句进行编译这样 DBMS 执行 SQL 时就不需要重新编译。为什么需要预编译 JDBC 中使用对象 PreparedStatement 来抽象预编译语句使用预编译。预编译阶段可以优化 SQL 的执行。预编译之后的 SQL 多数情况下可以直接执行DBMS 不需要再次编译越复杂的SQL编译的复杂度将越大预编译阶段可以合并多次操作为一个操作。同时预编译语句对象可以重复利用。把一个 SQL 预编译后产生的 PreparedStatement 对象缓存下来下次对于同一个SQL可以直接使用这个缓存的 PreparedState 对象。Mybatis默认情况下将对所有的 SQL进行预编译。
第三题. Mybatis都有哪些Executor执行器它们之间的区别是什么
Mybatis有三种基本的Executor执行器SimpleExecutor、ReuseExecutor、BatchExecutor。 SimpleExecutor每执行一次update或select就开启一个Statement对象用完立刻关闭Statement对象。 ReuseExecutor执行update或select以sql作为key查找Statement对象存在就使用不存在就创建用完后不关闭Statement对象而是放置于Map内供下一次使用。简言之就是重复使用Statement对象。 BatchExecutor执行update没有selectJDBC批处理不支持select将所有sql都添加到批处理中addBatch()等待统一执行executeBatch()它缓存了多个Statement对象每个Statement对象都是addBatch()完毕后等待逐一执行executeBatch()批处理。与JDBC批处理相同。 作用范围Executor的这些特点都严格限制在SqlSession生命周期范围内。
第四题. Mybatis中如何指定使用哪一种Executor执行器
在Mybatis配置文件中在设置settings可以指定默认的ExecutorType执行器类型也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数如SqlSession openSession(ExecutorTypeexecType)。
配置默认的执行器。SIMPLE 就是普通的执行器REUSE 执行器会重用预处理语 句prepared statements BATCH 执行器将重用语句并执行批量更新。
第五题. Mybatis是否支持延迟加载如果支持它的实现原理是什么
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载association指的就是一对一collection指的就是一对多查询。在Mybatis配置文件中可以配置是否启用延迟加载lazyLoadingEnabledtrue|false。它的原理是使用CGLIB创建目标对象的代理对象当调用目标方法时进入拦截器方法比如调用a.getB().getName()拦截器invoke()方法发现a.getB()是null值那么就会单独发送事先保存好的查询关联B对象的sql把B查询上来然后调用a.setB(b)于是a的对象b属性就有值了接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。 当然了不光是Mybatis几乎所有的包括Hibernate支持延迟加载的原理都是 一样的
如果我的内容对你有帮助请点赞评论收藏。创作不易大家的支持就是我坚持下去的动力