当前位置: 代码迷 >> SQL >> Hibernate SQL优化技艺
  详细解决方案

Hibernate SQL优化技艺

热度:98   发布时间:2016-05-05 13:21:41.0
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能够性能上的少许提升。

?

?


?

  相关解决方案