注:本文只是本人的个人理解,仅供参考,由于刚刚开始学hibernate框架,里面如果纰漏,还请网友多多指点。
我采用的是MyEclipse进行Web开发的。
此次,我打算是将struts2与hibernate整合开发,说是整合,也就是将连接数据库的部分用hibernate操作而已。
进入正题。。。
在MyEclipse中提供有struts2、hibernate、spring框架,你可以直接用里面的框架进行编译项目。具体的就靠自己慢慢摸索了(提示一下: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配置。
那么我们手工添加的时候需要添加些什么呢,这个还是一个遗留问题,我在官方网站下载hibernate的jar包后,将其复制到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转换为对数据库的操作。