Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1384|回复: 0

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

  [复制链接]

该用户从未签到

发表于 2011-10-13 14:11:20 | 显示全部楼层 |阅读模式
在我们熟悉的Hibernate映射文件中也大有乾坤,很多值得我注意的地方。
在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=&quotERSON_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能够性能上的少许提升。
回复

使用道具 举报

该用户从未签到

发表于 2011-10-29 13:54:33 | 显示全部楼层
谢谢楼主分享啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-12 07:27 , Processed in 0.380501 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表