一、 Hibernate介绍
    Hibernate是基于对象/关系映射(ORM,Object/Relational Mapping)的一个解决方案。ORM方案的思想是将对象模型表示的对象映射到关系型数据库中,或者反之。Hibernate目前是ORM思想在Java中最成功、最强大的实现。它于2001年的年末发布第一个版本,立即引起了广泛的注意。2003年6月,Hibernate2发表,并且获得Jolt大奖,进而被JBoss吸纳成为它的一个子项目。2005年3月,Hibernate 3发表,其中做了一些比较重大的改进。本文以Hibernate3为基础编写。

另外,Hibernate除了可以在J2EE容器中运行外,还可以运行在Java应用程序中。本文就是以Java应用程序为例来介绍它。

二、配置开发环境
    本文以一个Java应用程序(Java Application)为例,介绍如何使用Hibernate来进行数据库操作。
    在进行Hibernate开发之前,需要首先获得Hibernate类库、相应数据库的JDBC驱动类库。Hibernate类库可以从http://www.hibernate.org中下载,目前的版本是3.0。而JDBC驱动可以根据不同的数据库来选择,在这个例子中,使用的是Oracle数据库,那么相应的JDBC驱动可以从Oracle安装目录/ora92/jdbc下获得。其他的数据库请根据相关的说明获得。

下载Hibernate包后,可以将它解压到一个文件夹,此处假设为C:/hibernate-3.0,然后将C:/hibernate-3.0/下的hibernate.jar和C:/hibernate-3.0/lib下的那些第三方类库也放到环境变量CLASSPATH中。(通常,只需要dom4j、cglig、commons-logging、commons-collections、log4j、ehcache、asm、jta、antlr这些类库就可以了)

做完这些配置后,就可以在此基础上进行基于Hibernate的Java程序开发了。

三、开发基于Hibernate的应用
    现在假设我们在Oracle数据库中创建了一个表Student,它的字段如下表所示:

字段 说明

Student_ID 学员编号,整型,PK,自动增长
Student_Name 学员姓名,字符串类型
Student_Age 学员年龄,整型
如果我们在Oracle中定义这个数据库表,我们可以定义一个创建数据库表的SQL脚本如下:
create table Student(
Student_ID number(6) NOT NULL PRIMARY KEY,
Student_Name varchar2(10) NOT NULL,
Student_Age number(2) NOT NULL
);

另外,因为在Oracle中没有“自动增长”类型的字段,所以通常情况下我们需要定义一个sequence来作为自动增长类型字段的数据。在这里,我们也可以定义一个sequence来给Student_ID字段提供数据。创建sequence的SQL脚本如下:

CREATE SEQUENCE student_sequence
INCREMENT BY 1
START WITH 1000
NOMAXVALUE
NOCYCLE
CACHE 10;

我们在这里创建了一个student_sequence,准备用来作为Student_ID字段的值。

接着,我们需要一个hibernate.cfg.xml或者属性文件hibernate.properties来指定Hibernate所使用的数据库以及用户名、密码等其他相关的配置,我们在此使用xml文件,它的内容如下:

源文件:hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--程序执行的时候是否显示真正的sql语句-->
<property name="show_sql">true</property>
<!--使用的SQL对应的“方言”,此处是Oracle9的“方言”-->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect
</property>
<!--连接数据库的Driver-->
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<!--数据库连接url-->
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:nitpro
</property>
<!--用户名-->
<property name="connection.username">system</property>
<!--密码-->
<property name="connection.password">manager</property>
</session-factory>
</hibernate-configuration>

做完前面的这些准备工作后,下面就让我们进入激动人心的Hibernate编程吧!

首先,我们需要定义一个用于表示“学生”对象的Student类:

源文件:Student.java

public class Student
{
private int student_id;
private String student_name;
private int student_age; public int getStudent_id()
{
return student_id;
}
public String getStudent_name()
{
return student_name;
}
public int getStudent_age()
{
return student_age;;
}
public void setStudent_id(int id)
{
this.student_id = id;
}
public void setStudent_name(String name)
{
this.student_name = name;
}
public void setStudent_age(int age)
{
this.student_age = age;
}
}

这个类很简单,就是一个典型的JavaBean的定义:有三个属性:student_id、student_name和student_age,分别对应数据库表Student中的三个字段,并且在这个类中定义了对应各个属性的setter/getter方法。

接下来,我们需要给这个类定义一个XML映射文件“Student.hbm.xml”,文件内容如下:

源文件:Student.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="Student" table="Student">
<id name="student_id" column="student_id" type="java.lang.Integer">
<generator class="native">
<param name="sequence">student_sequence</param>
</generator>
</id>
<property name="student_name" column="Student_Name"
type="java.lang.String"/>
<property name="student_age" column="Student_Age"
type="java.lang.Integer"/>
</class>
</hibernate-mapping>

注意,在这个xml文件中,我们首先使用class元素定义了我们定义的Java类和数据库表之间的关系,在这里,我们定义的Java类和数据库表名称都是Student,然后,我们使用id元素定义了主键名称、类型等,它有一个子元素generator来说明主键的产生方式,此处指定的是“native”,表示根据数据库来选择,比如,对于Oracle数据库,它会去寻找一个sequence(默认情况下,它会去寻找一个名为“hibernate_sequence”的sequence),我们可以用参数param来指定一个sequence。而property用来指定Student.java类中的属性和Student数据库表之间的对应关系,以及各个字段的数据类型。在这个例子中,我们指定的数据类型是Java语言中的数据类型(此时需要指定引用类型数据),我们也可以使用Hibernate中自定义的数据类型,限于篇幅,在本文中不一一讲解。

然后,我们需要在hibernate.cfg.xml中加入这个文件的映射,可以在</session-factory>之前加入下面的语句:

<mapping resource="Student.hbm.xml"/>
最后,我们需要编写一个测试类来测试一下,能否通过Hibernate和前面我们定义的相关程序,完成对数据库的操作。我们编写一个测试类如下:
源文件:Test.java

import org.hibernate.*;
import org.hibernate.cfg.*;
public class Test
{
public static void main(String[] args)
{
try
{
//通过Configuration获得一个SessionFactory对象
SessionFactory sf
= new Configuration().configure().buildSessionFactory();
//打开一个Session
Session session = sf.openSession();
//开始一个事务
Transaction tx = session.beginTransaction();
//创建一个Student对象
Student stu = new Student();
//通过Student的setter方法改变它的属性
//注意student_id不用我们设置
stu.setStudent_name("zhangsan");
stu.setStudent_age(18);
//通过session的save()方法将Student对象保存到数据库中
session.save(stu);
//提交事务
tx.commit();
//关闭会话
session.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

编译并运行这个程序,如果前面的配置和程序都没有问题,应该可以正确的往数据库表Student中插入一条数据,并且在控制台上能够得到如下输出(只列出部分输出内容):

Hibernate: select student_sequence.nextval from dual
Hibernate: insert into Student (Student_Name, Student_Age, student_id) values (?,?,?)

可以看到,虽然我们自己没有编写SQL语句进行插入数据的操作,但是其实Hibernate还是要使用SQL语句来进行数据库的操作,只是这个过程对程序员来说是透明的。

通过这个简单的例子,相信读者对Hibernate编程已经有了初步的了解。读者可以在此基础上进行更深入的学习。

Hibernate 入门的第一个程序的更多相关文章

  1. Ext入门的第一个程序(1)

    1.Ext是什么? extjs是集UI和ajax框架与一身的,界面又好看,又有很强的ajax交互功能,适合不会做漂亮页面的程序员用的,缺点就是太大了,要导入近800KB左右的js和css文件,这对于w ...

  2. windows驱动编程入门(第一个程序)

    1. 工具 vc6.0 WINDDK 3790.1830 Dbgview 驱动加载工具InstDrv32位/64位中文版 2. 代码 first.c /// /// @file first.c /// ...

  3. 【 D3.js 入门系列 — 1 】 第一个程序 HelloWorld

    记得以前刚上大一学 C 语言的时候,写的第一个程序就是在控制台上输出 HelloWorld .当时很纳闷,为什么要输出这个.老师解释说所有学编程入门的第一个程序都是在屏幕上输出 HelloWorld, ...

  4. java第一个程序——Hello World

    Hello World 如果没有下载jdk以及配置环境变量的萌新请自行百度,教程非常的详细(参考:https://jingyan.baidu.com/article/6dad5075d1dc40a12 ...

  5. Hibernate入门(1)-第一个Hibernate程序

    Hibernate入门(1)-第一个Hibernate程序 Hibernate是最著名的ORM工具之一,本系列文章主要学习Hibernate的用法,不涉及Hibernate的原理.本文介绍第一个Hib ...

  6. SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  7. Hibernate第一个程序(最基础的增删改查) --Hibernate

    本例实现Hibernate的第一个程序,Hibernate的优点我想大家都很清楚,在这里不做过多赘述.总之,使用Hibernate对数据库操作,也就是来操作实体对象的! 项目目录: 一.第一步要做的就 ...

  8. Java入门——编写并运行第一个程序

    Java入门——编写并运行第一个程序 摘要:本文主要介绍如何使用Java语言编写并通过DOS运行简单的程序. 编写简单的程序 在D盘新建一个文本文档,输入如下代码: class Hello { pub ...

  9. hibernate入门之person表

    下面的hibernate入门person表指的是:根据mysql数据库中的test表和其中的元素-->建立映射表==>进而创建持久化类的顺序来操作了,下面为步骤 1.配置MySQL驱动程序 ...

随机推荐

  1. lucene建立索引的过程

    建立索引过程 用户提交数据=>solr建立索引=>调用lucene包建立索引 官方建立索引和查询索引的例子如下: http://lucene.apache.org/core/4_10_3/ ...

  2. .NET Framework 中的类型系统的两个基本点

    它支持继承原则. 类型可从称为基类型的其他类型派生. 派生类型继承基类型的方法.属性和其他成员(存在一些限制). 之后,基类型可从某些其他类型派生,这种情况下,派生类型继承其层次结构中这两个基类型的成 ...

  3. 13_FCITX输入法安装及问题排查解决

    使用linux最沮丧的事情莫过于中文输入法切换不出来,甚至有人错误地认为,要使用中文输入法,必须把“区域和语言”(Region & Language)设置为中国-中文.输入法只是一个软件,和区 ...

  4. javascript 中的nextSibling和previousSibling使用注意事项

    JavaScript中的nextSibling和previousSibling和作用类似于jquery的next()和prev(),都是获取下一个/上一个同胞元素,如果下一个同级节点不存在,则此属性返 ...

  5. win10开始菜单打不开的解决办法

    解决方法: 1.在Win10系统下按Win+R打开运行,输入services.msc回车打开服务: 2.在服务中找到User Manager服务;3.打开usermanager服务属性,将其启动类型设 ...

  6. android 调用系统相机

    // 调用相机拍照的请求码 public static final int REQUEST_TAKE_PHOTO_CODE = 1; public static final int REQUEST_T ...

  7. 解决spring mvc 上传报错,Field [] isn't an enum value,Failed to convert value of type 'java.lang.String[]' to required type '

    没有选择附件,但是点击上传按钮的时候会报错. 之前不选择文件,直接上传空文件是可以的,后来不知道改了什么就不行了. 错误信息: -- :: [http--] TRACE org.springframe ...

  8. js 刷新页面大全

    一.先来看一个简单的例子: 下面以三个页面分别命名为frame.html.top.html.bottom.html为例来具体说明如何做. frame.html 由上(top.html)下(bottom ...

  9. Python按行读取文件

    1:readline() file = open("sample.txt") while 1: line = file.readline() if not line: break ...

  10. 为UITableViewController瘦身

    在IOS开发中采用了MVC得模式,ViewController通常是最庞大的文件,里面包含了各种各样的大概,造成代码的复用率低下,可读性也降低,那么有什么办法来解决这个问题呢. 在创建Table的时候 ...