资讯专栏INFORMATION COLUMN

Mybatis使用陷阱

cgspine / 3190人阅读

摘要:解决办法很简单,就是在使用的时候一定要写上属性。实际上关于的作用在官方文档中很隐晦的提到过了见。比如下面这个配置启用了,且部分配置了的映射。解决办法有两个不配置的映射不使用参考文档的问题在使用懒加载特性的时候有一点需要注意,就是要把设置为。

缓存不是基于行的

“缓存并不是基于行的”的意思就是,mybatis缓存的粒度是全部查询结果,而不是查询结果的每行,这也就意味着每次查询,就只有一份缓存,而不是有几行就有几分缓存。

这点和hibernate很不同,hibernate的缓存是基于每个对象的,即查询出来的有几个对象,那就有几份缓存。

mybatis无法像hibernate给每个对象做缓存,主要原因是mybatis非常自由,能够配置任意的返回结果类型,这也就是说返回的结果并不一定都有主键,如此一来也就没有办法标识某一行数据和哪个返回结果对应,而hibernate是强制你所映射的每个类都要有主键的。

参考文档:http://www.mybatis.org/mybati...

缓存默认没有失效时间

“缓存默认没有失效时间”的意思是如果我们直接在数据库里修改数据,那么每次用mybatis查询的时候,使用的还是上一次的缓存结果,且这份缓存一直有效,除非我们通过mapper调用了update、delete、insert方法,这些方法会使缓存失效。解决办法很简单,就是在使用的时候一定要写上flushInterval属性。

参考文档:http://www.mybatis.org/mybati...

使用Partial Auto-mapping后,自动去重问题

Partial Auto-mapping的意思是你对ResultMap只提供了部分字段的配置而不是全部字段,但是如果你的这个ResultMap没有设置ID,也就是主键,那么mybatis将会根据你提供的这一部分字段配置来判断两行数据是否重复,并且会将重复的去掉。

实际上关于id的作用在官方文档中很隐晦的提到过了:见id & result。

比如下面这个配置启用了autoMapping,且部分配置了property的映射。在这种情况下,如果查询出两条记录了,而这两条记录的task_key的值是一样的时候,mybatis就会认为是同一条,最终返回给你一个AuditLog


   

解决办法有两个:

不配置property的映射:


不使用automapping:


    
    
    
    
    
    

参考文档:http://www.mybatis.org/mybati...

aggressiveFetch的问题

在使用mybatis懒加载特性的时候有一点需要注意,就是要把aggressiveFetch设置为false

根据官方文档,当设置为true的时候,如果你get了懒加载属性,那么其他懒加载属性也会一并加载。

但实际情况时,当设置了true的时候,如果你get了任一属性,那么所有懒加载属性也会一并加载。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64935.html

相关文章

  • 【ES6】改变 JS 内置行为的代理与反射

    摘要:通过对这些底层内置对象的代理陷阱和反射函数,让开发者能进一步接近引擎的能力。显然,与要求代理目标对象必须是一个函数,这两个代理陷阱在函数的执行方式上开启了很多的可能性,结合使用就可以完全控制任意的代理目标函数的行为。 代理(Proxy)可以拦截并改变 JS 引擎的底层操作,如数据读取、属性定义、函数构造等一系列操作。ES6 通过对这些底层内置对象的代理陷阱和反射函数,让开发者能进一步接...

    lushan 评论0 收藏0
  • 深入理解ES6笔记(十一)代理(Proxy)和反射(Reflection)API(12)

    摘要:是陷阱函数对应的反射方法,同时也是操作的默认行为。对象外形指的是对象已有的属性与方法的集合,由于该属性验证只须在读取属性时被触发,因此只要使用陷阱函数。无论该属性是对象自身的属性还是其原型的属性。 主要知识点:代理和反射的定义、常用的陷阱函数、可被撤销的代理、将代理对象作为原型使用、将代理作为类的原型showImg(https://segmentfault.com/img/bVbfWr...

    explorer_ddf 评论0 收藏0
  • 深入理解ES6之《代理和反射》

    摘要:使用陷阱验证属性用于接收属性代理的目标的对象要写入的属性键被写入的属性的值操作发生的对象通常是代理属性必须是数字抛错用陷阱验证对象结构属性不存在抛出错误使用陷阱隐藏已有属性可以用操作符来检测给定对象中是否包含有某个属性,如果自有属性或原型属 使用set陷阱验证属性 let target = { name: target } let proxy = new Proxy(targe...

    Stardustsky 评论0 收藏0
  • 深入理解ES6之《代理和反射》

    摘要:使用陷阱验证属性用于接收属性代理的目标的对象要写入的属性键被写入的属性的值操作发生的对象通常是代理属性必须是数字抛错用陷阱验证对象结构属性不存在抛出错误使用陷阱隐藏已有属性可以用操作符来检测给定对象中是否包含有某个属性,如果自有属性或原型属 使用set陷阱验证属性 let target = { name: target } let proxy = new Proxy(targe...

    curried 评论0 收藏0

发表评论

0条评论

cgspine

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<