@DynamicInsert : 默认true,指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。(如果是)
@DynamicUpdate : 默认true, 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。
package name.ealen.entity; import lombok.Data; import lombok.NonNull; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.SelectBeforeUpdate; import javax.persistence.*; import java.util.Date; /** * @author GYX * @date 2019/12/13 21:36 */ @Entity @Data #@DynamicInsert #@DynamicUpdate public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; private String name; private String sex; private int intAge; private Integer integerAge; private Integer stature; private Date date; }
package name.ealen.dao; import name.ealen.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import javax.transaction.Transactional; /** * @author GYX * @date 2019/12/13 21:37 */ @Transactional public interface UserRepository extends JpaRepository<User,Integer> { User findByName(String name); }
package name.ealen; import name.ealen.dao.UserRepository; import name.ealen.entity.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.Date; /** * @author GYX * @date 2019/12/13 21:37 */ @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class UserTest { @Autowired private UserRepository userRepository; @Test public void beforInsert(){ User user = new User(); user.setName("张三"); userRepository.save(user); User newUser = userRepository.findByName("张三"); System.out.println(newUser.toString()); /** * Hibernate: insert into user (date, int_age, integer_age, name, sex, stature) values (?, ?, ?, ?, ?, ?) * Hibernate: select user0_.id as id1_4_, user0_.date as date2_4_, user0_.int_age as int_age3_4_, user0_.integer_age as integer_4_4_, user0_.name as name5_4_, user0_.sex as sex6_4_, user0_.stature as stature7_4_ from user user0_ where user0_.name=? * User(id=1, name=张三, sex=null, intAge=0, integerAge=null, stature=null, date=null) */ } @Test public void beforeUpdate(){ User newUser = userRepository.findByName("张三"); newUser.setName("李四"); userRepository.save(newUser); User updateUser = userRepository.findByName("李四"); System.out.println(updateUser.toString()); /** * Hibernate: select user0_.id as id1_4_, user0_.date as date2_4_, user0_.int_age as int_age3_4_, user0_.integer_age as integer_4_4_, user0_.name as name5_4_, user0_.sex as sex6_4_, user0_.stature as stature7_4_ from user user0_ where user0_.name=? * Hibernate: select user0_.id as id1_4_0_, user0_.date as date2_4_0_, user0_.int_age as int_age3_4_0_, user0_.integer_age as integer_4_4_0_, user0_.name as name5_4_0_, user0_.sex as sex6_4_0_, user0_.stature as stature7_4_0_ from user user0_ where user0_.id=? * Hibernate: update user set date=?, int_age=?, integer_age=?, name=?, sex=?, stature=? where id=? * Hibernate: select user0_.id as id1_4_, user0_.date as date2_4_, user0_.int_age as int_age3_4_, user0_.integer_age as integer_4_4_, user0_.name as name5_4_, user0_.sex as sex6_4_, user0_.stature as stature7_4_ from user user0_ where user0_.name=? * User(id=1, name=李四, sex=null, intAge=0, integerAge=null, stature=null, date=null) */ } @Test public void afterInsert(){ User user = new User(); user.setName("王五"); userRepository.save(user); User newUser = userRepository.findByName("王五"); System.out.println(newUser.toString()); /** * Hibernate: insert into user (int_age, name) values (?, ?) * Hibernate: select user0_.id as id1_4_, user0_.date as date2_4_, user0_.int_age as int_age3_4_, user0_.integer_age as integer_4_4_, user0_.name as name5_4_, user0_.sex as sex6_4_, user0_.stature as stature7_4_ from user user0_ where user0_.name=? * User(id=2, name=王五, sex=null, intAge=0, integerAge=null, stature=null, date=null) */ } @Test public void afterUpdate(){ User newUser = userRepository.findByName("王五"); newUser.setName("赵六"); newUser.setDate(new Date()); userRepository.save(newUser); User updateUser = userRepository.findByName("赵六"); System.out.println(updateUser.toString()); /** * Hibernate: select user0_.id as id1_4_, user0_.date as date2_4_, user0_.int_age as int_age3_4_, user0_.integer_age as integer_4_4_, user0_.name as name5_4_, user0_.sex as sex6_4_, user0_.stature as stature7_4_ from user user0_ where user0_.name=? * Hibernate: select user0_.id as id1_4_0_, user0_.date as date2_4_0_, user0_.int_age as int_age3_4_0_, user0_.integer_age as integer_4_4_0_, user0_.name as name5_4_0_, user0_.sex as sex6_4_0_, user0_.stature as stature7_4_0_ from user user0_ where user0_.id=? * Hibernate: update user set date=?, name=? where id=? * Hibernate: select user0_.id as id1_4_, user0_.date as date2_4_, user0_.int_age as int_age3_4_, user0_.integer_age as integer_4_4_, user0_.name as name5_4_, user0_.sex as sex6_4_, user0_.stature as stature7_4_ from user user0_ where user0_.name=? * User(id=2, name=赵六, sex=null, intAge=0, integerAge=null, stature=null, date=2019-12-13 22:03:53.0) */ } @Test public void testUpdate(){ User user = new User(); user.setId(1); user.setName("张三四"); userRepository.save(user); User one = userRepository.findOne(1); System.out.println(one.toString()); /** * Hibernate: select user0_.id as id1_4_0_, user0_.date as date2_4_0_, user0_.int_age as int_age3_4_0_, user0_.integer_age as integer_4_4_0_, user0_.name as name5_4_0_, user0_.sex as sex6_4_0_, user0_.stature as stature7_4_0_ from user user0_ where user0_.id=? * Hibernate: update user set name=? where id=? * Hibernate: select user0_.id as id1_4_0_, user0_.date as date2_4_0_, user0_.int_age as int_age3_4_0_, user0_.integer_age as integer_4_4_0_, user0_.name as name5_4_0_, user0_.sex as sex6_4_0_, user0_.stature as stature7_4_0_ from user user0_ where user0_.id=? * User(id=1, name=张三四, sex=null, intAge=0, integerAge=null, stature=null, date=null) */ } }
查看beforInsert(),beforeUpdate() 两个方法下的执行记录,增加和更改全是全字段的SQL语句,这在一定程度是影响了效率。
我们希望在新增的时候只包含设置了值得字段,更改时只包含发生变化的字段,那么就可以使用@DynamicInsert, @DynamicUpdate 两个注解了.
@DynamicInsert:
未使用:
insert into user (date, int_age, integer_age, name, sex, stature) values (?, ?, ?, ?, ?, ?)
使用之后:
insert into user (int_age, name) values (?, ?)
@DynamicUpdate:
未使用:(不管字段有没有更新全部包含)
update user set date=?, int_age=?, integer_age=?, name=?, sex=?, stature=? where id=?
使用之后: (只包含字段有更新的)
update user set name=? where id=?
还没有评论,来说两句吧...