mybatis

  • Post author:
  • Post category:其他


XML映射器

接口映射器

在这里插入图片描述

1.xml映射器是MyBatis原生支持的映射器方式,优点是功能强大,缺点是配置显得臃肿和复杂;接口映射器支持通过注解的方式在Java接口方法上编写SQL语句,优点是简洁,不再依赖外部xml配置,缺点是功能没有xml映射器强大。需要特别注意的是,在接口映射器中使用@SelectProvider注解动态拼装SQL时存在SQL注入攻击的风险。因此,通常都是将二者联合使用,即可以使用接口映射器带来的简洁性,也能使用xml映射器的强大功能。

2种映射器都可以分为独立使用和在Spring框架中集成使用2种不同的方式,独立使用时需要开发者自己处理事务管理和资源释放;在Spring框架中集成时事务管理和资源释放交给Spring框架处理,对开发者是透明的,更加高效和友好。

对于批量添加记录需要返回主键字段值的需求,只能在xml映射器中实现,接口映射器无能为力。



生命周期与作用域

在这里插入图片描述


SqlSessionFactoryBuilder



这个类可以在任何时候被实例化、使用和销毁。一旦创建了 SqlSessionFactory,就不再需要它了。好的作用域是方法体内,局部变量


SqlSessionFactory:


SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。最佳作用域是应用作用域。

最简单的就是使用单例模式或者静态单例模式。


SqlSession:


连接到连接池的一个请求!

SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。用完之后需要赶紧关闭,否则占用资源


Mapper:


Mappers 是创建来绑定映射语句的接口,该Mapper 实例是从SqlSession 得到的。所有mapper 实例的作用域跟创建它的SqlSession 一样。mapper 实例最好的作用域是method,也就是它们应该在方法内被调用,使用完即被销毁。



懒加载机制

延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的数据的话,就不查询从表的信息。

<!-- 开启延迟加载 -->
 <settings>
        <!-- lazyLoadingEnabled:延迟加载启动,全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。默认是false -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- aggressiveLazyLoading:积极的懒加载,当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。false的话按需加载,默认是true -->
        <setting name="aggressiveLazyLoading" value="false"/>
          
        <!-- 开启二级缓存,默认是false -->
        <setting name="cacheEnabled" value="true"/>
</settings>

mybatis提供查询缓存,如果缓存中有数据就不用从数据库中获取,用于减轻数据压力,提高系统性能。

一级缓存是

SqlSession级别

的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。Mybatis默认开启一级缓存

二级缓存是

mapper级别

的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。注意:当开启了二级缓存时,那么一级缓存就失效了,大家都共享二级缓存,相当于没有一级缓存,不管干什么都是对二级缓存进行操作。

mybatis.configuration.cache-enabled=true

在这里插入图片描述



版权声明:本文为weixin_45938545原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。