从今天开始记录我成长的每一步…… Hibernate的update问题

我还是初学者,问题都比较低级,大家不要笑啊,成长中……

今天的问题,是关于update的问题,所涉及的实际功能操作就是修改密码

起初用的方法是用比较原始的hibernate操作

 


String HQL 
=  
               " update UserAccount set password =' "   +  new_password  +   " ' where password = ' "   +  
                   password + " ' " ;
Session session 
=  getSession();
Query query 
=  session.createQuery(HQL);
query.executeUpdate();
session.close();


                        

后来发现好像有些落后……而且貌似有点儿偏离面向对象的思想……而且脱离了Spring的封装,只得继续研究Spring管理下的hibernate的update

由于初学,用的很少,一直没搞清楚getHibernateTemplate().update(Object) 方法更新的是对象,可是他靠什么知道我要更新的是那个数据段?后来通过观察其SQL查询语句

update USERACCOUNT set USERNAME=?, PASSWORD=?, USERTYPE=? where ID=?

发现,原来是靠ID识别,可是这就又出现一个问题,也就是说我得给他一个ID,那么我又如何获取相应数据段对应的ID??? 这是突然发现一个很简单的办法,根据Session所提供的关键信息,先对数据库表进行查询,而且getHibernateTemplate().find()返回的是对象链表List,将返回的对象用bean直接封装,不仅可以获得ID,而且调用相应的setter,改变相关信息后,直接getHibernateTemplate().update(Object)即可将改变后的对象重新传给hierbnate进行更新

 

public   boolean  setPassword(
                                      String username, String password, String userType, String newPassword) {
        HQL 
= 
            
"from UserAccount as user " +
                
"where user.username='" + username + "' and user.password = '" + password +
                    
"' and user.userType = '" + userType + "'";
        
        List list 
= this.getHibernateTemplate().find(HQL);
        
    
if(!list.isEmpty()){
            UserAccount user 
= (UserAccount)list.get(0);
            user.setPassword(newPassword);
            
this.getHibernateTemplate().update(user);
            

            ReturnInfo.setInfoType(
"Success");
            ReturnInfo.setForward(
"#");

            

            
return false;
        }

        
    }
return true;
     }
else{
            ReturnInfo.setInfoType(
"LoginError");
            ReturnInfo.setForward(
"/web/setPassword.jsp");

但是貌似有个缺点,从转换后的SQL来看,它需要对每个字段都set一次,可能会对执行效率产生影响,目前作为遗留问题,还需进一步研究

还解决了一个问题,就是代码中ReturnInfo的一个问题,此类是一个专门用来返回操作后的提示信息的类,设计次模块的目的在于:一、为了提高与用户交互,和照顾用户使用习惯,所以提示信息都应采用javascript进行显示,而且javascript开发、执行效率都比较高,消耗资源也相对比较少;二、为了减少资源的消耗,并且提高可重用性,考虑到提示信息类型比较统一,实用范围比较广,可重用程度比较高,因此设计了一个统一对执行操作后的提示信息、跳转进行管理的类;三、是为了一定程度上避免用户能够直接从查看页面源代码获取到操作后跳转的路径,减少可能出现的安全问题

以前的设计中忽略了在一些操作中,有可能给出提示信息后并不需要进行跳转,而是将当前窗口关闭,现通过将跳转的URL设置为"#",以进行判断是否进行跳转还是关闭当前窗口

源代码如下:

package  cn.edu.cnu.ie.AEMS.Common;

import  java.io. * ;

import  javax.xml.parsers.DocumentBuilderFactory;
import  javax.xml.parsers.DocumentBuilder;
import  javax.xml.parsers.ParserConfigurationException;
import  org.xml.sax.SAXException;
import  org.w3c.dom. * ;

public   class  ReturnInfo  {
    
private static String _Info_type = null;
    
private static String _forward = null;
    
private static String xml = "../webapps/web/WEB-INF/classes/cn/edu/cnu/ie/AEMS/Common/Return_info.xml";
     
    
public  static void  setInfoType(String Info_type){            //设置返回信息类型
        _Info_type = Info_type;
        
    }

    
    
public static void setForward(String forward){                 //提示信息后跳转的URL
        _forward = forward;
    }

    
     
     
public static void  printInfo(PrintWriter out){               //输出提示信息
            try{
               
//初始化与操作保存相关提示信息的XML地相关变量
               DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();         
                     DocumentBuilder builder 
= builderFactory.newDocumentBuilder();      
                     Document xmlDoc 
= builder.parse(xml);
                     NodeList nodeList;
                     Node node;
             
                    
// 根据提示信息类型获取提示信息的内容
               nodeList = xmlDoc.getElementsByTagName(_Info_type);                                    
                     node 
= nodeList.item(0); 
                     String warning 
= node.getFirstChild().getNodeValue();
             
                     
//由获取的PrintWriter动态返回输出javascript
                out.println("<script language="javascript" type="text/javascript" charset="UTF-8">");
                out.println(
"window.alert(""+warning+"");");
               
if( ! _forward.equals("#")){
                     out.println(
"window.location=""+_forward +"";");
               }
else{
                   out.println(
"window.close();");
               }

               out.println(
"</script>");    
             
             }
catch(IOException ioe){
                     ioe.printStackTrace();
                 }
catch(ParserConfigurationException pce){
                     System.err.println(pce);
                 }
catch(SAXException saxe){
                     System.err.println(saxe);
                 }

        
        
    }

}

初学者,还请大家多批评~ ^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值