Hibernate基础(上)
分类: Hibernate |
Hibernate是一种ORM框架,与各种数据库、SQL语句打交道,是数据持久化的一种解决方案。本章将系统的介绍Hibernate的各种配置方式、ORM Mapping等。这一章中先通过两个简单的例子,直观的了解Hibernate,在后面的章节中会对Hibernate进行详细的讲解。
本章使用的开发工具是MyEclipse5.5,服务器是Tomcat6.0,数据库是MySQL5.1。本章中所有例子的源代码都在光盘第8章。
8.1 Hibernate概述
Hibernate是一种ORM框架,全称Object-Relative
8.1.1 ORM简介
在实际的开发中,数据持久化是核心的技术之一。传统的数据持久化编程中,需要使用JDBC并配合大量的SQL语句。Connection、Statement、ResultSet等JDBC
DAO层很有规律为:插入数据时,把实体类(有人称为POJO,也有人称为VO)拆分成各种属性然后拼装为SQL语句,保存进数据库;读取数据时,用SQL把实体类的各种属性从数据库读出来,然后拼装为实体类对象返回。而且实体类与数据表、实体类的属性与数据表的列,都存在着某种固定的映射关系。如果能够用程序自动生成SQL语句就好了。
ORM称为对象-关系数据库映射,英文全名为Object/Relation
8.1.2 Hibernate的概念
Hibernate是一种ORM框架,全称Object-Relative
Hibernate的官方网站为:http://www.hibernate.org。Hibernate最早是做Java语言的ORM框架起家的,现在也开始为其他语言提供ORM支持,例如.net版本的NHibernate等。
8.2 在MyEclipse中添加Hibernate的jar包
早期的Hibernate使用xml配置实体类与数据库间的映射。现在,SUN推出了JPA(Java
使用MyEclipse新建Web
(1)右击工程名,在弹出的对话框中选择“MyEclipse”选项,如图8.1所示。
图8.1
(2)在MyEclipse选项中选择“Add
图8.2
(3)在图8.2所示的对话框中选择Hibernate的版本以及把Hibernate的jar包拷贝到/WebRoot/WEB-INF/lib目录下,单击“Next”按钮以后,进入图8.3所示的对话框。
8.3
(4)在图8.3所示的对话框中选择好Hibernate的配置以后,单击“Next”按钮,进入图8.4所示的对话框。
图8.4
(5)在图8.4所示的对话框中设置MySQL的数据源,选择MySQL数据库驱动,输入连接数据的用户名和密码,然后选择MySQL数据库。单击“Next”按钮进入图8.5所示的对话框。
图8.6
(6)在图8.6的对话框中,选择Hibernate工厂类的包,选择Java
配置完成以后,MyEclipse会添加标准格式的Hibernate配置文件hibernate.cfg.xml,将Hibernate
说明:某些版本的MyEclipse自带的Hibernate的jar有问题。如果出现错误,读者需要从Hibernate官方网站下载官方的Hibernate库,添加到classpath中,并把MyEclipse的Hibernate库从项目中去掉
8.3 在Java程序中使用Hibernate
在8.2节中介绍了如何在MyEclipse中添加Hibernate的jar包,这一节将介绍如何在MyEclipse中编写一个简单的Hibernate例子。这一节的例子源代码在光盘第8章\8-3的工程hibernate_demo中
8.3.1 创建Web工程并搭建框架
在MyEclipse中创建一个Web
8.3.2 连接数据库
搭建好Hibernate框架以后,需要把Hibernate和数据库建立连接,在MyEclipse提供了Hibernate自动连接数据库,只需要配置还相关参数就可以了,还可以根据数据库表来自动生成实体类和实体类的数据库映射文件。在MyEclipse中使用Hibernate链接数据库步骤如下:
(1)在MyEclipse的菜单栏中“Window”菜单中选择“Show
图8.7
(2)在图8.7右图中的对话框中展开“MyEclipse
图8.8
(3)在图8.8所示的页面中右击“MyEclipse
图8.9
(4)在图8.9所示的对话框中输入数据库驱动、数据库连接地址,连接数据库的用户名和密码,然后单击“Add
图8.10
(5)在图8.10所示的对话框中单击“Add”按钮选择要连接的数据库模式,单击“OK”按钮,再单击“Finish”按钮完成数据库连接。
8.3.3 创建数据库表
连接好数据库以后,下一步要做的是使用Hibernate操作数据库,先在数据库中创建一张表,建表SQL语句如下:
--
CREATE
)
这张表中有5个字段,字段id是int类型,把id设置成主键,不能为空,其他的字段可以为空。表格的编码方式的gb2312。
8.3.4 通过表格自动生成实体类和映射文件
MyEclipse开发工具有个好处是:它可以根据数据库表来自动生成实体类和映射文件。在连接好数据库以后,根据数据库表自动生成实体类和映射文件的步骤如下:
(1)在“DB
图8.11
(2)打开数据库连接以后,展开“com.mysql.jdbc.Driver”数据库连接,如图8.12所示。
图8.12
(3)在图8.12所示的对话框中,右击需要生成实体类和映射文件的表,选择“Hibernate
图8.13
图8.13
(5)在图8.13中选中表格,然后输入表格对应的实体类,这里要包括类所在的包和类名。单击“Finish”按钮,这样就完成了实体类和配置文件的生成。
通过上面的步骤,根据数据库表的字段,自动生成了实体类和映射文件按,实体类Users的代码如下(源代码见光盘第8章\8-3):
package
public
//
private
private
private
private
private
//
public
}
public
this.id
}
public
String
this.id
this.name
this.age
this.tel
this.address
}
//
//这里省略了setter和getter方法
}
实体类和数据库表通过映射文件联系。在映射文件中,会把实体类的属性名和数据库的字段名一一对应。生成的映射文件UsersVo.hbm.xml代码如下(源代码见光盘第8章\8-3):
package
public
//
private
private
private
private
private
//
public
}
public
this.id
}
public
String
this.id
this.name
this.age
this.tel
this.address
}
//
//这里省略了setter和getter方法
}
实体类和数据库表通过映射文件联系。在映射文件中,会把实体类的属性名和数据库的字段名一一对应。生成的映射文件UsersVo.hbm.xml代码如下(源代码见光盘第8章\8-3):
<?xml
<!DOCTYPE
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
-->
<hibernate-mapping>
</hibernate-mapping>
8.2.5 编辑Hibernate的配置文件
MyEclipse向导会生成一个hibernate.cfg.xml。这是Hibernate默认的配置文件,配置有JDBC连接信息以及Hibernate的一些参数等。在使用的时候需要手动去编辑一些信息。编辑后的hibernate.cfg.xml文件代码为(源代码见光盘第8章\8-3):
<?xml
<!DOCTYPE
<!--
<hibernate-configuration>
<property
<property
<property
<!--
<mapping
</hibernate-configuration>
其中,dialect表示使用MySQL的SQL语句(各数据库的SQL会有轻微的区别,因此用dialect加以区别)。show_sql表示在控制台显示生成的SQL语句,hbm2ddl.auto表示自动生成数据库语句。current_session_context_class表示为每个线程生成一个Session。参数dialect与current_session_context_class是必须的。
最后<mapping
hbm2ddl.auto不是必须的,如果不设置hbm2ddl属性,需要用SQL初始化数据库表结构。hbm2ddl.auto取值与作用如下:
q
q
q
q
8.2.6 编辑HibernateSessionFactory类
在使用MyEclipse想到自动导入Hibernate的jar包的时候,生成了HibernateSessionFactory类,这个类是原来初始化Hibernate的,一个有用程序如果只连接一个数据库,那么有一个HibernateSessionFactory类就足够了,关于HibernateSessionFactory的详细语法在以后的章节中会有介绍,这里不做详细介绍了。编辑后的HibernateSessionFactory类的代码如下:
package
import
import
public
private
static
configuration.configure(configFile);//加载配置文件hibernate.cfg.xml
sessionFactory
}
System.err
.println("%%%%
e.printStackTrace();
}
public
if
//创建或者打开session
session
:
threadLocal.set(session);
}
}
8.2.6 使用Hibernate添加数据
Hibernate是ORM框架,与数据库打交道,它即可用于普通的Java程序,又可以用于Java
Hibernate保存实体类对象时十分简单,一句代码session.persist(objest)即可。例如,在普通的Java程序中使用Hibernate,代码如下(这里省略了import的内容,源代码见光盘第8章\8-3):
package
public
public
//往Users对象中添加数据
Users
users.setId(12354);
users.setAddress("北京海淀");
users.setName("王五");
users.setAge(22);
users.setTel("010-12345678");
//往Users对象中添加数据
Users
users2.setId(12154);
users2.setAddress("北京海淀");
users2.setName("孙钱");
users2.setAge(23);
users2.setTel("010-12345878");
//往Users对象中添加数据
Users
users3.setId(12164);
users3.setAddress("北京海淀");
users3.setName("孙李");
users3.setAge(24);
users3.setTel("010-12345578");
Session
HibernateSessionFactory.getSession();
Transaction
session.persist(users);
session.persist(users2);
session.persist(users3);
trans.commit();//提交事务
//
StringBuffer
result.append("添加成功!往数据库中添加了如下数据:\n");
result.append("编号
+"年龄
result.append(users.getId()+"
result.append(users.getAddress()+"
result.append(users.getName()+"
result.append(users.getAge()+"
result.append(users.getTel()+"\t\n\r");
result.append(users2.getId()+"
result.append(users2.getAddress()+"
result.append(users2.getName()+"
result.append(users2.getAge()+"
result.append(users2.getTel()+"\t\n\r");
result.append(users3.getId()+"
result.append(users3.getAddress()+"
result.append(users3.getName()+"
result.append(users3.getAge()+"
result.append(users3.getTel()+"\t\n\r");
session.close();//关闭会话
//
JOptionPane.getRootFrame().setFont(new
JOptionPane.showMessageDialog(null,
}
}
代码演示了用Hibernate插入数据库与查询数据库。先session.persist()方法插入3条数据,并用Swing输出添加的数据。Swing显示的效果如图8.14所示。
图8.14
控制台会打印出所有的SQL语句,本例子中是执行了插入数据的SQL语句,插入了3挑数据,所以有3条SQL语句执行了,在控制台中输出的SQL语句信息如下:
Hibernate:
Hibernate:
Hibernate:
说明:可以使用Hibernate来自动创建数据库表。过程是通过在MyEclipse中配置还实体类和映射文件以后,根据实体类和映射文件来创建数据库表。这种方法对初学者来说,难度很大。在这里就不做介绍了。
8.4 在Java Web程序中使用Hibernate
在Java
Web程序中,hibernate.cfg.xml中必须配置current_session_context_class参数。如果是使用JBoss等内置Hibernate的容器,参数值要配置为jta,其他容器如Tomcat等需要配置为thread。
这一节的所有例子都在Web工程hibernate_web中,所有例子源代码在光盘第8章\8-4\hibernate_web中。
8.4.1 创建工程并搭建Hibernate框架
在MyEclipse中创建一个Web工程,工程名为hibernate_web,把MySQL数据库驱动包和JSTL需要的jar包拷贝到WebRoot/WEB-INF/lib目录下。然后使用MyEclipse向导把Hiibernate的jar包导到工程中。搭建Hibernate框架再前面的章节中已经做作了介绍,这里就不做详细介绍了。然后使用Hibernate链接数据库,并通过数据库表自动生成数据库对应的实体类和实体类映射文件。这一节中使用的数据库表是users表,该表在8.3节的例子中创建的。
数据库表users对应的实体类中是自动生成的,它包括数据库表字段对应的变量名,以及这些变量的setter和getter方法,UsersVo类的代码如下(这里省略了setter和getter方法,源代码见光盘第8章\8-4):
package
public
//
private
private
private
private
//这里省略了setter和getter方法
}
实体类对应的映射文件UsersVo.hbm.xml中,包含了实体类的变量名以及变量数据类型,变量名对应的数据库字段名,映射文件UsersVo.hbm.xml的代码如下(源代码见光盘第8章\8-4):
<?xml
<!DOCTYPE
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
-->
<hibernate-mapping>
</hibernate-mapping>
在Hibernate的配置文件hibernate.cfg.xml中,需要编写数据库连接、和MySQL方言,为了方便测试,
设置在MyEclipse的控制台中输出SQL语句,同时还需要把映射文件UsersVo.hbm.xml配置到配置文件hibernate.cfg.xml中,代码如下(源代码见光盘第8章\8-4):
<?xml
<!DOCTYPE
<!--
<hibernate-configuration>
<session-factory>
<property
<property
<property
<!--
<mapping
</hibernate-configuration>
初始化Hibernate需要用到HibernateSessionFactory类,该类中初始化Hibernate,并且提供了开启和关闭Session的方法,该类是在使用MyEclipse向导自动生成的,可以根据需要自行修改该类中的方法,HibernateSessionFactory类的代码如下(源代码见光盘第8章\8-4):
package
import
import
public
private
static
configuration.configure(configFile);
sessionFactory
}
System.err
.println("%%%%
e.printStackTrace();
}
if
if
rebuildSessionFactory();
}
session
:
threadLocal.set(session);
}
public
try
configuration.configure(configFile);
sessionFactory
}
System.err
.println("%%%%
e.printStackTrace();
}
}
public
return
}
public
HibernateSessionFactory.configFile
sessionFactory
}
public
return
}
}
Hibernate基础(下)
由于文字字数限制,因此hibernate基础分开成上、下篇。接上一篇《Hibernate基础(上)》博文,
8.4.2 编写数据持久层
为了是程序结构清晰,数据持久层独立出来放在DAO层中,在DAO层的类中编写数据的增删改查方法,通过这些方法去操作数据。在使用时,只需要根据实际情况来调用DAO层中的方法就可以了。这个例子中DAO层只有一个类,类名为HibernateDao,HibernateDao类的代码如下(这里省略了import的内容,源代码见光盘第8章\8-4):
package
public
public
Session
HibernateSessionFactory.getSession();
try
session.beginTransaction(); //
session.persist(usersVo); //
session.getTransaction().commit(); //
}
session.getTransaction().rollback();//
}
session.close(); //
}
}
public
Session
try
session.beginTransaction(); //
session.update(usersVo);
session.getTransaction().commit(); //
}
session.getTransaction().rollback();//
}
session.close(); //
}
}
//
public
Session
try
session.beginTransaction(); //
UsersVo
session.delete(users); //
session.getTransaction().commit(); //
}
session.getTransaction().rollback(); //回滚事务
}
session.close(); //
}
}
@SuppressWarnings("unchecked") //
public
Session
UsersVo
return
}
@SuppressWarnings("unchecked")
public
Session
try
session.beginTransaction(); //
return
}
session.getTransaction().commit(); //
session.close(); //
}
}
}
该类中接受UsersVo类。Hibernate能够判断实体类的类型,决定操作哪个数据表。HibernateDao封装了最基本的CRUD操作。
8.4.3 查询所有数据
由于在DAO层已经把增删改查的方法都封装了,查询全部数据的时候,只需要在Servlet中调用DAO层中的查询全部的方法即可,把查询到的数据放在List集合中,再把List集合放入request对象中,在页面横纵把数据遍历输出。查询全部数据的Servlet——ShowListServlet类代码如下(这里省略了import内容,源代码见光盘第8章\8-4):
package
public
public
throws
response.setContentType("text/html");
request.setCharacterEncoding("gb2312"); //
response.setCharacterEncoding("gb2312");//
PrintWriter
this.doPost(request,
out.flush();
out.close();
}
public
throws
response.setContentType("text/html");
request.setCharacterEncoding("gb2312"); //
response.setCharacterEncoding("gb2312");//
PrintWriter
HibernateDao
List
//使用HQL语句查询全部数据,并放入List集合中
usersList
request.getRequestDispatcher("/showList.jsp").forward(request,
out.flush();
out.close();
}
}
查询结果将被转发到showList.jsp显示。查询结果为List对象。JSP中遍历List里的所有UsersVo对象,并输出,showList.jsp代码如下(源代码见光盘第8章\8-4):