利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

来源:互联网 发布:sql 查询年龄最大的人 编辑:程序博客网 时间:2024/06/06 20:31

最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate

如果是在配置文件的话那就是dynamic -insert 和 dynamic-update

这两个注解在一定程度上可以增加与数据库操作相关的速度,可以节省SQL语句的执行时间,提高程序的运行效率。

使用这两个注解只需要在实体类上加入即可,或者在*.hbm.xml配置。这两个注解是boolean值,true或者false。

 

1.首先使用false来看一下执行的结果,我们就拿更新来举例:

  a.数据库的数据是这样的:

  

  b、实体类的代码

  

    C、测试类代码:

      

      执行测试方法后大家可以看到:

     

    我只更新了Description这个属性,但是却把整个对象的属性都更新了,这在一定程度是影响了效率。而且可能并不是我们希望的结果,我们希望的结果是我更改了哪些
   字段就只要更新我修改的字段就可以了,接下来我们把@DynamicUpdate(false)改为@DynamicUpdate(true) 测试一下 ,结果如下

   

   神奇了,这就是见证奇迹的时刻,达到了我们的目的,只更新我们修改过的字段。@DynamicInsert我就不举例了。

   测试之后可以知道:

   在hibernate中可以利用@DynamicInsert和@DynamicUpdate生成动态SQL语句,即在插入和修改数据的时候,语句中只包括要插入或者修改的字段。

   当然还有其他的方式达到这种效果,比如使用session为我们提供的merge方法,也是可以的。

-------------------------------------------------------------------------------------------

@DynamicUpdate(true) @DynamicInsert(true)使用的环境

1、要在同一个session里面才有效;

2、子类不能继承到@DynamicUpdate(true)注解
@DynamicUpdate(true) <wbr>@DynamicInsert(true)使用的环境,

3.@DynamicInsert(true) :只是插入那些不为空的字段,@DynamicUpdate(true):只更新同一个session里面,同一个对象有改变的字段。

4.sessionFactory.getCurrentSession()和sessionFactory.openSession()的区别:

3.1 getCurrentSession ()  使用当前的 session

注意:1,使用 SessionFactory.getCurrentSession() 需要在hibernate.cfg.xml 中如下配置:

   如果采用 jdbc 独立引用程序配置如下:
    thread
   如果采用了 JTA事务配置如下  
    jta

2,使用的是 getCurrentSession 来创建session 的话,在 commit 后,session 就自动被关闭了,也就是不用再session.close() 了。

3.2 openSession()  重新建立新的session 

注意:1,使用的是 openSession 来创建 session的话,在 commit 后,session 必须显示的关闭,也就是调用 session.close() 方法。

在应用程序中,如果 DAO 层使用 Spring 的 hibernate 模板,通过 Spring 来控制 session的生命周期,则应该 getCurrentSession ()。 

----------------------------------------------------------------------------------------------------------------------------------------------

http://blog.csdn.net/u010161082/article/details/46469753

最近新搭了个项目,是用maven构建springmvc+hibernate+junit+easyui。是用注解的方式。

前几天在一个博客(http://www.cnblogs.com/quanyongan/p/3152290.html)上看到@DynamicInsert(true) @DynamicUpdate(true)的用法,达到了只更新我们修改过的字段,故引入这两个注解。但直到今天才开始进行测试,单元测试代码如下:



测试之后发现,无论是插入的值,还是更新的值都没有同步到数据表中,经过百度一下,才知道问题所在:单元测试是用AbstractTransactionalJUnit4SpringContextTests进行的,而AbstractTransactionalJUnit4SpringContextTests执行默认是会回滚,可能是为了避免出现脏数据吧!故加@Rollback(false)即可!!!



0 0
原创粉丝点击