MyBatis 全局配置深入讲解 1-1
MyBatis 的配置值包含了影响较深的设置(settings) 和属性(preperties)信息。
其文件结构为:
1.properties 属性
(1)可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,也可通过 properties 元素的子元素来配置。
<properties>
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/emp" />
<property name="username" value="root" />
<property name="password" value="123456" />
</properties>
(2) properties 也可以创建一个资源文件,名为jdbc.properties的文件,将四个链接字符串的数据在资源文件中通过键值对[key=value] 的方式放置,不需要任何符合,一条占一行。
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/emp
jdbc.username=root
jdbc.password=123456
(3) environment元素的dataSource元素中为其动态设置。
<environments default="oracle">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username"
value="${jdbc.username}" />
<property name="password"
value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
2.关于settings设置
1,Settings为Mybatis中极为重要的调整设置,该设置会改变MyBtais的运行时状态或行为。
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
cacheEnabled中,MyBatis 提供了一级缓存和二级缓存。
- 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session close 后,该Session中的所有 Cache 就将清空。
- 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义第三方存储源。
- 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行操作后,默认该作用域下所有 select 中的缓存将被clear
Mybatis一级缓存测试
String config = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(config);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession(); // 执行在bean配置文件中定义的sql语句
User user = session.selectOne("UserMapper.findById", 1);
System.out.println(user);
/*
* 一级缓存默认就会被使用
*/
user = session.selectOne("UserMapper.findById", 1);
System.out.println(user);
session.close();
/*
1. 必须是同一个Session,如果session对象已经close()过了就不可能用了
*/
session = MyBatisUtil.getSqlSession();
user = session.selectOne("UserMapper.findById", 1);
System.out.println(user);
/*
2. 查询条件必须是一样的
*/
user = session.selectOne("UserMapper.findById", 2);
System.out.println(user);
/*
3. 没有执行过session.clearCache()清理缓存
*/
//session.clearCache();
user = session.selectOne("UserMapper.findById", 2);
System.out.println(user);
/*
4. 没有执行过增删改的操作(这些操作都会清理缓存)
*/
session.update("UserMapper.updateUser",
new User(2, "user", 23));
user = session.selectOne("UserMapper.findById", 2);
System.out.println(user);
MyBatis中一级缓存是默认开启的,即在查询中(一次SqlSession中),只要当SqlSession不关闭,那么你的操作会默认存储使用一级缓存。
*
## Mybatis二级缓存测试
<settingname='cacheEnabled'value='true'/>
<!-- 全局配置参数,需要时再设置 -->
<settings>
<!-- 开启二级缓存 默认值为true -->
<settingname='cacheEnabled'value='true'/>
</settings>
&&二级缓存的应用场景
1,对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
2,实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为秒,分钟,小时等,以实际需求而定。
&&关于二级缓存的局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,对同时缓存较多条数据的缓存。
比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。