分享

hibernate 中 select-before-update属性的深入分析 (转贴)

 肥肥减肥 2010-11-22

前言

    本文章的是基于struts 1.2,spring 1.2.8,hipernate 3.1,Mysql 5.0, Tomcat 5.5.9 构建的J2EE Web Project.为了更加深入的分析select-before-update="true|false"属性的功能,我们以一个具体的实例来慢慢引导初学者,使其一步一步的加深对该属性的深入掌握.

1.新建J2EE项目,然后导入相关包,配置成完善的SSH架构模式.

2.数据库设计,如图:

3.生成PO和hbm.xml文件

package com.PMS.Entity;
public class Admin {
private Integer id;
     private String adminName;
     private String adminRealName;
     private String adminPwd;
     private String adminSex;
     private String adminBirthDay;
     private String adminIntr;

public Admin() {
    }

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

    public String getAdminName() {
        return this.adminName;
    }
   
    public void setAdminName(String adminName) {
        this.adminName = adminName;
    }

    public String getAdminRealName() {
        return this.adminRealName;
    }
   
    public void setAdminRealName(String adminRealName) {
        this.adminRealName = adminRealName;
    }

    public String getAdminPwd() {
        return this.adminPwd;
    }
   
    public void setAdminPwd(String adminPwd) {
        this.adminPwd = adminPwd;
    }

    public String getAdminSex() {
        return this.adminSex;
    }
   
    public void setAdminSex(String adminSex) {
        this.adminSex = adminSex;
    }

    public String getAdminBirthDay() {
        return this.adminBirthDay;
    }
   
    public void setAdminBirthDay(String adminBirthDay) {
        this.adminBirthDay = adminBirthDay;
    }

   public String getAdminIntr() {
        return this.adminIntr;
    }
    public void setAdminIntr(String adminIntr) {
        this.adminIntr = adminIntr;
    }
}

admin.hbm.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate./hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.PMS.Entity.Admin" table="admin" select-before-update="true" >
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="adminName" type="java.lang.String">
            <column name="Admin_Name" length="20"/>
        </property>
        <property name="adminRealName" type="java.lang.String">
            <column name="Admin_RealName" length="20"/>
        </property>
        <property name="adminPwd" type="java.lang.String">
            <column name="Admin_Pwd" length="40" />
        </property>
        <property name="adminSex" type="java.lang.String" >
            <column name="Admin_Sex" length="10" />
        </property>
        <property name="adminBirthDay" type="java.lang.String">
            <column name="Admin_BirthDay" length="20" />
        </property>
        <property name="adminIntr" type="java.lang.String">
            <column name="Admin_Intr" length="65535"/>
        </property>
    </class>
</hibernate-mapping>
4.编写DAO和DaoImp

AdminDao.java

package com.PMS.Dao;
import java.util.List;
import com.PMS.Entity.Admin;
/**
*
* @author 圣殿祭司
* 超级管理员
*
*/
public interface AdminDao {
   public List GetAdminInfo();///获取管理员信息
   public boolean UpdateAdminInfo(Admin admin);///更新数据
}

对应的实现类:

package com.PMS.DaoImp;
import java.util.List;
import com.PMS.Dao.AdminDao;
import com.PMS.Entity.Admin;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.dao.DataAccessException;
/***
*
* @author 圣殿祭司
* @version 1.0
* @time 2007-7-16
* 实现超级管理员类
*
*/
public class AdminDaoI extends HibernateDaoSupport implements AdminDao {
public boolean UpdateAdminInfo(Admin admin) {
   try{
    this.getHibernateTemplate().update(admin);
    return true;
   }catch(DataAccessException e){
    throw e;
   }
  
}
public List GetAdminInfo() {
   try{
    return this.getHibernateTemplate().find("from com.PMS.Entity.Admin as admin where admin.id=1");
   }catch(DataAccessException e){
    throw e;
   }
  
}
}

5编写Service和ServiceImp

package com.PMS.Services;
import java.util.List;
import com.PMS.Entity.Admin;
public interface AdminServices {
    public List    GetAdminInfo();
    public boolean UpdateAdminInfo(Admin admin);
}
对应的实现类:

package com.PMS.ServicesImp;
import java.util.List;
import com.PMS.Dao.AdminDao;
import com.PMS.Entity.Admin;
import com.PMS.Services.AdminServices;

/**
* @author 圣殿祭司
* @time 2007-7-16
*/
public class AdminServicesI implements AdminServices {
private AdminDao adminDao;
private Admin admin;
public Admin getAdmin() {
   return admin;
}
public void setAdmin(Admin admin) {
   this.admin = admin;
}
public AdminDao getAdminDao() {
   return adminDao;
}
public void setAdminDao(AdminDao adminDao) {
   this.adminDao = adminDao;
}
public List GetAdminInfo(){
   return this.adminDao.GetAdminInfo();
}
public boolean UpdateAdminInfo(Admin admin) {
   return this.adminDao.UpdateAdminInfo(admin);
}

}

6 编写action(这里值得说明的是该类是实现的是DispatchAction,目的是便于管理action,使操作同意对象的action都写成不同的方法在同一个action中,同过url的参数来分别不同的方法)

package com.PMS.struts.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.actions.DispatchAction;
import javax.servlet.http.HttpSession;
import com.PMS.Entity.Admin;
import java.util.Iterator;
import com.PMS.Select.SelectProcessing;
import com.PMS.Services.AdminServices;
public class ManageAdminInfoAction extends DispatchAction {
private AdminServices adminServices;
private SelectProcessing selectProcess;
public SelectProcessing getSelectProcess() {
   return selectProcess;
}
public void setSelectProcess(SelectProcessing selectProcess) {
   this.selectProcess = selectProcess;
}
public AdminServices getAdminServices(){
   return adminServices;
}
public void setAdminServices(AdminServices adminServices){
   this.adminServices=adminServices;
}
/**
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* 获取管理员信息并显示到网页上
*/
public ActionForward getAdminInfo(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response){
   try{
    HttpSession session=request.getSession();
       List list=this.adminServices.GetAdminInfo();
       Iterator it=list.iterator();
       Admin admin=null;
       while(it.hasNext()){
           admin=(Admin)it.next();
           DynaActionForm df=(DynaActionForm)form;
           session.setAttribute("AdminforPwd", admin.getAdminPwd());
      df.set("AdminName", admin.getAdminName());
      df.set("AdminRealName", admin.getAdminRealName());
      df.set("AdminIntr", admin.getAdminIntr());
      df.set("AdminSex", admin.getAdminSex());
      String bd=admin.getAdminBirthDay();
      String y=bd.substring(0,bd.indexOf("-"));
      String m=bd.substring(bd.indexOf("-")+1,bd.lastIndexOf("-"));
      String d=bd.substring(bd.lastIndexOf("-")+1,bd.length());
      this.selectProcess.SelectProcess(request,y,m);
      df.set("AdminYear",y);
      df.set("AdminMonth",m);
      df.set("AdminDay",d);
      df.set("adminID",String.valueOf(admin.getId()));
       }
      return mapping.findForward("success");
   }catch(Exception e){
    e.printStackTrace();
      return mapping.findForward("false");
   }
}
/**
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* @author 圣殿祭司.Java
* 修改管理员信息
*/
public ActionForward editAdminInfo(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) {  
   DynaActionForm df=(DynaActionForm)form;
   HttpSession session=request.getSession();
   Admin admin =new Admin();
     try{
        admin.setId(Integer.valueOf(df.getString("adminID")));
     admin.setAdminName(df.getString("AdminName"));
     admin.setAdminRealName(df.getString("AdminRealName"));
     admin.setAdminSex(df.getString("AdminSex"));
     admin.setAdminPwd(session.getAttribute("AdminforPwd").toString());
     admin.setAdminBirthDay(df.getString("AdminYear")+"-"+df.getString("AdminMonth")+"-"+df.getString("AdminDay"));
     admin.setAdminIntr(df.getString("AdminIntr"));
     this.adminServices.UpdateAdminInfo(admin);
   return mapping.findForward("editsuccess");
   }catch(Exception e){
    e.printStackTrace();
    return mapping.findForward("false");
   }
}
}

7 编写applicationcontent.xml文件和struts文件(略)

8 编写前台jsp文件(略)

9发布运行

(1)当没有select-before-update属性的时候,在前台界面上操作只修改用户名时,执行结果在控制台输出sql语句为:Hibernate: update admin set Admin_Name=?, Admin_RealName=?, Admin_Pwd=?, Admin_Sex=?, Admin_BirthDay=?, Admin_Intr=? where ID=?.

(2)当有select-before-update="true"时,在前台界面只操作修改用户名时,执行结果在控制台输出的SQL语句为:

Hibernate: select admin_.ID, admin_.Admin_Name as Admin2_1_, admin_.Admin_RealName as Admin3_1_, admin_.Admin_Pwd as Admin4_1_, admin_.Admin_Sex as Admin5_1_, admin_.Admin_BirthDay as Admin6_1_, admin_.Admin_Intr as Admin7_1_ from admin admin_ where admin_.ID=?

Hibernate: update admin set Admin_Name=? where ID=?

(3)当有select-before-update="true"时,在前台界面上不操作修改任何属性而直接点击确定时将在控制台不会输出任何信息.

所以根据以上实际例子得出结论:select-before-update="true|false"属性默认是false,如果为true时,在执行修改操作时,在session清理缓存时它将先执行一条select语句,然后比较所操作的对象的属性值是否与数据库中所对应的值相同,如果不同就会执行已经被修改的属性的Update操作,当然这里它还要执行的操作是到admin.nbm.xml 文件中去检索被修改过的属性所对应的配置的update属性是否等于true,这样遍历完后就到执行update操作.如果没有修改对象的任何一个属性的值,将不会触发update操作或saveorupdate操作;所以select-before-update的好处是提高了应用程序的性能,避免了session执行不必要的update操作.当然这个属性只运用于对象不是经常被修改的时候,如果经常修改的对象使用此属性讲会带来性能的减弱.

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多