MyBatis 实践 -配置
来源:互联网 发布:湖畔网络 编辑:程序博客网 时间:2024/04/20 08:15
Configuration
mybatis-configuration.xml是MyBatis的全局配置文件(文件名任意),其配置内容和顺序如下:
- properties : 属性(文件)加载/配置
- settings : 全局配置参数
- typeAliases : 定义类型别名
- typeHandlers : 类型处理器
- objectFactory : 对象工厂
- plugins : 插件
- environments : 环境集合属性对象
- environment
- transactionManager : 事务管理
- dataSource : 数据源
- environment
- databaseIdProvider:P数据库厂商标识
- mappers : 映射器
properties
方便对配置参数统一管理,供其他XML引用,我们可以将数据库的连接参数抽取出来:
- db.properties
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- mybatis-configuration.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
注: MyBatis按照如下顺序加载properties:
1) 在<properties>
标签内定义的属性;
2) .properties文件中定义的属性;
3) 最后读取作为方法参数传递的属性.
settings
MyBatis全局配置参数,会影响MyBatis运行时行为(如:开启二级缓存/延迟加载).见MyBatis文档.
typeAliases
MyBatis默认支持的类型别名可参考MyBatis文档,我们也可以自定义别名,但并不推荐,使用PO对象的全限定名可以提高Statement的可读性.
typeHandlers
typeHandlers
用于Java类型和JDBC类型转换,MyBatis提供了很多默认的类型处理器(详见MyBatis文档),而且也基本满足日常开发需求,因此一般就不再需要单独定义.
mappers
前面已经将SQL语句定义到了mapper文件中,那么<mappers/>
属性就是告诉MyBatis到哪里去寻找mapper文件,MyBatis提供了如下几种配置方法:
<mapper resource=""/>
使用类路径的资源(Resources
/java
目录下)<mapper url=""/>
使用完全限定路径<mapper class=""/>
使用mapper接口类路径<package name=""/>
注册指定包下的所有mapper接口注意:后两种方式要求mapper接口名和mapper映射文件名称相同,且放在同一个目录中(不推荐).
其他关于MyBatis的配置信息可参考MyBatis文档.
整合Spring
实现MyBatis与spring整合之后,可以使用Spring来管理SqlSessionFactory
和mapper接口,Spring自动使用SqlSessionFactory
创建SqlSession
,并将实现好DAO接口注册到Spring容器中, 供@Autowired
使用.
1. 添加依赖
- 添加Spring支持
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 添加MyBatis-Spring包
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- 添加Hikaricp数据库连接池
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
- 不要忘了MySQL数据库驱动
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
2. 配置文件
- 精简mybatis-configuration.xml
可以将数据源的配置移到下面的applicationContext-datasource.xml中.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 定义applicationContext-datasource.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
上面的配置存在一个问题:需要针对每个mapper配置一个MapperFactoryBean
(繁琐),因此这段根据mapper接口生成代理对象的配置可更改如下:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
附: applicationContext-database.xml完整配置可参考: Git地址
- 定义Spring主配置文件applicationContext.xml
定义注解驱动及加载静态配置文件datasource:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- Client
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
缓存
与大多数持久层框架一样,MyBatis也支持一级缓存和二级缓存.
缓存作用是提升系统整体性能(不是提升数据库性能:因为缓存将数据库中的数据存放到内存,下次查询同样内容时直接从内存读取,减轻数据库压力,而且直接从内存中读取数据要比从数据库检索快很多,因此可以提升系统整体性能).
缓存数据更新:当一个作用域(一级缓存为
SqlSession
/二级缓存为namespace)进行了C/U/D
操作后,默认该作用域下所有缓存都被清空.
一级缓存
MyBatis默认开启了一级缓存.一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache
的HashMap
本地缓存,其存储作用域为SqlSession
,同一个SqlSession
几次执行相同SQL,后面的查询会直接从缓存中加载,从而提高查询效率/减轻数据库压力.当SqlSession
经flush
/close
后,该SqlSession
中的所有Cache数据被清空.
二级缓存
与一级缓存机制类似,MyBatis二级缓存默认也是采用PerpetualCache
的HashMap
存储,不同在于二级缓存存储作用域为namespace
/mapper
,并且可以自定义缓存实现,如Ehcache.
MyBatis默认没有开启二级缓存,需要经过以下步骤才能使用:
- 启用二级缓存(可选)
其需要在mybatis-configuration.xml的settings
全局参数中开启:
- 1
- 2
- 3
- 1
- 2
- 3
cacheEnabled
对此配置文件下的所有cache进行全局性开/关设置(默认为true
).
- 配置缓存策略
在mapper映射文件中添加<cache/>
标签,以指定该namespace开启二级缓存, 并指定缓存策略:
- 1
- 1
1) eviction
:缓存淘汰算法:
2) flushInterval
:刷新间隔(缓存过期时间),单位为毫秒,MyBatis会每隔一段时间自动清空缓存(默认刷新间隔为空, 即永不过期,仅调用语句时刷新).
3) size
:引用数目,要记住你缓存的对象的数目和运行环境可用内存资源数目(默认1024).
4) readOnly
: 只读.如果为true,则所有相同SQL返回同一对象(因此这些对象不能修改,有助于提高性能,但并发操作同一条数据时,可能不安全);如果为false,则相同SQL后面返回的是cache的clone副本(通过序列化,慢一些但更是安全,因此默认是false).
- 序列化
PO对象要实现Serializable
序列化,因为二级缓存的存储介质不一定只是内存:
- 1
- 2
- 3
- 1
- 2
- 3
- Client
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
运行代码, 并观察log输出的命中率(Cache Hit Ratio).
- Statement配置
1) 禁用缓存: 在Statement中设置useCache="false"
可以禁用当前select语句的二级缓存(默认为true
:该SQL启用二级缓存).
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
2)刷新缓存: 同一个namespace中,如果还有其它insert/update/delete操作,需要刷新缓存,使用flushCache="true"
属性设置(默认为true
刷新缓存).
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
整合Ehcache
MyBatis暴露一个org.apache.ibatis.cache.Cache
接口出来,通过实现该接口,可以实现各类缓存产品(如Ehcache/Redis/Memcached)与MyBatis的整合(MyBatis的特长操作数据库,缓存管理并不是其擅长,因此整合其他缓存产品可以提高系统整体性能).
Ehcache是一个纯Java开发的进程内缓存框架,具有开源/快速/灵活等特点,是hibernate默认的CacheProvider.使用Ehcache需要在pom.xml中添加如下依赖:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 配置Ehcache
在Resources目录下添加ehcache.xml配置文件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
diskStore
指定缓存数据在磁盘的存储位置maxElementsInMemory
在内存中缓存element的最大数目maxElementsOnDisk
在磁盘上缓存element的最大数目,0表示无穷大eternal
设定缓存的elements是否永远不过期.true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断overflowToDisk
设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上timeToIdleSeconds
刷新间隔:缓存数据前后两次访问时间超过timeToIdleSeconds时,这些数据便会删除(默认为0,时间间隔无穷大)timeToLiveSeconds
缓存element的有效生命期(默认为0,时间无限)diskSpoolBufferSizeMB
设置DiskStore(磁盘缓存)缓存区大小.默认是30MB.diskPersistent
在JVM重启时是否使用磁盘保存Ehcache数据,默认是false.diskExpiryThreadIntervalSeconds
磁盘缓存的清理线程运行间隔,默认是120秒.memoryStoreEvictionPolicy
当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略.默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)- mapper配置ehcache
- 1
- 2
- 1
- 2
还可以根据需求调整当前namespace的缓存参数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
二级缓存小结
- 适用场景
对于查询请求多且对查询结果实时性要求不高的场景,可采用二级缓存降低数据库负担,提高访问速度(业务场景如:微博/动态/订单信息等). - 局限
二级缓存对细粒度级别的缓存实现不好,如”缓存所有的商品信息时,二级缓存就无法实现当一个商品信息变化时只刷新该商品缓存而不刷新全部商品缓存“,因为二级缓存区域以namespace
为单位划分,当一个商品发生变化会将所有商品缓存清空,因此解决此类问题需要在上层对数据进行业务划分.
- MyBatis 实践 -配置
- MyBatis 实践 --配置
- MyBatis 实践 -配置
- MyBatis之配置实践
- springMVC+mybatis+ehcache缓存配置实践
- MyBatis 实践
- Spring &Mybatis 实践
- 实践---搭建mybatis框架
- MyBatis 入门以及实践
- springBoot集成mybatis实践
- mybatis配置
- mybatis 配置
- mybatis配置
- mybatis配置
- mybatis----配置
- Mybatis配置
- mybatis配置
- mybatis配置
- 批量删除redis keys
- Babel 基础
- charts框架 横向 纵向柱状图
- selenium用Jquery定位总结笔记(基于python语言)
- jsp中的两种include方式
- MyBatis 实践 -配置
- Swift 使用 NSClassFromString 遇到的大坑
- lhgdialog弹出窗口再弹出一级窗口时,二级窗口在一级窗口下面,如何让他到一级窗口上面?
- 数人云实践|SRE遇上金融老干部,解决发布协调&监控告警两大难题
- Freemarker *.ftl后缀文件 在 eclipse IDE以HTML格式打开
- ESLint 备忘录
- Spring Bean的生命周期
- Linux chmod 命令 说明
- Windows Server 2008 r2 64bit 运行ASP提示ADODB.Connection error ‘800a0e7a’错误解决办法