您的位置:首页 > 其它

Hibernate的介绍、安装、配置和应用

2007-06-06 09:14 751 查看
一、Hibernate介绍:
Hibernate是一个JDO工具。它的工作原理是通过文件把值对象和数据库表之间建立起一个映射关系,这样,我们只需要通过操作这些值对象和Hibernate提供的一些基本类,就可以达到使用数据库的目的。例如,使用Hibernate的查询,可以直接返回包含某个值对象的列表(List),而不必向传统的JDBC访问方式一样把结果集的数据逐个装载到一个值对象中,为我们的编码工作节省了大量的劳动。Hibernate提供的HQL是一种类SQL语言,它和EJBQL一样都是提供对象化的数据库查询方式,但HQL在功能和使用方式上都非常接近于标准的SQL。
Hibernate基础代码包括:
1. POJO
POJO 在Hibernate 语义中理解为数据库表所对应的Domain Object。这里的POJO就是所谓的“Plain Ordinary Java Object”,字面上来讲就是无格式普通Java 对象,简单的可以理解为一个不包含逻辑代码的值对象(Value Object 简称VO)。
一个典型的POJO:
public class TUser implements Serializable {
private String name;
public TUser(String name) {
this.name = name;
}
/** default constructor */
public TUser() {
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
2. Hibernate 映射文件
Hibernate 从本质上来讲是一种“对象-关系型数据映射”(Object Relational
Mapping 简称ORM)。前面的POJO在这里体现的就是ORM中Object层的语义,
而映射(Mapping)文件则是将对象(Object)与关系型数据(Relational)相关联的纽带,在Hibernate中,映射文件通常以“.hbm.xml”作为后缀。
二、Hibernate的安装:
(1)下载Hibernate3包并解压解压后的目录是hibernate-3.1,目录结构如图:



使用hibernate主要是要用目录lib中的jar包:



下面这个表对每个jar包的作用做了描述





(2)下载安装eclipse的hibernate插件Hibernate Synchronizer(最新版本为3.1.9),下载压缩包HibernateSynchronizer-3.1.9.zip,解压到eclipse目录,重启eclipse即可使用此插件。
使用此插件的方便之处:
可以根据数据库的连接url或者是数据源连接自动生成hibernate配置文件hibernate.cfg.xml;可以根据数据库中的表生成hibernate数据库表映射文件*.hbm.xml(*代表数据库表名称);可以将*.hbm.xml映射添加到hibernate配置文件中;根据*.hbm.xml自动生成对应的POJO代码。省去了大量的手工编写代码时间,并且可以尽量避免手写代码产生的输入错误。
三、Hibernate配置
无需特殊配置,只需在使用Hibernate的工程中将lib目录中的jar包加入到工程的构建路径中。
四、Hibernate应用
使用一个简单的例子说明Hibernate的应用:
1、在MySql中新建一个数据库schoolproject,创建一个表sudent,表中有三个字段id(varchar(32) 默认值为空)、Name(varchar(10)不可空)、Age(tinyint 可空)。

2、打开eclipse新建一个java项目,输入项目名称TestHibernate,下一步,配置工程的源文件夹为src,输出文件夹为classes,将Hibernate安装中所说的lib中的jar包加入到工程的构建路径中,并需要将MySql的jdbc驱动jar包(mysql-connector-java-3.1.13-bin.jar、mysql-connector-java-3.1.13-bin-g.jar)加入路径中,完成。
3、在源文件夹src中新建一个Hibernate配置文件,如图选择Hibernate Configuration File:



点击下一步,出现如下对话框:



Database Type选择MySQL,connection选项中有两种连接方式,第一种为URL连接,第二种是数据源连接,在这里我们使用第一种方式,输入Database URL:jdbc:mysql://localhost:3306/schoolproject,输入数据库连接的用户名和密码,完成。此时便自动生成了hibernate配置文件hibernate.cfg.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory >

<!-- local connection properties -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/schoolproject</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- property name="hibernate.connection.pool_size"></property -->

<!-- dialect for MySQL -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="hibernate.show_sql">false</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
</session-factory>
</hibernate-configuration>
在此,我们将<property name="hibernate.show_sql">false</property>中的false修改成true,是为了能够显示操作数据库时产生的sql语句。
4、我们再在src中建立一个包model用来存放产生的POJO文件,在包中新建一个Hibernate映射文件,在model上点击右键——>新建——>其他,选择Hibernate Mapping File:



在对话框中输入数据库连接密码,点击refresh即可将数据库中扫描出数据库中的所有表,选择sudent,选择package为model;



在Properties选项卡中将ID Generator修改成uuid.hex(自动产生主键,如果要自己指定主键可以修改成assigned),完成。此时在包model中便产生了我们的表sudent所对应的数据库映射文件Sudent.hbm.xml。



5、在Student.hbm.xml上点击右键,进行如下操作:



此时产生了表对应的POJO文件BaseStudent.java(自动产生的base包中)和Student.java,接下来我们将表的映射文件在hibernate配置文件中做映射,修改后的hibernate.cfg.xml内容如下(红色部分为加入部分):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- local connection properties -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/schoolproject
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- property name="hibernate.connection.pool_size"></property -->
<!-- dialect for MySQL -->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<mapping resource="model/Sudent.hbm.xml" />
</session-factory>
</hibernate-configuration>
6、此时我们便可以编写一个测试范例来测试一下我们的例子,在源文件夹src中新建一个类包名为testhibernte,类名为TestHibernate,TestHibernate.java的内容如下:
package testhibernate;

import org.hibernate.*;
import org.hibernate.cfg.*;
import model.Sudent;
public class TestHibernate {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
try{
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
for(int i=1;i<=10;i++){
Sudent st = new Sudent();
st.setName("学生"+i);
st.setAge("22");
session.save(st);
}
tx.commit();
session.close();
System.out.println("数据插入成功,请查看数据库!");
}catch(HibernateException e){
e.printStackTrace();
}

}

}
将此类作为java应用程序运行,控制台出现如下的提示信息:



我们查看数据库表中多了10条数据,说明我们的操作成功。



7、在hibernate中调用存储过程,例如我们建立一个存储过程GetAllinfo,内容为:
Create procedure GetAllinfo()
Select * from sudent;
修改hibernate映射文件(Sudent.hbm.xml)为:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="model">
<class
name="Sudent"
table="sudent"
>
<meta attribute="sync-DAO">false</meta>
<id
name="Id"
type="string"
column="id"
>
<generator class="uuid.hex"/>
</id>

<property
name="Name"
column="Name"
type="string"
not-null="true"
length="10"
/>
<property
name="Age"
column="Age"
type="java.lang.String"
not-null="false"
length="3"
/>

</class>
<sql-query callable="true" name="getAllInfo">
<return alias="student" class="model.Sudent">
<return-property name="Name" column="Name"></return-property>
<return-property name="Age" column="Age"></return-property>
</return>
{call GetAllinfo()}
</sql-query>
</hibernate-mapping>
修改TestHibernate.java为:
package testhibernate;

import java.util.List;

import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.classic.Session;
import model.Sudent;
public class TestHibernate {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
try{
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
//String hql = "from sudent";

//session.delete(hql);
Query query = session.getNamedQuery("getAllInfo");//存储过程
//query.setInteger("age",22);
List su = query.list();
for(int i=0;i<su.size();i++){
Sudent st = (Sudent)su.get(i);
System.out.println(st.getName()+"/t"+st.getAge());
}
session.close();
System.out.println("数据查询成功!");
}catch(HibernateException e){
e.printStackTrace();
}

}

}
执行后控制台显示信息:



说明调用存储过程成功。
8、使用SQL语句
修改hibernate映射文件(Sudent.hbm.xml)为:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="model">
<class
name="Sudent"
table="sudent"
>
<meta attribute="sync-DAO">false</meta>
<id
name="Id"
type="string"
column="id"
>
<generator class="uuid.hex"/>
</id>
……
</class>
<sql-query name="selectUser">
<![CDATA[select {stu.*} from sudent stu where stu.Age>:age]]>
<return alias="stu" class="model.Sudent"></return>
</sql-query>
</hibernate-mapping>
修改TestHibernate.java为:
package testhibernate;

import java.util.List;

import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.classic.Session;
import model.Sudent;
public class TestHibernate {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
try{
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Query query = session.getNamedQuery("selectUser");
query.setInteger("age",22);
List su = query.list();
for(int i=0;i<su.size();i++){
Sudent st = (Sudent)su.get(i);
System.out.println(st.getName()+"/t"+st.getAge());
}
session.close();
System.out.println("数据查询成功!");
}catch(HibernateException e){
e.printStackTrace();
}

}

}
执行后控制台显示信息:



说明SQL语句执行成功。
9、使用HQL语句
修改TestHibernate.java代码为:
package testhibernate;

import java.util.List;

import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.classic.Session;
import model.Sudent;
public class TestHibernate {
………………//代码未变
String hql = "from sudent where Name=’徐军’";
Query query = session.createQuery(hql);
………………//代码未变
}
执行后控制台显示信息如下:



说明HQL语句执行成功。
以上就是对Hibernate的基本介绍及其安装配置,并有一个简单的例子应用,具体到一些深奥的技术需要以后慢慢学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: