连mybits工作原理都不懂,你敢说你自己会java?
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
一、相较于Hibernate,mybatis的优势在哪里?
Hibernate缺点:
1、运行效率低,内存占用比较严重
2、针对单一对象的增删改查,适合Hibernate,而Hibernate在批量操作时处于弱势
3、虽然Hibernate引入一二级缓存、lazyload、查询缓存等更多优化空间(对于那些改动 不大且经常使用的数据,可将他们放入缓存中),但Hibernate对于持久层封装过于完 整,导致开发人员无法对sql进行优化,不适用于大型项目
mybatis优点:
1、代码量大大减少,开发效率高
2、 MyBatis相当灵活,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统 一管理和优化,并可重用
3、运行效率高
二、mybatis原理
下面是mybatis的一个原理图,看懂这个图对理解mybatis工作原理很重要:
上面的原理图看的不是很清晰,下面再详细介绍一下mybatis的主要成员:
1、Configuration
MyBatis所有的配置信息都保存在Configuration对象之中,配置文件的大部分配置都会存储到该类中
2、SqlSession
作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能
3、ExecutorMy
Batis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等
4、ParameterHandler
负责对用户传递的参数转换成JDBC Statement 所对应的数据类型
5、ResultSetHandler
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
6、TypeHandler
负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
7、MappedStatement
MappedStatement维护一条节点的封装
8、SqlSource
负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
9、BoundSql
表示动态生成的SQL语句以及相应的参数信息
下面介绍一下mybatis的工作流程:
首先,mybatis的增删改查这些数据库操作都是基于sqlsession类的,SqlSession又是由SqlSessionFactory类创建出来的(这里采用了java设计模式中的工厂模式),而SqlSessionFactory是由SqlSessionFactoryBuilder创建的,SqlSessionFactoryBuilder要想创建SqlSessionFactory,必须要有原料(即mybatis配置文件),下面是创建SqlSession的代码:
//加载classpath路径下的mybatis配置文件InputStream in=Resources.getResourceAsStream("mybatis-config.xml");//根据加载配置文件产生的输入流,来创建一个SqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);//根据SqlSessionFactory创建SqlSessionSqlSession session = sessionFactory.openSession();
下面介绍这几个重要对象的作用域和生命周期
1、SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在以保证所有的 XML 解析资源开放给更重要的事情。
2、SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式
3、SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。sqlSession在每次用完之后必须关闭它
三、mybatis缓存机制
1、一级缓存
MyBatis一级缓存是基于sqlSession的,sqlSession对象有一个HashMap用于存储缓存数据,此HashMap是当前会话对象私有的,别的SqlSession会话对象无法访问。一级缓存默认是开启的,且无法关闭。增删改操作会清空当前sqlSession里的缓存
2、二级缓存
MyBatis二级缓存是mapper级别的缓存,同一个namespace共用这一个缓存,所以对SqlSession是共享的,二级缓存是默认关闭的。
如何配置二级缓存?只需要在sql映射文件中添加即可
测试代码:
/* * 注意:被缓存的数据要实现序列化接口(在这里将Book.java实现序列化接口),否则会出现异常 * 另外,当某一个sqlSession修改了共享的缓存数据之后,二级缓存也会清空 */SqlSession session_1 = MyBatisUtil.getSession();BookDao mapper_1 = session_1.getMapper(BookDao.class);mapper_1.listBook();//注意,必须提交才能将数据放进二级缓存session_1.commit(); SqlSession session_2 = MyBatisUtil.getSession();BookDao mapper_2 = session_2.getMapper(BookDao.class);mapper_2.listBook();
这里只是为了测试二级缓存的原理,所以MyBatisUtil类如何获取SqlSession的代码就没有粘贴进来了。
运行上面的代码,通过log4j打印出来的日志可以看到,,明明运行了两次listBook方法,但最终查询语句(select * from book)只出现一次,这次因为第二次查询命中了缓存,就不需要再查数据库了。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-07-06
本文作者:程序员麦冬
本文来自:“掘金”,了解相关信息可以关注“XXXX”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
干货!如何用 Python+KNN 算法实现城市空气质量分析与预测?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 随着中国工业和科技的发展,中国的一些发达城市的空气质量问题变得越来越严重,其中最为严重的便是PM2.5带来的恶劣环境问题。本文在根据网络公开空气质量数据的基础上进行爬取相关数据,主要针对环境较为恶劣的城市,天津、北京、广州等几个城市,尤其是针对天津的质量数据进行对比分析。在分析的基础上得出空气质量变化情况,提出一些意见。并借助机器学习算法根据数据预测空气质量,以达到分析预测的典型大数据分析模式效果。整体分析的流程图如下: 实验前的准备 1.1 数据获取我们这里所得到的数据来源于网络公开的空气质量数据,数据来源于“天气后报”网站,网址为:http://www.tianqihoubao.com/aqi/tianjin.html。网址内容如下图可见: 图1-1 网址数据图 整个数据的获取使用python进行爬取。流程如下:(1) 导入爬虫所需要的的库: 在air_tianjin_2019.py程序中。其中Requests 是用Python语言编写,基于urllib,采用 Apache2 Lic...
- 下一篇
因为我的一个低级错误,生产数据库崩溃了将近半个小时
前言 halo,相信大家一定过了一个很开心的端午节吧,我看朋友圈里各种晒旅游,晒美食的,真是羡慕啊,不像我,感冒了只能在家撸文章。 当然,玩的多开心,节后上班就有多郁闷,假日综合征可不是说说而已。对此我想表达的是,没事,不用郁闷,来看我如何自爆家丑来让你们开心下。 反常的sql语句 上周四午休时分,我正在工位上小憩,睡梦中仿佛看到了自己拿着李白在荣耀峡谷里大杀四方的情景,就在我刚拿完五杀准备带领队友推对面水晶的时候,一句慌乱急促的“糟了”把我从睡梦中惊醒。我眯开朦胧的双眼,才发现刚才的发声来源于我的组长庄哥,看到他在紧张的点开日志系统查看日志,我预感到有什么不妙的事情发生,仔细一问才知道,原来就在我眯眼的期间,线上数据库服务器的CPU被打满,同时触发了生产数据库只读延迟的限定时间并且发出告警,而且告警的过程持续了半个小时。 这让我倒吸了一口凉气,因为我们组做的系统很多都用的是同一个数据库服务器,日用户活跃量有好几十万,如果服务器崩溃了将会使所有的系统服务都不可用,于是我们赶紧通过sql日志进行问题查找,最后排查出来是因为一张sql的高量查询没有走索引导致,日志列表显示,这条sql语句的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果