DynamicUpdate正确使用方式(含代码)

Github源码地址

原理

DynamicUpdate: 在只更新同一个session里面,同一个对象有改变的字段。说白了, 就是在更新某条记录之前, 先把这条记录从数据库查出来, 那么这条数据就在session(一级缓存)中, 我们再去修改这个对象的数据即可;

@DynamicUpdate正确使用方式
  1. 在做 update实体类的某个属性之前,先做findById操作
  2. 将需要修改的字段做 set 操作
  3. 做 save 操作
误区及经常出现的错误
  1. 更新数据时,只传入需要更新的数据,而没有操作findById操作,造成其他数据为null
举例

先说明一下@DynamicUpdate注解用在实体类上
有 数据库 表tbl_foo和对应的实体类Foo,如下:

idnamecol3col4col5
1毕加索1770奥地利
class Foo{
    private Integer id;
    private String name;
    private String col3;
    private String col4;
    private String col5;
    getter...
    setter...
}

在Service中更新id=1记录的name属性,代码如下:

Foo foo = fooDao.findById(1);
foo.setName("贝多芬");
fooDao.save(foo);

两种情况:

  1. 在entity类中未使用@DynamicUpdate注解或使用了@DynamicUpdate(false),那么Hibernate底层执行的sql如:
update tbl_foo set name=?, col3=?, col4=?, col5=? where id=?
  1. 在entity类中使用了@DynamicUpdate注解(或@DynamicUpdate(true)),Hibernate底层执行的sql如:
update tbl_foo set name=? where id=?

以上两种情况对数据库更新的结果是等效的,但是使用@DynamicUpdate性能会好一些。因为不使用@DynamicUpdate时,即使没有改变的字段也会被更新。如果进行频繁的更新操作,并且每次只更新少数字段,那么@DynamicUpdate对性能的优化效果还是很好的。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值