MyBatis 本身并不提供缓存机制,但你可以结合第三方缓存工具来实现缓存功能。在 MyBatis 中,你可以使用 Ehcache、Redis 等缓存工具来缓存查询结果。
以下是一个使用 Ehcache 的示例:
pom.xml
文件中添加以下依赖:<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>3.5.7</version>
</dependency>
mybatis-config.xml
)中,添加 Ehcache 的配置:<configuration>
<!-- ...其他配置... -->
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="useCursorFetch" value="false"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingUnknownColumnToBean" value="true"/>
<setting name="defaultCacheScope" value="SESSION"/>
</settings>
</configuration>
ehcache.xml
),并将其放在类路径下(例如 src/main/resources
):<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="java.io.tmpdir/ehcache"/>
<defaultCache
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
<cache name="com.example.MyMapper.selectByPrimaryKey"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
@CacheNamespace
注解的方法:import org.apache.ibatis.annotations.CacheNamespace;
@CacheNamespace
public interface MyMapper {
MyEntity selectByPrimaryKey(Long id);
}
现在,当你调用 selectByPrimaryKey
方法时,MyBatis 会自动使用 Ehcache 缓存查询结果。当相同的查询再次执行时,MyBatis 会直接从缓存中获取结果,而不是再次执行数据库查询。