mybatis是一个半Orm(对象关系映射)框架,它内部封装了JDBC,加载驱动,创建链接,创建statement等繁杂的过程。
一、mybatis的执行流程
-
读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件
-
构造会话工厂SqlSessionFactory
-
会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)
-
操作数据库的接口,Executor执行器,同时负责查询缓存的维护
-
Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息
-
输入参数映射
-
输出结果映射
1、 创建SqlSessionFactory 2、 通过SqlSessionFactory创建SqlSession 3、 通过sqlsession执行数据库操作 4、 调用session.commit()提交事务 5、 调用session.close()关闭会话
SqlSessionFactory 是单例的 由 SqlSessionFactoryBuilder 构建;sqlsession 是会话
二、mybatis时怎么绑定xml
三、mybatis的拦截器
四、mybatis的优化
五、mybatis的缓存
一级缓存是基于PerpetualCache的hashmap本地缓存,其存储作用域为Session,当Session flush后,默认打开一级缓存!
二级缓存和一级缓存的机制是相同的,默认也是采用PerpetualCache的hashmap本地缓存,不过他的储存作用于在Mapper,而且可自定义存储源,要开启二级缓存,需要使用二级缓存属性类实现Serializable序列化的接口,可在它的映射文件中配置<cache/>
缓存数据的更新机制,当某一个作用域(一级缓存session/二级缓存namespace)的进行了c/u/d操作后,默认该作用域下所有select中的缓存将被clear
一级缓存:基于 PerpetualCache 的 hashmap 本地缓存,其存储作用域为 Session,当 Session 进行 flush 或者 close 之后,该 Session 中的所有的 Cache 就将清空,默认打开一级缓存
二级缓存:基于 namespaces 和 mapper 的作用域起作用的,不是依赖于 SQL Session,默认也是采用 PerpetualCache ,hashmap 存储,但是需要单独开启,一个是核心配置,一个是 mapper 文件
二级缓存什么时候会清空缓存中的数据:
当某一个作用域(一级缓存 Session /二级缓存 namespaces )的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear
六、延迟加载
延迟加载的意思是:就是在需要用到数据时才进行加载,不需要用到数据时就不进行加载数据。 Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载 在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=truelfalse,默认是关闭的
底层原理:
1.使用CGLIB创建目标对象的代理对象
2.当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sql查询
3.获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了
其他问题
1.${}是字符串替换,#{}是预处理;
Mybatis在处理${}时,就是把${}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
2.Mybatis是如何进行分页的?分页插件的原理是什么?
3.说一下Mybaits的优缺点和使用场合
优点:基于SQL语句编译,相当灵活,与JDBC相比,减少了50%的代码,很好的与各种数据库兼容,能够与Spring很好的集成,提供映射标签,支持对象关系组件维护!
缺点:SQL语句的编写工作量较大,尤其字段多,关联表多时,对开发人员编写SQL语句的功底有一定要求!
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库!
适用场合:MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,对性能要求很高,或者需求变化较多的项目,如互联网项目!
本文由 zzpp 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2024/09/12 09:04