• 编写你的第一个Hibernate程序


    一、 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
    <!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语句来进行数据库的操作,只是这个过程对程序员来说是透明的。

  • 相关阅读:
    20140322 卡迪夫城VS利物浦,拔出重剑,有惊无险
    20140316 曼联VS利物浦,罗杰斯的小九九,当4312对上4231
    『看球笔记』20140217 红军足总杯遭枪手2-1淘汰 ,胜负手在哪?
    『看球笔记』20140208利物浦VS阿森纳,十字重剑与蜜蜂飞舞
    『看球笔记』20131230切尔西vs利物浦,赛后复盘聊聊球
    Full scan vs index 执行计划的实验
    『看球笔记』利物浦0:1南安普顿,罗杰斯,你的牌技太差了
    无题
    开源啦!安卓版起床资讯闹钟,丰富大家早晨起床的android应用,评论过十就开了。
    开源啦!Android版语音天气闹钟
  • 原文地址:https://www.cnblogs.com/chinatefl/p/1408355.html
Copyright © 2020-2023  润新知