从今天开始记录我成长的每一步…… Hibernate的update问题
2007-11-18 15:23
696 查看
我还是初学者,问题都比较低级,大家不要笑啊,成长中……
今天的问题,是关于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);
}
}
}
初学者,还请大家多批评~ ^_^
今天的问题,是关于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);
}
}
}
初学者,还请大家多批评~ ^_^
相关文章推荐
- 今天开始学习LNMP,遇到问题记录一下~!
- 今天第一次开始写博客,作为新入门的程序员记录自己的学习工作中的问题。
- 全程记录:今天尝试安装SharePoint Server 2007过程 ,安装成功了,但是开始使用碰到权限问题,应该算是BUg吧
- 今天开始陆续记录学习和工作碰到的问题及解决办法
- 从今天开始记录自己走的每一步!HDU 1312
- 一直都没有好好的写博客,今天开始记录自己的点滴成长
- 从今天开始,用博客记录成长
- 从今天开始记录下文件过滤驱动中遇到的问题
- 从今天开始在博客记录我在学习过程中的一些问题
- 今天开始进驻CSDN博客,记录自己unity3d学习的每一步。
- 今天开始使用这个blog来记录我的学习中遇到的问题吧
- 从今天起开始写技术博客 记录我技术成长的一点一滴
- -今天开始进行Qt开发,初学,记录成长脚印
- Python顶尖级开发工程师的成长记录!走到今天,每一步都不容易!
- 今天开始写博客记录程序媛成长过程
- 开张篇,从今天开始记录我的成长
- 以前从来没有写东西的习惯,从今天开始,把自己开发中遇到的问题及解决方法和心得记录下来!
- 今天开始,将记录成长,点滴耕耘与您一同分享!
- 从今天开始,我要记录自己C++的成长!
- 从今天开始记录一下每天学到的Android知识、以及开发中遇到的问题