首页 > 其他分享 >Mybatis使用cache-ref需注意的问题

Mybatis使用cache-ref需注意的问题

时间:2024-05-14 09:55:28浏览次数:22  
标签:标签 cache mybatis 报错 Mybatis 解析 ref caches

https://blog.csdn.net/Ewan_/article/details/129865974

1.在MapperXML中使用<cache-ref>标签


UserCacheMapperXML需要有<cache>标签 ,如果没有则会爆

Exception in thread "main" org.apache.ibatis.builder.IncompleteElementException: No cache for namespace 'com.xjy.mybatisdemo.UserCacheMapper' could be found.
原因解析:

上面<cache-ref>标签引用的UserCacheMapper并没有<cache>标签

 

分析原因

首先mybatis解析每个XML会创建XMLMapperBuilder调用cacheElement方法解析<cache>标签

如果有<cache>标签则会被XMLMapperBuilder的全局变量builderAssistant解析成Cache接口对象(该对象是使用了构建者、装饰者模式,具体读者自行看源码),然后configuration(mybatis最重要的全局配置属性)的caches(Map类型)会添加key

 

如果没有<cache>标签则会跳过(UserCacheMapper解析完了)

 

接下来解析引用<cache-ref>的XML

 

同理,mybatis解析XML时会创建XMLMapperBuilder,解析<Cache-ref>标签

在解析时发现configuration.caches没有这个key(key是xml的namespace),所以报错

 

第二个解决方法在接口上面添加CacheNamespace

 

解析到该文件时会检查是否有该注解,有的话则会添加到caches

 

2.使用了cache-ref标签后,每个<select>标签返回类型对象都需要实现Serializable,如果不用则会爆序列化错误
下面是<select>标签,该标签中使用到了resultMap,该map中有使用到了User对象以及Consumer对象

 

当执行sql语句时,会报错

Exception in thread "main" org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: com.xjy.mybatisdemo.pojo.User
分析原因

mybatis的sqlsessionfactory调用close方法时会走到

 

在这个方法中,会把每个sql查询出来的返回对象进行序列化,所以这就是报错原因

标签:标签,cache,mybatis,报错,Mybatis,解析,ref,caches
From: https://www.cnblogs.com/zhoading/p/18190621

相关文章

  • LaTeX cleveref 宏包的用法
    介绍cleveref宏包会自动在我们引用对象时为渲染结果添加类型文字。例如,当我们引用图片时,如果用LaTeX自带的宏\ref{fig:image}去引用,渲染的结果是1。如果我们用cleveref宏包提供的宏\Cref{fig:image}去引用,渲染结果就是Figure1。我们也可以自定义渲染的结果,比如让它......
  • SpringCache
    1、什么是SpringCacheSpringCache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。SpringCache提供了一层抽象,底层可以切换不同的缓存实现。EHCacheCaffeineRedis我们不需要主动显式要求使用什么缓存实现。比如我们要使用redis实现,只......
  • spring整合mybatis
    整合步骤:首先将mybatis-config.xml环境的配置:数据源、驱动、url、username、password…这些基础配置移交给Spring的核心配置文件application.xml文件中!创建bean对象dataSource顶替Resource。再通过dataSource对象,创建bean对象SqlSessionFactory,这时候SqlSessionFactory工......
  • mybatis多线程插入数据表已经事务回滚
    importlombok.extern.slf4j.Slf4j;importorg.apache.commons.collections4.CollectionUtils;importorg.apache.commons.collections4.ListUtils;importorg.apache.ibatis.session.ExecutorType;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibati......
  • mybatisPlus多数据源的使用&使用 lambdaQuery 导致多数据源失效
    依赖<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.2</version></dependency>配置文件:spr......
  • mybatis-plus pageHelper 合理化配置
    mybatis分页设置//自定义分页拦截器importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;publicclassCustomPaginationInterceptorextendsPaginationInnerInterceptor{@......
  • Mybatis之动态SQL使用讲解
    目录1动态SQL1.1引言1.2数据准备1.3if标签1.3.1在WHERE条件中使用if标签1.3.2在UPDATE更新列中使用if标签1.3.3在INSERT动态插入中使用if标签1.4choose标签1.5trim(set、where)1.5.1where1.5.2set1.5.3trim1.5.3.1trim来表示where1.5.3.2trim来表......
  • MyBatis的一级、二级缓存
    一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。二级缓存基于namespace和mapper的作用域起作用的,不是依赖于SQLsession,默认也是采用PerpetualCache,HashMap存储。需要单独......
  • MyBatis延迟加载
    MyBatis是否支持延迟加载延迟加载的意思是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。MyBatis支持一对一关联对象和一对多关联集合对象的延迟加载。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=truel/false,默认是关闭的。或者fetchType=laz......
  • MyBatis批处理
    减少了jdbc驱动与数据库服务器之间的网络传输开销使用batch前:执行一条sql就要进行一次网络IO开销,还要等待服务器响应结束后才能提交下一条sql。预编译n次,设置参数n次,执行n次使用batch之后:客户端的多条sql是一起提交给服务器的,一次batch只涉及到一次网络传输开销。预编译一次,设......