mybatis
2021-03-19 15:50:00 0 举报
AI智能生成
mybatis基础总结
作者其他创作
大纲/内容
快速入门
简介
原生JDBC存在的问题
和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往往会查询更多的字段,从而性能反而较低
2. MyBatis真正实现了java代码和sql的分离
3. SQL优化上 MyBatis强于Hibernate
4. MyBatis优化维护方便 SQL全存在于XML中 不需要修改源代码
5. 开发效率上 Hibernate略强于mybatiss
6. 从性能上说 因为Mybatis全都是自己手写的SQL,因此性能相对较高反之。Hibernate更加提倡使用HQL,HQL往往会查询更多的字段,从而性能反而较低
工作原理图
工作流程描述
主要配置文件
加载配置文件
<!-- 1.加载java的配置文件或者声明属性信息 -->
<properties resource="db.properties"></properties>
<properties resource="db.properties"></properties>
配置数据库信息
<!-- 2.配置mybatis的环境信息,与spring后该信息由spring管理 -->
<environments default="development">
<environment id="development">
<!-- 3.配置JDBC事务控制,由mybatis进行管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- 4.配置数据源,采用mybatis进行管理 -->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<environments default="development">
<environment id="development">
<!-- 3.配置JDBC事务控制,由mybatis进行管理-->
<transactionManager type="JDBC"></transactionManager>
<!-- 4.配置数据源,采用mybatis进行管理 -->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
配置别名
<!-- 3.自定义别名 -->
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias type="com.chh.po.User" alias="User"/>
</typeAliases>
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias type="com.chh.po.User" alias="User"/>
</typeAliases>
加载映射文件
单一加载
<!-- 加载映射文件 -->
<mappers>
<mapper resource="User.xml"/>
<mapper resource="UserMapper.xml"/>
</mappers>
<mappers>
<mapper resource="User.xml"/>
<mapper resource="UserMapper.xml"/>
</mappers>
批量加载
<!-- 批量加载映射文件
要求:mapper接口和mapper映射文件要名称相同,且放到同一个目录下
-->
<mappers>
<package name="com.chh.mapper"/>
</mappers>
要求:mapper接口和mapper映射文件要名称相同,且放到同一个目录下
-->
<mappers>
<package name="com.chh.mapper"/>
</mappers>
映射文件
占位符
#{}表示占位符?解析传递过来的参数
${}对传递过来的参数原样拼接在SQL语句中
主键返回(配置insert语句使用)
mysql 通过SELECT LAST_INSERT_ID()实现
oracle 通过序列 SELECT seq.nextval from dual实现
输入映射(parameterType)
简单类型
pojo类型
包装类型
Map类型
hashmap
输出映射(resultType)
简单类型
pojo类型
resultMap
使用resultMap进行结果映射时,不需要查询的列名和映射的属性名必须一致。但是需要声明一个resultMap,来对列名和属性名进行映射
映射关系
一对一(<association>)
resultType
使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。而且映射的属性要存在与一个大的对象中,它是一种平铺式的映射
resultMap
使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式
定义Map
使用Map
一对多(<collection>)
定义Map
使用Map
多对多
定义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一级缓存是默认开启的
主配置文件
<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在多表查询时,极大可能会出现脏数据,有设计上的缺陷。
在分布式环境下,由于默认的mybatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将mybatis的Cache接口实现,有一定的开发成本,直接使用Redis,Memcached等分布式缓存成本更低,安全性也更高
缓存的架构图
逆向工程
会用即可
0 条评论
下一页