Hibernate SQL优化小技巧
创始人
2024-04-03 18:52:09
0

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类。

  1. public class User {     
  2.     /** Creates a new instance of User */  
  3.     public User() {  
  4.     }  
  5.     private long id;  
  6.     private int age;  
  7.  
  8.     private String firstname;  
  9.     private String lastname;  
  10.     private Set emailAddresses;  
  11. //省略getter 和setter方法  

Hibernate映射文件(User.hbm.xml,省略了文件头声明)定义为:

  1.  
  2.      name="model.User" table="Users" > 
  3.          name="id" column="ID"> 
  4.              class="native"/> 
  5.          
  6.          name="age"/> 
  7.          name="firstname"/> 
  8.          name="lastname"/> 
  9.           
  10.          name="emailAddresses" table="PERSON_EMAIL_ADDR"> 
  11.              column="PERSON_ID"/> 
  12.              type="string" column="EMAIL_ADDR"/> 
  13.          
  14.      
  15.  

我们写一个测试类进行测试UserTest。

  1. public class UserTest extends TestCase {  
  2.       
  3.     public UserTest(String testName) {  
  4.         super(testName);  
  5.     }      
  6.     private Session session;  
  7.     private SessionFactory sessionFactory;  
  8.       
  9.     protected void setUp() throws Exception {  
  10.         sessionFactory=HibernateUtil.getSessionFactory();  
  11.         session=sessionFactory.openSession();  
  12.         session.getTransaction().begin();  
  13.     }     
  14.     protected void tearDown() throws Exception {  
  15.         session.getTransaction().commit();  
  16.         session.close();          
  17.     }     
  18.     /**  
  19.      * Test of getAge method, of class model.User.  
  20.      */  
  21.     public void testSaveUser() {  
  22.         System.out.println("================testSaveUser=================");  
  23.           
  24.         User user = new User();  
  25.         user.setAge(29);  
  26.         session.save(user);  
  27.         assertNotNull("id is assigned !",user.getId());  
  28.     }  
  29.     public void testUpdateUser() {  
  30.         System.out.println("================testUpdateUser=================");  
  31.           
  32.         User user = new User();  
  33.         user.setAge(29);  
  34.         session.save(user);  
  35.         assertNotNull("id is assigned !",user.getId());  
  36.           
  37.         User _user=(User) session.get(User.class, user.getId());  
  38.         _user.setFirstname("Array");  
  39.         session.update(_user);         
  40.     }      

运行测试后,此时会生成完整的Hibernate SQL语句(注意将hibernate属性show_sql设置成true)。

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

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

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

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

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

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

 

【编辑推荐】

  1. 强人Hibernate文档笔记(上)
  2. 强人Hibernate文档笔记(中)
  3. 强人Hibernate文档笔记(下)
  4. Hibernate优化方法解析
  5. Hibernate的性能优化

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...