Hibernate旅程(二)Hibernate实例

上篇大概的介绍了Hibernate框架,本篇一个简单的hibernate例子来学习。


Hibernate配置

(1)  创建自己的java项目。

(2)  向自己的项目中添加Hibernate的相关的jar,我们可以创建自己的UserLibrary,这样就直接加入这个依赖包就可以了(如图2.12.2)。

Hibernate旅程(二)Hibernate实例_第1张图片

2.1

Hibernate旅程(二)Hibernate实例_第2张图片

2.2

需要添加上的jar包包括,a、加入hibernate-3.2/lib/*.jar b、加入hibernate-3.2/hibernate2.jar c、加入数据库驱动(mysql驱动可以去官网上下载)这样添加到我们自定义的依赖包中,再在程序中引入这个包就可以了。

(3)加入hibernate配置文件,在学struts的时候我们常用的配置文件是struts-config.xmlhibernate的配置文件hibernate.cfg.xml,我们可以在hibernate-3.2\etc\hibernate.cfg.xml目录下拷贝到我们项目中的src下。

这样以上步骤就完成了几本hibernate的基本配置。

(4)接下来我们要建立我们的实体类了,以便完成对象与表的映射。建立User实体类,完成实体类的映射User.hbm.xml。代码如下所示。

User类代码:

      package com.bjpowernode.hibernate;

import java.util.Date;

//user实体。
public class User {
	//用户编号。
	private String id;
	
	//名字。
	private String name;
	
	//密码。
	private String password;
	
	//创建日期。
	private Date createTime;
	
	//失效时间。
	 private Date expireTime;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	public Date getExpireTime() {
		return expireTime;
	}

	public void setExpireTime(Date expireTime) {
		this.expireTime = expireTime;
	}

}

 User.hbm.xml代码如下所示:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.auction">

	<class name="com.bjpowernode.hibernate.User" >
		<id name="id">
			<generator class="uuid" />
		</id>
		<property name="name"/>
		<property name="password"/>
		<property name="createTime"/>
		<property name="expireTime"/>
	</class>
</hibernate-mapping>


(5)  User.hbm.xml文件加入到hibernate.cfg.xml文件中,代码如下所示。

      <!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory name="foo">
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernate_first</property>
		
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<property name="hibernate.show_sql">true</property>
		
		<!--<property name="hibernate.format_sql">true</property>  -->
		
		
		<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

 

(6)  编写工具类,ExportDB.java生成数据库中的表,代码如下所示。

     package com.bjpowernode.hibernate;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
 * 将hbm生成ddl.
 * @author summer
 *
 */
public class ExportDB {

	/**将hbm生成ddl.
	 * @param args
	 */
	public static void main(String[] args) {

		//使用hibernate相关类configuation.
		//默认读取hibernate.cfg.xml文件.
		Configuration cfg = new Configuration().configure();
		//接受配置文件.
		SchemaExport export = new SchemaExport(cfg);
		//打印到控制台,输出到数据库.
		export.create(true, true);
		
	}

}

 

(7)  建立客户端类Client,向表User中添加数据。代码如下所示。

      

     package com.bjpowernode.hibernate;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * 客户端向表中添加数据.
 * @author summer
 *
 */
public class client {

	
	public static void main(String[] args) {
		//默认读取的是hibernate.cfg.xml 文件.
		Configuration cfg = new Configuration().configure();
		
		//建立SessionFactory.
		SessionFactory factroy = cfg.buildSessionFactory();
		//取得session.
		Session session = null;
		
		try
		{
			//通过工厂取得session
			session = factroy.openSession();
			
			//开启事务.
			session.beginTransaction();
			//给对象赋值.
			User user = new User();
			user.setName("张三");
			user.setPassword("123");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());
			
			//保存user对象到数据库.
			// 一个实体类对象对应一个数据库中的表.
			session.save(user);
			
			//先拿到前面事务的对象.再提交事务.
			session.getTransaction().commit();
		}catch( Exception e)
		{
			e.printStackTrace();
			//回滚事务.
			session.getTransaction().rollback();
		}finally{
			
			if(session!=null)
			{
				if(session.isOpen())
				{
					//关闭session.
					//hibernate中已经将connection的的关闭封装了.
					//我们没有看到任何一条sql语句.
					session.close();
				}
			}
		}
	}
}

 

(8)  加入log4j配置文件,将该配置文件拷贝到我们自己项目的src下,便于调试和跟踪。

(9)建立自己的数据库,执行ExportDB.java生成数据库中的表,执行client.java完成了对象与关系数据库表的对应,如下图3.2,建立的User表。

      Hibernate旅程(二)Hibernate实例_第3张图片

图3.2

                  

 

Configuration

上述代码中,Configuration类负责管理Hibernate的配置信息,一个Configuration类的实例代表了应用程序中java类到数据库映射的集合。我们创建一个Configuration实例,并通过这个实例创建SessionFactory实例。   //默认读取的是hibernate.cfg.xml文件.

           Configurationcfg = new Configuration().configure();

           

           //建立SessionFactory.

           SessionFactoryfactroy = cfg.buildSessionFactory();

在这里默认读取的是hibernate.cfg.xml文件,在新建一个Configuration的实例时,Hibernate会在类路径中查找hibernate.properties文件和hibernate.cfg.xml文件,如果两个文件同时存在,则hibernate.cfg.xml将覆盖hibernate.properties文件。如果两个文件都不存在则抛出异常。我们也可以指定配置文件的路径,不用系统默认的hibernate.cfg.xml文件:Stringfilename= “my_hibernate_cfg.xml” Configuration config = new Configuration().configure(filename);


Hibernate配置文件

从配置文件中可以看出,这个配置文件描述的是数据库的信息,如数据库看的URL、用户名、密码,hibernate使用方言(那种数据库),同时还可以管理数据库中各个表的映射文件,还可以配置事务策略等。


SessionFactory

SessionFactory负责Session实例的创建,为了创建一个SessionFactory对象,必须在Hibernate初始化的时候创建一个Configuration类的实例,并将已经写好的映射文件交给它处理。这样Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没用过了。SessionFactory是线程安全的,可以被多个单线程调用以取得session对象,而构造SessionFactory要消耗资源,所以多数情况下一个应用中只初始化一个SessionFactory,在这里我们可以考虑使用静态方法,来解决这个问题。在上述代码的基础上我们抽取出一个工具类,用来专门实例化工厂管理session,并且采用static每次只初始化一次,代码如下所示。

package com.bjpowernode.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	
	private static SessionFactory factory;

	//static只初始化一次.
	static
	{
		try{
		//默认读取的是hibernate.cfg.xml 文件.
				Configuration cfg = new Configuration().configure();
				
				//建立SessionFactory.
				factory = cfg.buildSessionFactory();
	
		}catch(Exception e )
		{
			e.printStackTrace();
		}
	}
	
	public static Session getSession()
	{
		//打开session.
		return factory.openSession();
	}
	
	//关闭session.
	public static void closeSession(Session session)
	{
		//判断是否为空.
		//判断是否是打开状态再进行关闭.
		
		if(session!=null)
		{
			if(session.isOpen())
			{
				session.close();
			}
		}
	}
	
	//返回工厂类.
	public static SessionFactory getSessionFactory()
	{
		return factory;
	}
}
	

Session

SessionHibernate运作的核心,对象的声明周期、事务的管理以及数据库的存取都与它息息相关。Session是由SessionFactory创建的,SessionFactory是线程安全的,而Session不是线程安全的,所以让多个线程共享一个session,会引起冲突。

 

下一篇Hibernate持久化对象的三个状态。

 

 

 

 

 

你可能感兴趣的:(Hibernate,ssh)