Hibernate SQL优化小技巧

开发 后端
最近正在拜读Hibernate之父大作《Java Persistence with Hibernate》,颇有收获。在我们熟悉的Hibernate映射文件中也大有乾坤,很多值得我注意的地方,本文是一些体会。

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

最近正在拜读Hibernate之父大作《Java Persistence with Hibernate》,颇有收获。在我们熟悉的Hibernate映射文件中也大有乾坤,很多值得我注意的地方。
在Hibernate的映射文件的class tag使用dynamic-insert,dynamic-update,可以优化生成的Hibernate SQL语句,提高Hibernate 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方法  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

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> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

我们写一个测试类进行测试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);         
    }      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.

运行测试后,此时会生成完整的Hibernate 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=? 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

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

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

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

================testSaveUser=================  
Hibernate: insert into Users (age) values (?)  
================testUpdateUser=================  
Hibernate: insert into Users (age) values (?)  
Hibernate: update Users set firstname=? where ID=? 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

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

 

【编辑推荐】

  1. 强人Hibernate文档笔记(上)
  2. 强人Hibernate文档笔记(中)
  3. 强人Hibernate文档笔记(下)
  4. Hibernate优化方法解析
  5. Hibernate的性能优化
责任编辑:仲衡 来源: 百度博客
相关推荐

2009-06-16 16:39:49

Hibernate性能

2021-11-10 18:52:42

SQL技巧优化

2024-10-28 08:34:06

2023-09-25 13:15:50

SQL数据库

2022-07-04 08:51:43

条件语句JavaScript

2015-09-15 08:30:23

Android代码优化

2011-05-10 17:06:05

SEO

2021-03-25 15:19:33

深度学习Pytorch技巧

2015-09-16 14:47:14

Android性能优化代码

2010-09-27 15:10:12

SQL Server

2021-02-03 10:46:31

SQL数据库技巧

2022-11-24 10:34:05

CSS前端

2009-06-16 16:10:59

Hibernate性能

2021-05-07 16:02:54

Python代码优化

2021-06-16 10:50:16

Python代码优化

2024-06-21 08:21:44

2022-03-10 08:01:06

CSS技巧选择器

2020-12-24 09:18:51

SQL数据库函数

2020-01-16 18:30:07

技术SQL优化

2021-07-02 09:45:13

Python优化代码
点赞
收藏

51CTO技术栈公众号