zoukankan      html  css  js  c++  java
  • Hibernate的性能优化之 dynamicupdate dynamicinsert

    Guestbook.java

    代码:

    package com.b510.examples;

    import java.util.Date;

    public class Guestbook implements java.io.Serializable {

     private static final long serialVersionUID = -7004492417383895995L;
     private Integer id;
     private String name;
     private String email;
     private String phone;
     private String title;
     private String content;
     private Date createdTime;
     private Integer version;

     // Constructors

     /**
      * @return the version
      */
     public Integer getVersion() {
      return version;
     }

     /**
      * @param version
      *            the version to set
      */
     public void setVersion(Integer version) {
      this.version = version;
     }

     /**
      * @return the name
      */
     public String getName() {
      return name;
     }

     public Integer getId() {
      return this.id;
     }

     public void setId(Integer id) {
      this.id = id;
     }

     /**
      * @param name
      *            the name to set
      */
     public void setName(String name) {
      this.name = name;
     }

     /**
      * @return the email
      */
     public String getEmail() {
      return email;
     }

     /**
      * @param email
      *            the email to set
      */
     public void setEmail(String email) {
      this.email = email;
     }

     /**
      * @return the phone
      */
     public String getPhone() {
      return phone;
     }

     /**
      * @param phone
      *            the phone to set
      */
     public void setPhone(String phone) {
      this.phone = phone;
     }

     /**
      * @return the title
      */
     public String getTitle() {
      return title;
     }

     /**
      * @param title
      *            the title to set
      */
     public void setTitle(String title) {
      this.title = title;
     }

     /**
      * @return the content
      */
     public String getContent() {
      return content;
     }

     /**
      * @param content
      *            the content to set
      */
     public void setContent(String content) {
      this.content = content;
     }

     /**
      * @return the createdTime
      */
     public Date getCreatedTime() {
      return createdTime;
     }

     /**
      * @param createdTime
      *            the createdTime to set
      */
     public void setCreatedTime(Date createdTime) {
      this.createdTime = createdTime;
     }

     /** default constructor */
     public Guestbook() {
     }
    }

    Guestbook.hbm.xml

    代码:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
     <class name="com.b510.examples.Guestbook" table="guestbook"
      catalog="users" optimistic-lock="version">
      <id name="id" type="java.lang.Integer">
       <column name="id" />
       <generator class="increment" />
      </id>
      <version name="version" column="version" access="field"></version>
      <property name="name" type="java.lang.String">
       <column name="name" length="200" />
      </property>
      <property name="email" type="java.lang.String">
       <column name="email" length="50" />
      </property>
      <property name="phone" type="java.lang.String">
       <column name="phone" length="20" />
      </property>
      <property name="title" type="java.lang.String">
       <column name="title" length="200" />
      </property>
      <property name="content" type="java.lang.String">
       <column name="content" length="1000" />
      </property>
      <property name="createdTime" type="java.util.Date">
       <column name="created_time" length="10" />
      </property>
     </class>
    </hibernate-mapping>

    测试代码:

    HibernateTest.java

    代码:

    /**
     *
     */
    package com.b510.examples;

    import org.hibernate.Session;

    /**
     *
     * @author XHW
     *
     * @date 2011-7-18
     *
     */
    public class HibernateTest {
     public static void main(String[] args) {
      new HibernateTest().update();
     }
     public void update(){
      Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
      session.beginTransaction();
      Guestbook gb=(Guestbook)session.get(Guestbook.class, 2);
      System.out.println(gb.getName());
      gb.setName("北京");
      System.out.println("----------------------------");
      gb=(Guestbook)session.get(Guestbook.class, 2);
      System.out.println(gb.getName());
      session.getTransaction().commit();  
     }
    }

    运行效果:

    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate:
        select
            guestbook0_.id as id0_0_,
            guestbook0_.version as version0_0_,
            guestbook0_.name as name0_0_,
            guestbook0_.email as email0_0_,
            guestbook0_.phone as phone0_0_,
            guestbook0_.title as title0_0_,
            guestbook0_.content as content0_0_,
            guestbook0_.created_time as created8_0_0_
        from
            users.guestbook guestbook0_
        where
            guestbook0_.id=?
    广州
    ----------------------------
    北京
    Hibernate:
        update
            users.guestbook
        set
            version=?,
            name=?,
            email=?,
            phone=?,
            title=?,
            content=?,
            created_time=?
        where
            id=?
            and version=?
    我们看到的是我们只是跟新的是Guestbook对象的name属性值,但是呢,一个update语句却是

    把所有的属性都给跟新了一遍,这样不就是很浪费时间吗?

    怎样做才可以让Hibernate只是跟新我们所关注的东西,而不是我们所关注的东西,就不要去跟新他?

    有一个办法可行滴!

    Guestbook.hbm.xml

    代码:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
     <class name="com.b510.examples.Guestbook" table="guestbook"
      catalog="users" optimistic-lock="version" dynamic-update="true">                  <!--          在这里加入动态跟新-->
      <id name="id" type="java.lang.Integer">
       <column name="id" />
       <generator class="increment" />
      </id>
      <version name="version" column="version" access="field"></version>
      <property name="name" type="java.lang.String">
       <column name="name" length="200" />
      </property>
      <property name="email" type="java.lang.String">
       <column name="email" length="50" />
      </property>
      <property name="phone" type="java.lang.String">
       <column name="phone" length="20" />
      </property>
      <property name="title" type="java.lang.String">
       <column name="title" length="200" />
      </property>
      <property name="content" type="java.lang.String">
       <column name="content" length="1000" />
      </property>
      <property name="createdTime" type="java.util.Date">
       <column name="created_time" length="10" />
      </property>
     </class>
    </hibernate-mapping>

    同样的测试代码:

    运行效果:

    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate:
        select
            guestbook0_.id as id0_0_,
            guestbook0_.version as version0_0_,
            guestbook0_.name as name0_0_,
            guestbook0_.email as email0_0_,
            guestbook0_.phone as phone0_0_,
            guestbook0_.title as title0_0_,
            guestbook0_.content as content0_0_,
            guestbook0_.created_time as created8_0_0_
        from
            users.guestbook guestbook0_
        where
            guestbook0_.id=?
    广州
    ----------------------------
    北京
    Hibernate:
        update
            users.guestbook
        set
            version=?,
            name=?
        where
            id=?
            and version=?
    我们看到这里显示的是跟新name和version属性

    测试二:

    HibernateTest.java

    代码:

    /**
     *
     */
    package com.b510.examples;

    import org.hibernate.Session;

    /**
     *
     * @author XHW
     *
     * @date 2011-7-18
     *
     */
    public class HibernateTest {
     public static void main(String[] args) {
      new HibernateTest().update();
     }
     public void update(){
      Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
      session.beginTransaction();
      Guestbook gb=new Guestbook();
      gb.setName("南京");
      gb.setPhone("119");
      gb.setTitle("hello world!");
      session.save(gb);
      session.getTransaction().commit();  
     }
     
     
    }

    运行代码:

    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate:
        select
            max(id)
        from
            guestbook
    Hibernate:
        insert
        into
            users.guestbook
            (version, name, email, phone, title, content, created_time, id)
        values
            (?, ?, ?, ?, ?, ?, ?, ?)
    我们会发现一个问题,那就是,我们只是插入了name,phone,title属性值,但是,insert语句却同时把

    其他的东西也给添加了进去,我们是不希望看到这样的结果的,要解决这样的问题,我们同样有办法滴!

    Guestbook.hbm.xml

    代码:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
     <class name="com.b510.examples.Guestbook" table="guestbook"
      catalog="users" optimistic-lock="version" dynamic-update="true"  dynamic-insert="true">                       动态插入数据
      <id name="id" type="java.lang.Integer">
       <column name="id" />
       <generator class="increment" />
      </id>
      <version name="version" column="version" access="field"></version>
      <property name="name" type="java.lang.String">
       <column name="name" length="200" />
      </property>
      <property name="email" type="java.lang.String">
       <column name="email" length="50" />
      </property>
      <property name="phone" type="java.lang.String">
       <column name="phone" length="20" />
      </property>
      <property name="title" type="java.lang.String">
       <column name="title" length="200" />
      </property>
      <property name="content" type="java.lang.String">
       <column name="content" length="1000" />
      </property>
      <property name="createdTime" type="java.util.Date">
       <column name="created_time" length="10" />
      </property>
     </class>
    </hibernate-mapping>

    运行效果:

    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
    log4j:WARN Please initialize the log4j system properly.
    Hibernate:
        select
            max(id)
        from
            guestbook
    Hibernate:
        insert
        into
            users.guestbook
            (version, name, phone, title, id)
        values
            (?, ?, ?, ?, ?)
    这样就达到了我们的预期要求,                                    要说明的是:version属性是不可为空的,所以我们没有设置值的时候,Hibernate也会给我们添加记录的

  • 相关阅读:
    解读基本数据类型和内置方法(1)(要掌握)
    简单循环流程的介绍
    基本数据类型的使用和运算符的介绍
    开辟编程语言的介绍和变量
    HTML5 元素超出部分滚动, 并隐藏滚动条
    数据库多行数据合并一行(sqlserver、Oracle、Mysql)
    Js apply方法与call方法详解 附ES6新写法
    Java实现牛顿迭代法求解平方根、立方根
    为什么在JavaScript中0.1+0.2不等于0.3?
    html5手机web页面底部菜单
  • 原文地址:https://www.cnblogs.com/hongten/p/2110053.html
Copyright © 2011-2022 走看看