You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Java API为MyBatis Mapper添加缓存后语句未生效,如何解决?

解决MyBatis通过Java API添加Mapper缓存的问题

你当前的代码仅创建并添加了缓存实例,但未将缓存与目标Mapper的命名空间绑定,也未确保查询语句启用缓存,因此缓存没有生效。可以按以下步骤修正:

1. 确保缓存ID与Mapper全类名匹配

MyBatis的缓存是通过**Mapper接口的全类名(即命名空间)**关联的,创建Cache时的ID必须是Mapper的完整类路径,而非实体类名。比如你的Mapper是package.name.SampleMapper,则缓存ID要对应修改:

Cache cache = new CacheBuilder("package.name.SampleMapper")
      .implementation(PerpetualCache.class)
      .addDecorator(LruCache.class)
      .readWrite(true)
      .build();

2. 将缓存与Mapper命名空间绑定

仅调用addCache无法让MyBatis识别缓存所属的Mapper,需要手动将缓存与Mapper的命名空间绑定:

Configuration configuration = sqlSessionFactory.getConfiguration();
// 添加缓存实例到配置
configuration.addCache(cache);
// 构建并绑定CacheNamespace到目标Mapper
CacheNamespace cacheNamespace = new CacheNamespace.Builder()
        .cache(cache)
        .build();
configuration.setCacheNamespace("package.name.SampleMapper", cacheNamespace);

3. 确保查询语句启用缓存

默认情况下MyBatis的select语句useCache属性为true,但如果你的语句手动设置过useCache="false",需要改回true。如果是通过Java API构建MappedStatement,需显式开启:

// 示例:构建select语句时启用缓存
MappedStatement.Builder builder = new MappedStatement.Builder(configuration, "statementId", sqlSource, SqlCommandType.SELECT);
builder.useCache(true); // 开启缓存
MappedStatement mappedStatement = builder.build();
configuration.addMappedStatement(mappedStatement);

4. 验证缓存生效

执行两次相同的查询,观察是否仅第一次触发数据库请求,第二次直接从缓存获取;也可通过调试查看缓存实例中的数据是否存在。

内容的提问来源于stack exchange,提问作者MHSaffari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:30:40