`

Hibernate SQL优化小技巧使用dynamic-insert="true" dynamic-update="true"

阅读更多

在Hibernate的映射文件的class tag使用dynamic-insert,dynamic-update,可以优化生成的SQL语句,提高SQL执行效率,最终可以提高系统性能。
如,有一个User类。

public class User {
  
    /** Creates a new instance of User */
    public User() {
    }
    private long id;
    private int age;

    private String firstname;
    private String lastname;
    private Set emailAddresses;
//省略getter 和setter方法
}

Hibernate映射文件(User.hbm.xml,省略了文件头声明)定义为:
<hibernate-mapping>
    <class name="model.User" table="Users" >
        <id name="id" column="ID">
            <generator class="native"/>
        </id>
        <property name="age"/>
        <property name="firstname"/>
        <property name="lastname"/>
       
        <set name="emailAddresses" table="PERSON_EMAIL_ADDR">
            <key column="PERSON_ID"/>
            <element type="string" column="EMAIL_ADDR"/>
        </set>
    </class>
</hibernate-mapping>
我们写一个测试类进行测试UserTest。


public class UserTest extends TestCase {
   
    public UserTest(String testName) {
        super(testName);
    }
   
    private Session session;
    private SessionFactory sessionFactory;
   
    protected void setUp() throws Exception {
        sessionFactory=HibernateUtil.getSessionFactory();
        session=sessionFactory.openSession();
        session.getTransaction().begin();
    }
   
    protected void tearDown() throws Exception {
        session.getTransaction().commit();
        session.close();
       
    }
   
    /**
     * Test of getAge method, of class model.User.
     */
    public void testSaveUser() {
        System.out.println("================testSaveUser=================");
       
        User user = new User();
        user.setAge(29);
        session.save(user);
        assertNotNull("id is assigned !",user.getId());
    }
    public void testUpdateUser() {
        System.out.println("================testUpdateUser=================");
       
        User user = new User();
        user.setAge(29);
        session.save(user);
        assertNotNull("id is assigned !",user.getId());
       
        User _user=(User) session.get(User.class, user.getId());
        _user.setFirstname("Array");
        session.update(_user);
       
    }
   
   
}
运行测试后,此时会生成完整的SQL语句(注意将hibernate属性show_sql设置成true)。

================testSaveUser=================
Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)
================testUpdateUser=================
Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)
Hibernate: update Users set age=?, firstname=?, lastname=? where ID=?

如果我们在<class ...>中加上 dynamic-insert="true" dynamic-update="true",变成如下。

<class name="model.User" table="Users" dynamic-insert="true" dynamic-update="true">

再次运行测试类,就会发现生成的SQL中涉及的字段只包含User类中修改的属性所对应的表字段。

================testSaveUser=================
Hibernate: insert into Users (age) values (?)
================testUpdateUser=================
Hibernate: insert into Users (age) values (?)
Hibernate: update Users set firstname=? where ID=?

如果一个表的结构很复杂,字段很多的情况下,使用dynamic-insert,dynamic-update能够性能上的少许提升。
0
0
分享到:
评论

相关推荐

    dynamic-insert,dynamic-update 我有话要说

    在Java的Hibernate ORM框架中,`dynamic-insert`和`dynamic-update`是两个非常重要的属性,它们主要用于优化数据库的插入和更新操作。这两个属性主要应用于实体类的映射文件(.hbm.xml)中,用于控制Hibernate如何...

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip

    "hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip" 是一个针对Eclipse的Hibernate工具集更新包,包含了对4.1.1.Final版本的增强和优化,为开发者提供了更加便捷的Hibernate操作界面和功能。...

    SAP HANA JDCB

    Sap HaNa 数据库链接 jar包。可自定义Maven坐标 添加到私有库 想不要积分,CSDN 最低要求1积分 #mvn install:install-file -Dfile=C:\work\hanajdbclib\ngdbc...#hibernate.dialect=org.hibernate.dialect.SAPDBDialect

    hibernate实体映射文件字段设置默认值

    &lt;property name="date" type="java.util.Date" insert="true" update="true"&gt; &lt;column name="PUB_DATE" default="sysdate()" /&gt; ``` 在这个例子中,`&lt;property&gt;`标签指定了Java类中的属性名称`date`,并将其映射...

    hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605

    Hibernate Tools是开发者在使用Hibernate框架进行Java应用程序开发时的重要辅助工具,它为Eclipse IDE提供了强大的集成支持,包括对象关系映射(ORM)的可视化设计、逆向工程、数据库生成、HQL和SQL查询编辑等功能。...

    hibernate-jpa-2.0-api-1.0.0-CR-1.jar

    java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil 或javax/persistence/entitylistener问题

    hibernate动态更新

    如果在`&lt;class&gt;`映射中设置了`dynamic-update="true"`,Hibernate会在生成的SQL更新语句中只包含实际被修改的字段,而不是所有字段。这可以显著减少不必要的数据传输和数据库操作,从而提升性能。然而,`dynamic-...

    HibernateTools-3.2.4.Beta1-R200810311334.zip

    3. **HQL和SQL查询编辑器**:提供了友好的图形界面,方便开发者编写、测试和调试HQL(Hibernate查询语言)和SQL查询。 4. **数据库浏览器**:允许用户直接在IDE中浏览数据库结构,执行查询,查看结果,进行数据导入...

    hibernate many-to-many级联保存,级联更新,级联删除

    在Java的持久化框架Hibernate中,Many-to-Many关系是一种常见的数据库表之间的关联方式,它表示一个实体可以与多个其他实体进行关联,反之亦然。本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、...

    DmDialect-for-hibernate4.0.zip

    达梦方言则是专门为Hibernate定制,使得Hibernate可以理解和优化针对达梦数据库的SQL语句,从而提高性能和兼容性。 在SpringBoot集成Hibernate时,通过配置`spring.jpa.hibernate.dialect`属性,指定使用DmDialect...

    Hibernate笔记.doc

    4. `&lt;property&gt;`元素的`dynamic-insert`和`dynamic-update`属性:这两个属性用于优化SQL语句的生成。`dynamic-insert="true"`表示在保存对象时,只有非空字段才会被包含在`insert`语句中,而`dynamic-update="true"`...

    hibernate-mapping参数详解

    - **dynamic-insert**: 是否动态插入 SQL 语句,仅插入非空字段。 - **select-before-update**: 更新前是否先查询实体。 - **polymorphism**: 多态映射类型。 - **where**: 在查询时添加额外的 WHERE 子句。 - **...

    hibernate一对多例子

    &lt;/hibernate-mapping&gt; ``` #### Book映射文件(Book.hbm.xml) ```xml &lt;?xml version="1.0"?&gt; &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" ...

    hibernatetools-Update-4.1.1.zip

    此外,Hibernate Tools的可视化HQL和SQL编辑器也是其亮点。开发者可以通过直观的界面编写查询语句,实时查看结果,甚至进行调试。在新版本中,编辑器的性能得到提升,支持更多的语法高亮和智能提示,使开发者在编写...

    hibernate-distribution-3.3.2.GA-dist.zip

    本篇将深入探讨 Hibernate 3.3.2 GA 版本的特性、优势以及如何使用。 一、Hibernate 框架概述 Hibernate 是一个开源的 ORM 解决方案,它允许开发者使用面向对象的编程方式来操作关系型数据库,避免了传统的 JDBC ...

    hibernate-validator-5.0.1.final-sources.jar源码

    本文将通过对`hibernate-validator-5.0.1.final-sources.jar`源码的深度分析,揭示其内在的工作原理和设计思想。 1. **Bean Validation规范** Bean Validation是Java EE和Java SE中用于验证对象的规范,它定义了...

    当设置lazy=true时,怎样使用extjs和Hibernate

    标题"当设置lazy=true时,怎样使用ExtJS和Hibernate"所涉及的知识点主要集中在如何在ExtJS前端应用中与使用了懒加载特性的Hibernate后端进行交互。以下是对这个主题的详细解释: 1. **Hibernate懒加载**: - 懒...

    inverse=true的总结

    在IT行业中,尤其是在Java开发或者使用ORM框架(如Hibernate)时,“inverse=true”是一个非常重要的概念,它涉及到对象关系映射中的数据管理策略。本文将深入解析“inverse=true”的含义,以及它在实际应用中的作用...

Global site tag (gtag.js) - Google Analytics