超級笨笨

          好腦子,不如一個爛博客
          數(shù)據(jù)加載中……
          Hibernate SQL優(yōu)化小技巧使用dynamic-insert="true" dynamic-update="true"
          最近正在拜讀Hibernate之父大作<Java Persistence with Hibernate>,頗有收獲。
          在我們熟悉的Hibernate映射文件中也大有乾坤,很多值得我注意的地方。
          在Hibernate的映射文件的class tag使用dynamic-insert,dynamic-update,可以優(yōu)化生成的SQL語句,提高SQL執(zhí)行效率,最終可以提高系統(tǒng)性能。
          如,有一個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>
          我們寫一個測試類進(jìn)行測試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設(shè)置成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">

          再次運行測試類,就會發(fā)現(xiàn)生成的SQL中涉及的字段只包含User類中修改的屬性所對應(yīng)的表字段。

          ================testSaveUser=================
          Hibernate: insert into Users (age) values (?)
          ================testUpdateUser=================
          Hibernate: insert into Users (age) values (?)
          Hibernate: update Users set firstname=? where ID=?

          如果一個表的結(jié)構(gòu)很復(fù)雜,字段很多的情況下,使用dynamic-insert,dynamic-update能夠性能上的少許提升。

          posted on 2010-01-02 15:03 超級笨笨 閱讀(4226) 評論(4)  編輯  收藏 所屬分類: SSH

          評論

          # re: Hibernate SQL優(yōu)化小技巧使用dynamic-insert="true" dynamic-update="true" 2010-01-04 09:56 Robin's Java World

          不錯不錯,學(xué)習(xí)了。
            回復(fù)  更多評論    

          # re: Hibernate SQL優(yōu)化小技巧使用dynamic-insert="true" dynamic-update="true" 2010-01-13 11:07 來如風(fēng)

          正在找,謝謝了!!!
            回復(fù)  更多評論    

          # re: Hibernate SQL優(yōu)化小技巧使用dynamic-insert="true" dynamic-update="true" 2010-02-04 11:59 袁偉強

          這個還真不知道
          還有就是 <set name="emailAddresses" table="PERSON_EMAIL_ADDR">
          <key column="PERSON_ID"/>
          <element type="string" column="EMAIL_ADDR"/>
          </set>

          這個<element> 這里什么意思啊 從來沒這么用過
            回復(fù)  更多評論    

          # re: Hibernate SQL優(yōu)化小技巧使用dynamic-insert="true" dynamic-update="true" 2010-04-30 15:31 habzy

          我是想找注解的那種 方式~~
            回復(fù)  更多評論    
          主站蜘蛛池模板: 无极县| 习水县| 冀州市| 中阳县| 万全县| 三穗县| 曲沃县| 钦州市| 东兴市| 绥江县| 茌平县| 安龙县| 平安县| 玉田县| 个旧市| 黎川县| 天津市| 天峻县| 鄱阳县| 娱乐| 台东县| 合江县| 龙江县| 沾益县| 招远市| 灵台县| 德安县| 镇坪县| 肥城市| 志丹县| 富阳市| 惠来县| 华阴市| 永年县| 东港市| 休宁县| 漳浦县| 婺源县| 衢州市| 太仓市| 修水县|