1. Hibernate下载和安装
Hibernate目前的最新版本是3.1.2,本章所用的代码也是基于该版本测试通过。安装和使用Hibernate请按如下步骤进行:
(1)首先登陆http://www.hibernate.org网站,下载Hibernate的二进制包。windows平台下载zip包,linux平台下载tar包。
(2)解压缩刚下载的压缩包,在hibernate-3.1路径下有个hibernate3.jar的压缩文件,该文件是hibernate的核心类库文件。该路径下还有lib路径,该路径包含Hibernate编译和运行的第三方类库。这些类库的使用请参看该路径下的readme.txt文件。
(3)将必需的hibernate类库添加到classpath里,或者使用ant工具。总之,编译和运行时可以找到这些类即可。web应用,则应该将这些类库复制到WEB-INF/lib下即可。
2. 传统JDBC的数据库操作
先看这样一个需求:向数据库里增加一条新闻,新闻有新闻Id,新闻标题,新闻内容三个属性。在传统的JDBC数据库访问里,完成此功能并不难。(本程序采用MySql数据库)
我们可采用如下方法来来完成:
import java.sql.*;
public class NewsDao
{
/**
* @param News 需要保存的新闻实例
*/
public void saveNews(News news)
{
Connection conn = null;
PreparedStatement pstmt = null;
int newsId = news.getId();
String title = news.getTitle();
String content = news.getContent();
try
{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
/* hibernate:想连接的数据库
user:接数据库的用户名
pass:连接数据库的密码
*/
String url="jdbc:mysql://localhost/hibernate?user=root&password=pass";
//获取连接
conn= DriverManager.getConnection(url);
//创建预编译的Statement
pstmt=conn.prepareStatement("insert into news_table values(?,?,?)");
//下面语句为预编译Statement传入参数
pstmt.setInt(1,newsId);
pstmt.setString(2,title);
pstmt.setString(3,content);
//执行更新
pstmt.executeUpdate();
}
catch (ClassNotFoundException cnf)
{
cnf.printStackTrace();
}
catch (SQLException se)
{
se.printStackTrace();
}
finally
{
try
{
//关闭预编译的Statement
if (pstmt != null)pstmt.close();
//关闭连接
if (conn != null) conn.close();
}
catch (SQLException se2)
{
se2.printStackTrace();
}
}
}
}
这种操作方式丝毫没有面向对象的优雅和易用,而是一种纯粹的过程式操作,在这种简单的数据库访问里,我们没有过多地感觉到这种方式的复杂与缺陷。但我们还是体会到Hiberate的灵巧。
3.Hibernate的数据库操作
在使用Hibernate之前,首先了解一个概念:PO(Persistent Object)持久化对象。持久化对象的作用是完成持久化操作,简单地说,通过该对象可对数据执行增、删、改的操作——以面向对象的方式操作数据库。
Hibernate里的PO是非常简单的,前面已经说过Hibernate是低侵入式的设计,完全采用普通Java对象来作为持久化对象使用,看下面的POJO(普通Java对象)类
public class News
{
int id;
String title;
String content;
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return (this.id);
}
……
}
为了节省篇幅,并未列出该类的title属性和content属性的setter与getter方法,读者可自行增加。这个类与常规的JavaBean没有任何区别,是个非常标准的简单JavaBean。
这个普通的JavaBean目前还不具备持久化操作的能力,为了使其具备持久化操作的能力,Hibernate采用XML映射文件,该映射文件也是非常简单。
下面提供该XML文件的全部代码:
<?xml version="1.0" encoding=”gb2312”?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--上面四行对所有的hibernate映射文件都相同 -->
<!-- hibernate-mapping是映射文件的根元素 -->
<hibernate-mapping>
<!-- 每个class元素对应一个持久化对象 -->
<class name="News" table=”news_table”>
<-- id元素定义持久化类的标识属性 -->
<id name = "id" unsaved-value = "null">
<generator class="increment"/>
</id>
<!-- property元素定义常规属性 -->
<property name="title"/>
<property name="content"/>
</class>
</hibernate-mapping>
对这个文件简单地解释一下:从1到4行,是该XML文件的文件头部分,定义该文件的xml版本,还有DTD,这四行对于所有Hibernate3.x的映射文件全部相同。hibernate-mapping元素是所有hibernate映射文件的根元素,这个根元素对所有的映射文件都是相同的。
hibernate-mapping元素下有子元素class元素,每个class元素映射一个PO,更准确地说,应该是持久化类。可以看到:
PO = POJO + 映射文件
现在就可以通过着个持久化类完成数据库的访问:插入一条新闻。
在插入一条新闻之前,还必须完成接受Hibernate管理的数据库的配置——连接数据库所需的用户名,密码,以及数据库名等等基本信息。连接所需的基本信息配置可通过.properties的属性文件,或hibernate.cfg.xml的方式来配置。本文采用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连接配置文件都相同 -->
<!-- hibernate- configuration是连接配置文件的根元素 -->
<hibernate-configuration>
<session-factory>
<!-- 指定连接数据库所用的驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,hibernate连接的数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.password">pass</property>
<!-- 指定连接池的大小-->
<property name="connection.pool_size">5</property>
<!-- 指定数据库方言-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 根据需要自动创建数据库-->
<property name="hbm2ddl.auto">create</property>
<!-- 罗列所有的映射文静-->
<mapping resource="News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
该配置文件非常简单,前面四行都是XML的基本定义和DTD声明,所有Hibernate配置文件前面四行都完全相同。Hibernate配置文件的根元素是hibernate-configuration,根元素里有子元素session-factory元素,该元素依次有很多property元素,property元素依次定义连接数据库的驱动,URL,用户名,密码,数据库连接池的大小(关于连接池的概念和用法请看9.2节)。还定义一个名为dialect的属性,该属性定义Hibernate连接的数据库类型是MySQL,Hibernate会针对该数据库的特性在访问时进行优化。最后一行mapping定义持久化类的映射文件。如果有多个持久化映射文件,罗列多个mapping元素在此处即可。
下面是完成新闻插入的代码
public class NewsDaoHibernate
{
Configuration configuration;
SessionFactory sessionFactory;
Session session;
public void saveNews(News news)
{
//实例化Configuration
configuration=new Configuration().configure();
//实例化SessionFactory
sessionFactory = configuration.buildSessionFactory();
//实例化Session
session = sessionFactory.openSession();
//开始事务
Transaction tx = session.beginTransaction();
//增加新闻
session.save(news);
//提交事务
tx.commit();
//关闭Session
session.close();
}
}
此时的代码结构非常清晰,保存新闻仅仅只需要个语句:session.save(news);而且是完全对象化的操作方式,可以说是非常简单、明了。
代码显示:执行session.save(News)之前,先要获取Session对象。PO只有在Session的管理下才可完成数据库访问。随PO与Session的关系,PO可有如下三个状态:
瞬态
持久化
脱管
对PO的操作必须在Session管理下才能同步到数据库。Session由SessionFactory工厂产生,SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象。
SessionFactory对象由Configuration对象生成。Configuration对象用来加载Hibernate配置文件。
最后使用如下方法来完成对新闻的增加:
public static void main(String[] args)
{
News n = new News();
n.setTitle("新闻标题");
n.setContent("新闻内容");
NewsDaoHibernate ndh = new NewsDaoHibernate();
ndh.saveNews(n);
}
注:本文的参考资料
《轻量级J2EE企业应用实战》作者:李刚
Hibernate目前的最新版本是3.1.2,本章所用的代码也是基于该版本测试通过。安装和使用Hibernate请按如下步骤进行:
(1)首先登陆http://www.hibernate.org网站,下载Hibernate的二进制包。windows平台下载zip包,linux平台下载tar包。
(2)解压缩刚下载的压缩包,在hibernate-3.1路径下有个hibernate3.jar的压缩文件,该文件是hibernate的核心类库文件。该路径下还有lib路径,该路径包含Hibernate编译和运行的第三方类库。这些类库的使用请参看该路径下的readme.txt文件。
(3)将必需的hibernate类库添加到classpath里,或者使用ant工具。总之,编译和运行时可以找到这些类即可。web应用,则应该将这些类库复制到WEB-INF/lib下即可。
2. 传统JDBC的数据库操作
先看这样一个需求:向数据库里增加一条新闻,新闻有新闻Id,新闻标题,新闻内容三个属性。在传统的JDBC数据库访问里,完成此功能并不难。(本程序采用MySql数据库)
我们可采用如下方法来来完成:
import java.sql.*;
public class NewsDao
{
/**
* @param News 需要保存的新闻实例
*/
public void saveNews(News news)
{
Connection conn = null;
PreparedStatement pstmt = null;
int newsId = news.getId();
String title = news.getTitle();
String content = news.getContent();
try
{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
/* hibernate:想连接的数据库
user:接数据库的用户名
pass:连接数据库的密码
*/
String url="jdbc:mysql://localhost/hibernate?user=root&password=pass";
//获取连接
conn= DriverManager.getConnection(url);
//创建预编译的Statement
pstmt=conn.prepareStatement("insert into news_table values(?,?,?)");
//下面语句为预编译Statement传入参数
pstmt.setInt(1,newsId);
pstmt.setString(2,title);
pstmt.setString(3,content);
//执行更新
pstmt.executeUpdate();
}
catch (ClassNotFoundException cnf)
{
cnf.printStackTrace();
}
catch (SQLException se)
{
se.printStackTrace();
}
finally
{
try
{
//关闭预编译的Statement
if (pstmt != null)pstmt.close();
//关闭连接
if (conn != null) conn.close();
}
catch (SQLException se2)
{
se2.printStackTrace();
}
}
}
}
这种操作方式丝毫没有面向对象的优雅和易用,而是一种纯粹的过程式操作,在这种简单的数据库访问里,我们没有过多地感觉到这种方式的复杂与缺陷。但我们还是体会到Hiberate的灵巧。
3.Hibernate的数据库操作
在使用Hibernate之前,首先了解一个概念:PO(Persistent Object)持久化对象。持久化对象的作用是完成持久化操作,简单地说,通过该对象可对数据执行增、删、改的操作——以面向对象的方式操作数据库。
Hibernate里的PO是非常简单的,前面已经说过Hibernate是低侵入式的设计,完全采用普通Java对象来作为持久化对象使用,看下面的POJO(普通Java对象)类
public class News
{
int id;
String title;
String content;
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return (this.id);
}
……
}
为了节省篇幅,并未列出该类的title属性和content属性的setter与getter方法,读者可自行增加。这个类与常规的JavaBean没有任何区别,是个非常标准的简单JavaBean。
这个普通的JavaBean目前还不具备持久化操作的能力,为了使其具备持久化操作的能力,Hibernate采用XML映射文件,该映射文件也是非常简单。
下面提供该XML文件的全部代码:
<?xml version="1.0" encoding=”gb2312”?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--上面四行对所有的hibernate映射文件都相同 -->
<!-- hibernate-mapping是映射文件的根元素 -->
<hibernate-mapping>
<!-- 每个class元素对应一个持久化对象 -->
<class name="News" table=”news_table”>
<-- id元素定义持久化类的标识属性 -->
<id name = "id" unsaved-value = "null">
<generator class="increment"/>
</id>
<!-- property元素定义常规属性 -->
<property name="title"/>
<property name="content"/>
</class>
</hibernate-mapping>
对这个文件简单地解释一下:从1到4行,是该XML文件的文件头部分,定义该文件的xml版本,还有DTD,这四行对于所有Hibernate3.x的映射文件全部相同。hibernate-mapping元素是所有hibernate映射文件的根元素,这个根元素对所有的映射文件都是相同的。
hibernate-mapping元素下有子元素class元素,每个class元素映射一个PO,更准确地说,应该是持久化类。可以看到:
PO = POJO + 映射文件
现在就可以通过着个持久化类完成数据库的访问:插入一条新闻。
在插入一条新闻之前,还必须完成接受Hibernate管理的数据库的配置——连接数据库所需的用户名,密码,以及数据库名等等基本信息。连接所需的基本信息配置可通过.properties的属性文件,或hibernate.cfg.xml的方式来配置。本文采用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连接配置文件都相同 -->
<!-- hibernate- configuration是连接配置文件的根元素 -->
<hibernate-configuration>
<session-factory>
<!-- 指定连接数据库所用的驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,hibernate连接的数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.password">pass</property>
<!-- 指定连接池的大小-->
<property name="connection.pool_size">5</property>
<!-- 指定数据库方言-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 根据需要自动创建数据库-->
<property name="hbm2ddl.auto">create</property>
<!-- 罗列所有的映射文静-->
<mapping resource="News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
该配置文件非常简单,前面四行都是XML的基本定义和DTD声明,所有Hibernate配置文件前面四行都完全相同。Hibernate配置文件的根元素是hibernate-configuration,根元素里有子元素session-factory元素,该元素依次有很多property元素,property元素依次定义连接数据库的驱动,URL,用户名,密码,数据库连接池的大小(关于连接池的概念和用法请看9.2节)。还定义一个名为dialect的属性,该属性定义Hibernate连接的数据库类型是MySQL,Hibernate会针对该数据库的特性在访问时进行优化。最后一行mapping定义持久化类的映射文件。如果有多个持久化映射文件,罗列多个mapping元素在此处即可。
下面是完成新闻插入的代码
public class NewsDaoHibernate
{
Configuration configuration;
SessionFactory sessionFactory;
Session session;
public void saveNews(News news)
{
//实例化Configuration
configuration=new Configuration().configure();
//实例化SessionFactory
sessionFactory = configuration.buildSessionFactory();
//实例化Session
session = sessionFactory.openSession();
//开始事务
Transaction tx = session.beginTransaction();
//增加新闻
session.save(news);
//提交事务
tx.commit();
//关闭Session
session.close();
}
}
此时的代码结构非常清晰,保存新闻仅仅只需要个语句:session.save(news);而且是完全对象化的操作方式,可以说是非常简单、明了。
代码显示:执行session.save(News)之前,先要获取Session对象。PO只有在Session的管理下才可完成数据库访问。随PO与Session的关系,PO可有如下三个状态:
瞬态
持久化
脱管
对PO的操作必须在Session管理下才能同步到数据库。Session由SessionFactory工厂产生,SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象。
SessionFactory对象由Configuration对象生成。Configuration对象用来加载Hibernate配置文件。
最后使用如下方法来完成对新闻的增加:
public static void main(String[] args)
{
News n = new News();
n.setTitle("新闻标题");
n.setContent("新闻内容");
NewsDaoHibernate ndh = new NewsDaoHibernate();
ndh.saveNews(n);
}
注:本文的参考资料
《轻量级J2EE企业应用实战》作者:李刚