一、 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将数据 存入oracle数据库例子的更多相关文章

  1. 利用TOAD实现把EXCEL数据导入oracle数据库

    利用TOAD实现把EXCEL数据导入oracle数据库 工具:   Toad11.7z(百度搜索,直接下载) 1.将Excel文件中某些字段导入到Oracle数据库的对应表 连接想要导入的数据库 ,然 ...

  2. 批量Excel数据导入Oracle数据库

    由于一直基于Oracle数据库上做开发,因此常常会需要把大量的Excel数据导入到Oracle数据库中,其实如果从事SqlServer数据库的开发,那么思路也是一样的,本文主要介绍如何导入Excel数 ...

  3. FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG

    发现FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG,提交的表名大小写是敏感的. 只要有一个表名字母的大小写不匹配,ORACLE就会认为是一个不认 ...

  4. Java使用iBatis批量插入数据到Oracle数据库

    Java使用iBatis批量插入数据到Oracle数据库 因为我们的数据跨库(mysql,oracle),单独取数据的话需要遍历好多遍,所以就想着先从mysql数据库中取出来的数据然后在oracle数 ...

  5. 代码执行批量Excel数据导入Oracle数据库

    由于基于Oracle数据库上做开发,因此常常会需要把大量的Excel数据导入到Oracle数据库中,其实如果从事SqlServer数据库的开发,那么思路也是一样的,本文主要介绍如何导入Excel数据进 ...

  6. 懒要懒到底,能自动的就不要手动,Hibernate正向工程完成Oracle数据库到MySql数据库转换(含字段转换、注释)

    需求描述 需求是这样的:因为我们目前的一个老项目是Oracle数据库的,这个库呢,数据库是没有注释的,而且字段名和表名都是大写风格,比如 在代码层面的po呢,以前也是没有任何注释的,但是经过这些年,大 ...

  7. ODP方式,大批量数据写入ORACLE数据库

    项目中在同步数据的时候,需要把获得的数据DataTable,写入oracle数据库 因为System.Data.OracleClient写入方式写入大批量数据特别慢,改用Oracle.DataAcce ...

  8. 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒

    链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...

  9. Hibernate 连接MySQL/SQLServer/Oracle数据库的hibernate.cfg.xml文件

    用Hibernate配置连接数据库可以方便我们对POJO的操作,节省了很多时间和代码.下面就分别说明连接不同数据库需要在hibernate.cfg.xml做的配置. 需要数据库驱动包可以点击这里下载: ...

随机推荐

  1. Cordova环境搭建 & HelloWorld

    目前的手机APP有三类:原生APP,WebAPP,HybridApp:HybridApp结合了前两类APP各自的优点,越来越流行. Cordova就是一个中间件,让我们把WebAPP打包成Hybrid ...

  2. [转]python 常用类库!

    Python学习 On this page... (hide) 1. 基本安装 2. Python文档 2.1 推荐资源站点 2.2 其他参考资料 2.3 代码示例 3. 常用工具 3.1 Pytho ...

  3. vuex 使用笔记

    1. 在store.js中 储存数据状态 02. 在action.js中分发行为 03. 在页面中获取并使用状态

  4. struts2笔记(3)

    关于回显: 如果是int型,默认就会回显为0,如果不想让回显,则Integer就好 //**************************************声明式验证************* ...

  5. 关于.NET知识体系结构图总结

    转载:关于.NET知识体系结构图总结-零度http://www.xcode.me/book/net-framework-maps 最近对.NET框架方面的知识进行了概要的总结,整理了一些知识体系结构图 ...

  6. STL源码学习----lower_bound和upper_bound算法

    转自:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html 先贴一下自己的二分代码: #include <cstdio&g ...

  7. APM程序分析-ArduCopter.cpp

    该文件是APM的主文件. #define SCHED_TASK(func, rate_hz, max_time_micros) SCHED_TASK_CLASS(Copter, &copter ...

  8. code first提示已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭解决方法

    使用codefirst查询当然是必不可少的,但有时不小心可能很简单的查询也会导致异常. 下面用codefirst做个示例简单演示下异常发生的场景: var attendlist = db.Databa ...

  9. asp.net 网页中播放 flash 和flv

    需求:在网页中播放powerpoint保存的pps文件和mp4文件 经过查阅:发现网页上直接播放pps文件比较麻烦(office web apps server),所以通过工具,将pps文件转换为sw ...

  10. QT_地图导航

    //地图显示功能 #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QGraphicsView> #include <QLabel& ...