导图社区 mybatis配置入门映射文件关系知识点笔记
1. Hibernate是全自动的,MyBatis是半自动的 Hibernate实现了部分自动生成SQL2. MyBatis真正实现了java代码和sql的分离3. SQL优化上 MyBatis强于Hibernate。
网店详情页排版方法分享~包括中心页面组成,优质详情必备,详情页的排版参考方法。感兴趣的小伙伴可以看看哦~
喷绘色彩基础培训方案,内容涵盖色彩基础,喷绘写真。框架清晰,内容丰富,希望对小伙伴有所帮助哦~
酒窖营销计划方案,包括结果目标,过程目标。框架清晰,内容丰富,有需要的小伙伴可以看看哦~ 可供大家参考,借鉴,交流。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
mybatis配置入门映射文件关系知识点笔记
快速入门
简介
>mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的ORM框架,而mybatis是一个不完全的ORM框架。 >mybatis让程序员只关注SQL本身,而不需要去关注如连接的创建、statement的创建等操作
原生JDBC存在的问题
>1. 在创建连接时,存在硬编码 2. 在执行statement时存在硬编码 3. 频繁的开启和关闭数据库连接,会造成数据库性能下降
和hibernate对比
1. Hibernate是全自动的,MyBatis是半自动的 Hibernate实现了部分自动生成SQL 2. MyBatis真正实现了java代码和sql的分离 3. SQL优化上 MyBatis强于Hibernate 4. MyBatis优化维护方便 SQL全存在于XML中 不需要修改源代码 5. 开发效率上 Hibernate略强于mybatiss 6. 从性能上说 因为Mybatis全都是自己手写的SQL,因此性能相对较高反之。Hibernate更加提倡使用HQL,HQL往往会查询更多的字段,从而性能反而较低
工作原理图
工作流程描述
1. 加载mybatis全局配置文件(数据源.mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置.动态SQL语句.结果映射配置)2. SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。3. SqlSession对象完成和数据库的交互 * 用户程序调用mybatis接口层api(即Mapper接口中的方法) * SqlSession通过调用api的Statement ID找到对应的MappedStatement对象 * 通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化.动态sql拼接,生成jdbc Statement对象 * JDBC执行sql。 * 借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
主要配置文件
加载配置文件
配置数据库信息
配置别名
加载映射文件
单一加载
批量加载
映射文件
占位符
#{}表示占位符?解析传递过来的参数
${}对传递过来的参数原样拼接在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片段
让代码有更高的可重用性,先定义后使用,include引入
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一级缓存是默认开启的
主配置文件
默认是SESSION级别,即在一个MyBatis会话中执行的所有语句,都会共享这一个缓存。另一种一种是STATEMENT级别,可以理解为缓存只对当前执行的这一个Statement有效
工作流程
缓存命中
缓存未命中
源码剖析
如果是insert/delete/update方法,缓存就会刷新的原因?
总结
mybatis一级缓存的生命周期和sqlsession一致
mybatis一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓存的功能性上有所欠缺
mybatis的一级缓存最大范围是sqlsession内部,有多个sqlsession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement
二级缓存
二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值
二级缓存开启后,同一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量。当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库
mybatis的映射xml文件
<cache/>标签用于声明这个namespace使用二级缓存,并且可以自定义配置
<cache-ref>代表引用别的命名空间的Cache配置,两个命名空间的操作使用的是同一个Cache
注意
如果不提交事务,二级缓存并不起作用!
mybatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,能够到namespace级别。
mybatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷。
在分布式环境下,由于默认的mybatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将mybatis的Cache接口实现,有一定的开发成本,直接使用Redis,Memcached等分布式缓存成本更低,安全性也更高
缓存的架构图
逆向工程
会用即可