Mybatis是一个持久层框架,一个不完全的ORM框架,sql语句需要程序员去编写,有(输入映射、输出映射)。
优点:门槛不高,学习成本低,程序员的精力集中在sql上,适合互联网等需要变化较大的项目。
sqlMapConfig.xml ->sqlSessionFactory->sqlSession->Excutor->mappedStatement->mysql
sqlSessionFactory是单例的。
sqlSession是线程不安全的,需要放在方法体内执行。
Mapper写法需要遵循一些规范:
1. Namespace=”*.*.*.*Mapper”
2. 方法名与mapper中id 一致
3. 方法中的参数和返回值与mappe中一致
输入映射:
parameterType:指定输入参数可以是简单类型、pojo,hashmap.
对于综合查询,建议parameterType使用包装pojo,有利于扩展。
输出映射:
resultType 列名和属性名必须一致,如果不一致需要映射则使用resultMap.
不管返回单个对象或列表,都是填写单个对象的全名称。
resultMap:
将关联查询的列映射到一个pojo属性中。(一对一)
将关联查询的列映射到一个List<pojo>中。(一对多)
动态SQL:
Sql片段
If
Foreach
一对一查询:
使用resultType实现较为简单,如果使用resultMap,则使用
<resultMap>
<assosiation>
</assosiation>
</resultMap>
resultMap可以实现延迟加载,resultType则不能。
一对多的查询:
<resultMap>
<collection property=”” ofType=””>
</collection>
</resultMap>
多对多查询:
先写SQL,再写resultMap.
resultType:
查询结果的列名可以和pojo属性名一一对应。
resultMap:
一一对应:association
一对多:collection
延迟加载:
Association,collection具有延迟加载功能。
<association select=”延迟加载去执行的statement_id (namespance.statement)” column=”select查询条件” >
</association>
LazyloadEnable d = true;
aggressiveLazyLoading = false;
一级缓存:
操作DB时需要构造sqlSession对象,在对象中有一个HashMap用于存储数据。
默认开启。Spring中事务控制在service中,一个service对应一个sqlSession.
在insert,update,delete操作时,会清空sqlSession,免于脏读。
二级缓存:
多个sqlSession操作同一Mapper的sql语句,多个sqlSession共享一个二级缓存区域。每个namespace都有自己的一个二级缓存区域,某种意义上一个namespace对应一个mapper.
默认开启。总开关, cacheEnabled = true, 还需在每个mapper.xml中开启。
<cache type=”cache接口实现类” />
Pojo需要实现serializable 接口。
每次查询需要从数据库中取。<select useCache=”false” />
刷新缓存(清空缓存) 如果insert,update,delete. <insert flushCache=”true” />
一般不需要这样设置。
Mybatis整合ehcache.
Ehcache 是一个分布式缓存。Mybatis无法实现分布式缓存,需要与redis,ehcache,memcached等进行整合,缓存集中式管理(集群)。
Mybatis提供了一个cache接口,可以自行开发。
二级缓存应用场景:
1. 查询多实时性要求不高的
2. 耗时较高的统计分析, flushInterval 刷新频率。
二级缓存的局限性:
对细粒度的数据级别的缓存实现不好。
Spring和mybatis整合