首页 > 【转】通过Hibernate将数据 存入oracle数据库例子

【转】通过Hibernate将数据 存入oracle数据库例子

一、 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安装目录ora92jdbc下获得。其他的数据库请根据相关的说明获得。

    下载Hibernate包后,可以将它解压到一个文件夹,此处假设为C:hibernate-3.0,然后将C:hibernate-3.0下的hibernate.jar和C:hibernate-3.0lib下的那些第三方类库也放到环境变量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


 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">



 



  true

 

org.hibernate.dialect.Oracle9Dialect



 



oracle.jdbc.driver.OracleDriver



 



jdbc:oracle:thin:@localhost:1521:nitpro



 

system



  manager

 


    做完前面的这些准备工作后,下面就让我们进入激动人心的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




     PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

     

             

                     

                     

                student_sequence

           


       
         

       
 type="java.lang.String"/>

       
type="java.lang.Integer"/>

   


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

    然后,我们需要在hibernate.cfg.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编程已经有了初步的了解。读者可以在此基础上进行更深入的学习。

转载于:https://www.cnblogs.com/sdu-Jumper/p/5707901.html

更多相关:

  • 一、一对多 以班级Classes和学生Student为例: 回忆sql语句: //内链接,两种方式效果一样,查询的是两边都有的数据SELECT c.*,s.* FROM classes c,student s WHERE s.cid=c.cid;SELECT c.cname,s.sname FROM classes c INNER...

  • 英语的重要性,毋庸置疑!尤其对广大职场人士,掌握英语意味着就多了一项竞争的技能。那,对于我们成人来说,时间是最宝贵的。如何短时间内在英语方面有所突破,这是我们最关心的事情。英语学习,到底有没有捷径可以走,是否可以速成?周老师在这里明确告诉大家,英语学习,没有绝对的捷径走,但是可以少走弯路。十多年的教学经验告诉我们,成功的学习方法可以借...

  • 展开全部 其实IDLE提供了一个显32313133353236313431303231363533e78988e69d8331333365663438示所有行和所有字符的功能。 我们打开IDLE shell或者IDLE编辑器,可以看到左下角有个Ln和Col,事实上,Ln是当前光标所在行,Col是当前光标所在列。 我们如果想得到文件代码...

  • 前言[1]从 Main 方法说起[2]走进 Tomcat 内部[3]总结[4]《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spri...

  • 【本文摘要】【注】本文所述内容为学习Yjango《学习观》相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用。阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英语学习方面,我们的症结所在。学习英语这类运动类知识,需要把握四个原则第一,不要用主动意识。第二,关注于端对端第三,输入输出符合实际情况第四,通过多个例子...

  • 点云PCL免费知识星球,点云论文速读。文章:RGB-D SLAM with Structural Regularities作者:Yanyan Li , Raza Yunus , Nikolas Brasch , Nassir Navab and Federico Tombari编译:点云PCL代码:https://github.co...