关于MyBatis 全局配置深入讲解(settings详解持续更新) 1-1

本文详细讲解了MyBatis全局配置文件中的properties和settings部分。properties部分介绍了如何配置和使用外部属性文件,如jdbc.properties。settings部分着重解释了MyBatis的重要运行时设置,包括一级缓存和二级缓存的工作原理和应用场景。一级缓存默认开启,作用于Session,而二级缓存则允许跨Mapper的缓存,适用于减少数据库访问和提升性能,但有其局限性,如无法实现细粒度的数据更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值