mybatis
2019-04-18 10:40:27 0 举报
AI智能生成
mybatis 架构梳理
作者其他创作
大纲/内容
mybatis
快速入门
简介
原生JDBC存在的问题
和hibernate对比
工作原理图
工作流程描述
主要配置文件
加载配置文件
<!-- 1.加载java的配置文件或者声明属性信息 --><properties resource=\"db.properties\"></properties>
配置数据库信息
配置别名
<!-- 3.自定义别名 -->\t<typeAliases> <!-- 单个别名定义 --> <typeAlias type=\"com.chh.po.User\" alias=\"User\"/>\t</typeAliases>
加载映射文件
单一加载
<!-- 加载映射文件 -->\t<mappers> <mapper resource=\"User.xml\"/> <mapper resource=\"UserMapper.xml\"/>\t</mappers>
批量加载
<!-- 批量加载映射文件 要求:mapper接口和mapper映射文件要名称相同,且放到同一个目录下 -->\t<mappers> <package name=\"com.chh.mapper\"/> \t</mappers>
映射文件
占位符
#{}表示占位符?解析传递过来的参数
${}对传递过来的参数原样拼接在SQL语句中
主键返回(配置insert语句使用)
mysql 通过SELECT LAST_INSERT_ID()实现
oracle 通过序列 SELECT seq.nextval from dual实现
输入映射(parameterType)
简单类型
pojo类型
包装类型
Map类型
hashmap
输出映射(resultType)
resultMap
使用resultMap进行结果映射时,不需要查询的列名和映射的属性名必须一致。但是需要声明一个resultMap,来对列名和属性名进行映射
映射关系
一对一(<association>)
resultType
使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。而且映射的属性要存在与一个大的对象中,它是一种平铺式的映射
使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式
定义Map
使用Map
一对多(<collection>)
多对多
定义resultMap
使用定义的Map
动态SQL
if
可以对输入的参数进行判断
where
默认去掉后面第一个AND 如果没有参数则把自己干掉!
sql片段
foreach
循环传递参数
mapper代理
开发规范
mapper接口的全限定名要和mapper映射文件的namespace值一致。
mapper接口的方法名称要和mapper映射文件的statement的id一致。
mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。
原理
Mapper开发模式底层使用的是jdk的动态代理。
缓存
一级缓存
介绍
一级缓存指的就是sqlsession,在sqlsession中有一个数据区域,是map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询的结果
每个sqlsession中持有了Executor,每个Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成MappedStatement,在Local Cache进行查询,如果缓存命中的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入Local Cache,最后返回结果给用户
配置
mybatis一级缓存是默认开启的
主配置文件
<setting name=\"localCacheScope\" value=\"SESSION\"/>
默认是SESSION级别,即在一个MyBatis会话中执行的所有语句,都会共享这一个缓存。另一种一种是STATEMENT级别,可以理解为缓存只对当前执行的这一个Statement有效
工作流程
缓存命中
缓存未命中
源码剖析
如果是insert/delete/update方法,缓存就会刷新的原因?
总结
mybatis一级缓存的生命周期和sqlsession一致
mybatis一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓存的功能性上有所欠缺
mybatis的一级缓存最大范围是sqlsession内部,有多个sqlsession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement
二级缓存
二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值
二级缓存开启后,同一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量。当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库
<setting name=\"cacheEnabled\" value=\"true\"/>
mybatis的映射xml文件
<cache/>标签用于声明这个namespace使用二级缓存,并且可以自定义配置
<cache-ref>代表引用别的命名空间的Cache配置,两个命名空间的操作使用的是同一个Cache
<cache-ref namespace=\"mapper.StudentMapper\"/>
注意
mybatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,能够到namespace级别。
mybatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷。
缓存的架构图
逆向工程
会用即可
0 条评论
下一页