Hibernate SQL优化技巧

在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值