mybatis框架整体架构
1. 配置文件
全局配置文件(核心配置文件):mybatis-config.xml 作用:配置数据源(配置数据库连接信息),引入映射文件
映射文件:xxMapper.xml,作用:配置sql语句,参数,结果集封装类型等。
2.SqlSessionFactory
作用:获取Sqlsession
通过new SqlSessionFactoryBuilder().build(inputStream)来构建,inputStream:读取配置文件的IO流
3.SqlSession
作用:执行CRUD操作
4.Executor
执行器,sqlSession通过调用它来完成具体的CRUD
5.Mapper Statement
在映射文件里面配置,包含3部分内容:
具体的sql,sql执行所需的参数类型,sql执行结果的封装类型参数类型和结果集封装类型包含3中:HashMap,基本数据类型,pojo
会话对象
1.SqlSessionFactoryBuilder:这是一个临时对象,用完就不需要了,通过这个工厂建造类来创建一个会话工厂
2.SqlsessionFactory:从一个工厂类中得到一个会话对象,一个项目中只需要创建一个会话工厂对象即可,通过会话工厂对象来创建会话对象。
3.SqlSession:每次访问数据库都需要创建一个会话对象,这个会话对象不能共享,访问完成以后会话需要关闭。
mybatis执行流程分析
1.第一步:是从核心配置文件mybatis-config.xml中构建sqlSessionFactory对象,由于核心配置文件mybatis-config.xml中关联了映射文件UserMapper.xml,所以在SqlsessionFactory中也存在映射文件的内容
2.第二步:是从sqlSessoinFactory中获取sqlSession会话对象,其实SqlSession会话对象底层封装的就是conn连接对象
3.第三步:是通过SqlSession会话对象调用查询方法,然后根据参数找到映射文件中的sql语句,并将数据封装到实体类的对象中。
mybatis核心配置
1. mybatis全局配置文件是mybatis框架的核心配置,整个框架只需一个
2. mybatis全局配置文件中的配置顺序:注意如果配置多项,必须按照以下顺序进行配置
properties:属性配置
settings:设置
typeAliases:类型别名设置
typeHandlers:类型处理器
enviroments:环境变量
environmnet(环境变量)
transactionManager(事务管理器)
dataSource (数据源)
mappers 映射器
mapper 映射器
resource:配置类路径下的映射文件(掌握)
url:配置磁盘位置的映射文件
class:配置接口
1.要求接口和映射文件在同一包下
2.要求接口和映射文件同名
3.要求namespace的值必须为接口的全限定类名
package:配置接口包扫描(掌握)
1.要求接口和映射文件在同一个包下
2.要求接口和映射文件同名
3.要求namespace的值必须为接口的全限定类名
#{}和${}的区别
1.都能够获取传入的命名参数
2.#{}:以预编译的方式将参数设置到sql语句中,方式sql注入。可以自动加单引号
${}: 把参数直接拼接到sql语句中,不能够方式sql注入。不能自动加单引号
3.具体应用:
#{}获取sql语句中的条件参数
${} 应用于sql语句拼接和读取配置文件
结果映射
1.返回的是基本类型,直接书写对应的基本类型别名获取全名即可
2.返回值为一个pojo(User)对象,resultType后直接书写User即可
3.返回值为一个List<User>时,resultType需要设置成集合中存储的具体pojo数据类型
4.返回值为map,直接书写map即可
resultMap
1.resultMap用来手动配置属性和字段的映射关系
id属性:定义唯一标识,用来被sql语句的声明引用的
type属性:配置结果集类型,将查询的数据往哪个类型中封装
autoMapping属性的值
为true时:在字段和属性名称相同时,会进行自动映射。如果不配置,则默认为true
为false时,只针对resultMap中已经配置的字段作映射
mybatis缓存
一级缓存
1.概念:一级缓存属于本地缓存,SqlSession级别的
2.原理:
1)在同一个Sqlsession,发生了一次查询,查询的结果会存入到一级缓存
2)第二次在发生相同查询时,直接从缓存中获取数据,不会在与数据库建立连接查询数据。
3)一级缓存默认开始,是无法关闭的。
3.一级缓存是session级别,session与session之间不能共享缓存
#### 一级缓存失效的情况
1.查询条件不一致
2.不同的session下查询
3.两次查询期间存在增删改操作
4.手动清除一级缓存(sqlSession.clearCache();)
二级缓存
1.概念:全局缓存 namespace级别,多个sqlSession可以共享二级缓存数据
2.原理:
1)在一个sqlSession,进行了一次查询,会把查询结果存入到一级缓存
2)当sqlSession关闭之后,mybatis会把一级缓存中的数据存入到二级缓存中
3)当我们再次发生相同的查询时,会从二级缓存中命中。
3.开启二级缓存条件
1.手动开启 全局配置文件中 <setting name="cacheEnabled" value="true"/>
2.映射文件中 <cache/> 或者注解@CacheNamespace(blocking = true)
3.第一个session必须关闭
4.二级缓存的对象必须序列化(二级缓存的原理就是将对象序列化)
#### 二级缓存失效的情况
1.第二个sqlsession在执行update,insert,delete的时候,同样会情况二级缓存中的内容