我还是初学者,问题都比较低级,大家不要笑啊,成长中……
今天的问题,是关于update的问题,所涉及的实际功能操作就是修改密码
起初用的方法是用比较原始的hibernate操作
String HQL =
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进行更新
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;
}
}
}else...{
ReturnInfo.setInfoType("LoginError");
ReturnInfo.setForward("/web/setPassword.jsp");
但是貌似有个缺点,从转换后的SQL来看,它需要对每个字段都set一次,可能会对执行效率产生影响,目前作为遗留问题,还需进一步研究
还解决了一个问题,就是代码中ReturnInfo的一个问题,此类是一个专门用来返回操作后的提示信息的类,设计次模块的目的在于:一、为了提高与用户交互,和照顾用户使用习惯,所以提示信息都应采用javascript进行显示,而且javascript开发、执行效率都比较高,消耗资源也相对比较少;二、为了减少资源的消耗,并且提高可重用性,考虑到提示信息类型比较统一,实用范围比较广,可重用程度比较高,因此设计了一个统一对执行操作后的提示信息、跳转进行管理的类;三、是为了一定程度上避免用户能够直接从查看页面源代码获取到操作后跳转的路径,减少可能出现的安全问题
以前的设计中忽略了在一些操作中,有可能给出提示信息后并不需要进行跳转,而是将当前窗口关闭,现通过将跳转的URL设置为"#",以进行判断是否进行跳转还是关闭当前窗口
源代码如下:
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);
}
}
}
初学者,还请大家多批评~ ^_^