mybatis
Mybatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
Mybatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的pojo为数据库中的记录。
什么是持久化?
持久化就是将程序的数据在持久状态和瞬时状态转化的过程。
内存(指的是RAM):断电即失
为什么需要Mybatis?
帮助程序员将数据存入到数据库中。传统的JDBC代码带复杂了,需要简化,自动化。
优点:简单易学,灵活,sql和代码的分离,提高了可维护性,提供了映射标签,
支持对象与数据库的orm字段映射,提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态SQL
CRUD:
select(id 对应namespace中的方法名;resultType:SQL语句执行的返回值;parameterType:参数类型)
select * from user where id = #{id} 、insert 、update、delete
mybatis核心配置文件(mybatis-config.xml):包含了会深深影响Mybatis行为的设置和属性信息。
<configuration>.配置 <properties>.属性 <setting>.设置
<typeAliases>.类型别名 <typeHandlers>.类型处理器 <objectFactory>.对象工厂
<plugins>.插件 <environments>.环境配置 <environment>.环境变量
<transactionManager>.事务管理器 <dataSource>.数据源 <databaseIdProvider>.数据库厂商标识 <mappers>.映射器
环境配置:Mybatis可以配置成适应多种环境,不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。
学会使用配置多套运行环境!Mybatis默认的事务管理器就是JDBC,连接池:POOLED
属性:可以通过properties属性来实现引用配置文件,这些属性都是可外部配置且可动态替换的,既可以在
典型的Java属性文件中配置,亦可以通过properties元素的子元素来传递。(db.properties)
类型别名:为Java类型设置一个短的名字。存在的意义仅在于用来减少类完全限定名的冗余。
SqlSessionFactoryBuilder:一旦创建了SqlSessionFactory,就不再需要它了,局部变量
SqlSeesionFactory:一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
因此SqlSessionFactory的最佳作用域是应用作用域。最简单的就是使用 单例模式 或 静态单例模式
SqlSession:连接到连接池的一个请求,SQLSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
用完之后需要关闭,否则会一直占用资源
Mapper:这里的每一个mapper就代表一个具体的业务。
。。。。。。
缓存:
查询:连接数据库,会耗费资源,一次查询的结果可以给他暂时存储在一个可以直接取到的地==>内存:缓存
我们再次查询相同的数据的时候,直接从缓存中取,
缓存:用来存储内存中的临时数据,将用户经常查询的数据放在缓存中,用户去查询数据就不用从磁盘上查询,从而提高了查询数据,解决了高并发系统的性能问题。
为什么使用缓存:减少和数据库的交互次数,减少系统开销,提高系统效率。
Mybatis包含一个非常强大的查询缓存特性,他可以非常方便地定制和配置缓存。缓存可以极大的提高查询效率。
mybatis缓存:一级缓存和二级缓存
默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
二级缓存需要手动开启和配置,它是基于namespace级别的缓存
为了提高可扩展性,Mybatis定义了缓存接口Cache。我们可以通过实现Cache接口来定义二次缓存
一级缓存:也叫本地缓存(SQLSession)与数据库同义词会话期间查询到的数据会放在本地缓存中,如果需要查询相同的数据,直接从缓存中取,不用再去访问数据库。
一级缓存使默认开启的,只在一次SqlSession中有效,也就是拿到连接关闭数据库这个区间段,一级缓存就是一个Map.
二级缓存:也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存。基于namespace级别的缓存,
工作机制:一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;如果当前会话关闭了,这个会话对应的一级缓存就消失了,
但是我们想要的是,会话关闭后,一级缓存中的数据会被保存到二级缓存中。新的会话查询信息时,就可以从二级缓存中取。
不同的mapper查出的数据会放在自己对应的缓存(map)中。
只要开启了二级缓存,在同一个Mapper下就有效,所有的数据会先放在一级缓存中,只有当会话提交,或者关闭的时候,才会提交到二次缓存中。