java web从零单排地二十期《Hibernate》基本流程

 

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?

SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是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页面进行添加和删除。



 

你可能感兴趣的:(java,Hibernate,Web,struts2)