1.新建包com.hibernate.util,添加类HibernateUtil.java
package com.hibernate.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; static { try { sessionFactory = new Configuration().configure().buildSessionFactory(); } catch(Exception e) { e.printStackTrace(); } } public static Session currentSession() { Session session = sessionFactory.openSession(); return session; } public static void closeSession(Session session) { if(session!=null) { session.close(); } } }
这段代码主要完成session的创建与删除。我们首先分析代码块:
private static SessionFactory sessionFactory;
声明一个SessionFactory,什么是SessionFactory?
static
{
try
{
sessionFactory = new Configuration().configure().buildSessionFactory();
}
catch(Exception e)
{
e.printStackTrace();
}
}
静态代码块,是最先执行的,这里的功能主要是创建一个新的sessionFactory。Configuration 接口的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动 过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个 SessionFactory对象。 虽然Configuration 接口在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动 hibernate 时你所遇到的每一个对象。
3.public static Session currentSession()
{
Session session = sessionFactory.openSession();
return session;
}
Session 接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate 中,实例
化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中确实很重要,
因为在客户程序中,可能会不断地创建以及销毁Session 对象,如果Session 的开销太大,会给系
统带来不良影响。但值得注意的是Session 对象是非线程安全的,因此在你的设计中,最好是一个
线程只创建一个Session对象。
在Hibernate 的设计者的头脑中,他们将session看作介于数据连接与事务管理一种中间接口。
我们可以将session想象成一个持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及
时刷新数据库。我们有时也称Session是一个持久层管理器,因为它包含这一些持久层相关的操作,
诸如存储持久对象至数据库,以及从数据库从获得它们。请注意,Hibernate 的session不同于JSP
应用中的HttpSession。当我们使用session这个术语时,我们指的是Hibernate 中的session,而
我们以后会将HttpSesion 对象称为用户session。
2.新建包com.hibernate.persistence新建类UserDB:
package com.hibernate.persistence; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.hibernate.model.User; import com.hibernate.util.HibernateUtil; public class UserDB { public static void save(User user) { Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); try { session.save(user); tx.commit(); } catch (Exception ex) { System.out.println("增加用户出现异常"); if(null!=tx) tx.rollback(); // TODO: handle exception } finally { HibernateUtil.closeSession(session); } } //查询出所有用户 @SuppressWarnings("unchecked") public static List<User> listall() { List<User> list = null; Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); try { Query query = session.createQuery("from User");//HQL 语句,针对的是类,不是具体的表 list =(List<User>) query.list(); tx.commit(); } catch (Exception ex) { System.out.println("增加用户出现异常"); if(null!=tx) tx.rollback(); // TODO: handle exception } finally { HibernateUtil.closeSession(session); } return list; } public static User getUserById(Integer Id) { User user =null; Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); try { //Query query = session.createQuery("from User where id=username");//HQL 语句,针对的是类,不是具体的表 //Object get(Class clazz, Serializable id) user =(User)session.get(User.class, Id); tx.commit(); } catch (Exception ex) { System.out.println("getUserById出现异常"); if(null!=tx) tx.rollback(); // TODO: handle exception } finally { HibernateUtil.closeSession(session); } return user; } public static void removeById(int id) { Session session = HibernateUtil.currentSession(); Transaction ts = session.beginTransaction(); User user = null; try { user = (User)session.get(User.class, id); session.delete(user); ts.commit(); } catch (Exception e) { // TODO: handle exception if(null!=ts) { ts.rollback(); } } } }
对于接触过数据的同学应该不难理解,里面出现了一个Transaction,他是一个事务,执行其commit方法进行提交。
3.新建com.test.action包,添加类UserAction:
package com.test.action; import java.util.List; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.hibernate.model.User; import com.hibernate.persistence.UserDB; import com.opensymphony.xwork2.ActionSupport; import com.sun.xml.internal.ws.resources.HttpserverMessages; public class UserAction extends ActionSupport { public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } private String username; private String password; //完成用户增加的操作 public String save() throws Exception { User user = new User(); user.setUsername(username); user.setPassword(password); UserDB.save(user);//保存到数据库了 List<User> list = UserDB.listall(); HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("list", list); return SUCCESS; } public String getUser() throws Exception { User user = UserDB.getUserById(username); HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("user", user); return SUCCESS; } public String deleteUser() throws Exception { UserDB.removeById(username); List<User> list =UserDB.listall(); HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("list", list); return SUCCESS; } }
4.struts.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtd/struts-2.0.dtd"> <struts> <package name="hibernate" extends="struts-default"> <action name="save" class="com.test.action.UserAction" method="save"> <result name="success" >/listAll.jsp</result> </action> <action name="getUser" class="com.test.action.UserAction" method="getUser"> <result name="success">/getPerson.jsp</result> </action> <action name="deleteUser" class="com.test.action.UserAction" method="deleteUser"> <result name="success">/listAll.jsp</result> </action> </package> </struts>
listall.jsp getPersion.jsp还没有添加,会在下一期一起讲解。
这一期的内容较多,到此先让同学们消化消化,下一期会结合jsp页面进行添加和删除。