初识hibernate

注:本文只是本人的个人理解,仅供参考,由于刚刚开始学hibernate框架,里面如果纰漏,还请网友多多指点。

 

我采用的是MyEclipse进行Web开发的。

此次,我打算是将struts2hibernate整合开发,说是整合,也就是将连接数据库的部分用hibernate操作而已。

进入正题。。。

MyEclipse中提供有struts2hibernatespring框架,你可以直接用里面的框架进行编译项目。具体的就靠自己慢慢摸索了(提示一下:MyEclipse->Project Capablities->…里面就包含有Myeclipse提供的框架的jar包)。当我们将框架jar包添加进去之后,如果希望进行删除、修改,那么可以直接在builder path下面进行修改(如果jar包添加在lib目录下面,可以直接在里面删除),但是这样的修改会造成一个问题:当我们通过MyEclipse添加jar包的时候,他会将jar包的一些信息存储到项目文件中,如果我们删除了jar包,那些信息并未删除,当你再想通过Myeclipse添加框架的jar文件的时候,就无法添加。。。那么我们可以采取以下办法解决(假设当前所在的路径为项目的根路径,也就是src所在的路径):1、删除.myhibernatedata文件;2、用记事本打开.project文件,然后删除<buildSpec>元素下hibernate的配置,以及<natrures>下面的hibernate配置。

那么我们手工添加的时候需要添加些什么呢,这个还是一个遗留问题,我在官方网站下载hibernatejar包后,将其复制到lib目录下面,并且将其所需要的辅助jar包也放到lib目录下,但是一直出现问题,由于刚刚开始学习hibernate,此问题暂时遗留,希望知道的朋友还请多多指点。

下面进入正题

下面是后台处理的java文件的UML类图。



 Struts2的配置就不用说了,直接看hibernate的核心部分:

如果希望利用hibernate框架操纵数据库,跟我们平常操纵数据库一样,需要以下一些东西:

1、 数据库文件

2、 驱动文件

3、 数据库操作

那么我们就围绕着这两个条件看看hibernate是如何将其封装的:

首先要了解一个很重要的类:

SessionFactory,它是用来管理所有的会话的(所谓的会话就是当我们访问页面的时候,通过页面与服务器进行信息交流,这就称为一次会话),通常情况下一个项目只有一个会话工厂来管理所有的会话。所以它只需要初始化一次,那么根据这个特性,我们就应该将其设置为static变量。

它的初始化需要Configuration这个类来生成该工厂,那么这个类就是实现了数据库的配置连接,并且将我们建立的模型(此处的模型也就是一个javaBean,例如一个Person类,有姓名、年龄等属性,它就可以成为一个模型)与数据库中的数据表进行映射关联(此处的关联或许也就是一个Map而已),也就是这个类将我们的配置信息(数据库文件、驱动、用户名、密码等信息)进行解析,默认是去解析hibernate.cfg.xml文件,然后去进行数据库连接。

所有的配置文件都直接放在src目录下。

首先看一下hibernate.cfg.xml文件的内容:

 

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>
    	<!-- 连接的URL -->
		<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
		
		<!-- 登录数据库的用户名 -->
		<property name="connection.username">root</property>
		
		<!-- 登录数据库的密码 -->
		<property name="connection.password">wlzjdm</property>
		
		<!-- 连接数据库的驱动 -->
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		
		<!-- 采用的会话方言,也就是告诉hibernate此次连接的是什么数据库,采用哪种数据库语言 -->
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

		<!-- 是否打印hibernate自动生成的SQL语句,为了方便测试,此处设置为true,当我们部署的时候应该设置为false -->
		<property name="show_sql">true</property>
		
		<!-- 模型与数据库表的关联配置 -->
		<mapping resource="User.hbm.xml" />
	</session-factory>

</hibernate-configuration>

 

 +++++++++++++++++++++++++++++++++++User.hbm.xml

 

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

<hibernate-mapping>
	<class name="dong.hibernate.model.User" table="user">
		<id name="id" type="int">
			<generator class="increment"></generator>
		</id>
		
		<property name="username" column="username" type="string"/>
		<property name="password" column="password" type="string"/>
		<property name="email" column="email" type="string"/>
		<property name="age" column="age" type="integer"/>
	</class>
</hibernate-mapping>

 

 下面我们就看一下初始化SessionFactory以及Session建立、释放的处理类:

 

package dong.hibernate.util;

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

/**
 * 数据库的辅助类,实现了会话工厂的初始化,实现了一个会话的建立、关闭
 * 
 * @author HS
 * 
 */
public class HibernateUtil
{
	/**
	 * 会话工厂,通常来说,当服务器启动之后,会话工厂只有一个,它对应于一个数据库的配置文件,默认的命名为hibernate.cfg.xml,它
	 * 将数据源与hibernate进行关联。
	 */
	private static SessionFactory sessionFactory;

	/**
	 * 当该类加载的时候就应该初始化会话工厂
	 */
	static
	{
		try
		{
			sessionFactory = new Configuration().configure()
					.buildSessionFactory();
		}
		catch (HibernateException he)
		{
			he.printStackTrace();
		}
	}

	/**
	 * 打开一个会话,例如当一个网页访问一个action,而action需要进行数据库操作的时候,它就会请求DAO新建一个会话,然后 间接操纵数据库。
	 * 
	 * @return 返回建立的会话
	 * @throws HibernateException
	 */
	public static Session openSession() throws HibernateException
	{
		return sessionFactory.openSession();
	}

	/**
	 * 关闭当前会话,当会话完成之后应该将其关闭,否则会浪费系统资源,使得系统越来越慢
	 * 
	 * @param session
	 *            要关闭的会话
	 * @throws HibernateException
	 */
	public static void closeSession(Session session) throws HibernateException
	{
		if (session != null)
		{
			session.close();
		}
	}
}

 那么当我们了解完生成一次会话的方法之后,下面重点看一下会话(Session)的内容:

 

Session就是java应用和hibernate之间的一个桥梁,通过Session可以讲java对对象的操作(增删改查)传递给hibernate框架,让hibernate去转换会对数据库的操作。

(SQL:INSERT)增加数据的方法:save(), persist()

(SQL:DELETE)删除数据的方法:delete()

(SQL:UPDATE)更新数据的方法:update() or merge()

下面就看一下处理代码吧:

package dong.hibernate.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import dong.hibernate.dao.UserDAO;
import dong.hibernate.model.User;
import dong.hibernate.util.HibernateUtil;

/**
 * DAO层的一个实现类,针对mysql类型的数据库进行操作
 * 
 * @author HS
 * 
 */
public class UserDAOImpl implements UserDAO
{

	@Override
	public boolean add(User user)
	{
		Session session = null;
		Transaction tx = null;
		try
		{
			session = HibernateUtil.openSession();
			tx = session.beginTransaction(); 
			 
			session.save(user);
			
			tx.commit();
			return true;
		}
		catch (HibernateException he)
		{
			tx.rollback();
			he.printStackTrace();
			return false;
		}
		finally
		{
			System.out.println("execute");
			HibernateUtil.closeSession(session);
		}
	}
}
 

至此就完成了一个对数据的增加操作。剩下的就是自己采用传统的方式进行测试了,测试内容就不写了。。。

看完后,我们容易理解:

1、 数据库文件跟以前一样就是你的计算机上安装的数据库了

2、 连接数据库时需要的参数信息,也就是hibernate.cfg.xml文件中的内容了

3、 数据库的操作,这个也就是我们平常对对象的操作,然后将操作传递给hibernate,让hibernate转换为对数据库的操作。

还有一个很重要的类就是Transaction,这个类中的方法是用来实现将session的请求提交的。如果我们仅仅通过Session进行save操作的话,并不会将内容添加到数据库中。具体使用参考官方文档。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wlzjdm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值