超級(jí)笨笨

          好腦子,不如一個(gè)爛博客
          數(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,可以?xún)?yōu)化生成的SQL語(yǔ)句,提高SQL執(zhí)行效率,最終可以提高系統(tǒng)性能。
          如,有一個(gè)User類(lèi)。

          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>
          我們寫(xiě)一個(gè)測(cè)試類(lèi)進(jìn)行測(cè)試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);
                 
              }
             
             
          }
          運(yùn)行測(cè)試后,此時(shí)會(huì)生成完整的SQL語(yǔ)句(注意將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=?

          如果我們?cè)?lt;class ...>中加上 dynamic-insert="true" dynamic-update="true",變成如下。

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

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

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

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

          posted on 2010-01-02 15:03 超級(jí)笨笨 閱讀(4225) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): SSH

          評(píng)論

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

          不錯(cuò)不錯(cuò),學(xué)習(xí)了。

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

          正在找,謝謝了!!!

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

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

          這個(gè)<element> 這里什么意思啊 從來(lái)沒(méi)這么用過(guò)

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

          我是想找注解的那種 方式~~
          主站蜘蛛池模板: 绥江县| 太保市| 怀远县| 驻马店市| 英吉沙县| 昌黎县| 怀来县| 大洼县| 宜宾县| 北辰区| 万全县| 阳曲县| 江陵县| 英德市| 乌苏市| 文安县| 镶黄旗| 昌图县| 龙胜| 出国| 宝坻区| 绥江县| 益阳市| 通州市| 霸州市| 蒲城县| 那曲县| 木兰县| 偏关县| 郓城县| 汽车| 开江县| 浦江县| 噶尔县| 瑞金市| 南阳市| 黔江区| 横山县| 城固县| 贡觉县| 巴塘县|