《Hibernate学习笔记一》:第一个程序的搭建

Hibernate学习笔记:第一个程序的搭建

前一段时间对Struts2这个框架有了一点点地了解,很高兴,自己开始学习Hibernate这个框架了。本篇博文将记录下第一个Hibernate程序的搭建过程。其实有时候个人觉得无论我们学习什么语言也好,还是学习什么框架也好,第一个HelloWorld程序真的相当重要,假如 我们在学习第一个HelloWorld程序都跑不出来,这完全影响着我们对新接触的东西的兴趣和动力,但是,往往第一个程序都会涉及到很多的配置,因此使得对于初学者要摸索一定的时间,对于我也是如此,因为对于刚开始学习Hibernate这个框架的时候,我并不清楚要添加哪些库文件,因此我需要参考一些博客和视频,才能更好的完成第一个程序的搭建工作,只有在我们成功地搭建好了第一个程序之后,我们就为我们后面的学习做好的准备,在后面的学习中我们就不需要担心添加哪些库文件呀,需要哪些配置呀 等等工作。本篇博文就是对Hibernate的第一个程序的搭建的所有过程的一个建立,希望对刚学习Hibernate的你有所帮助

废话不多说,开始干正事。

第一个Hibernate程序的搭建

相信在学Hibernate的你在前段时间一定学习过Java这门语言,因此一定有Java的编译环境以及我们常见的IDE,即一定使用过eclipse/MyEclipse等IDE,如果没有使用,就需要下载。

下面就假设你有Java相关的开发环境(JDK,IDE)。

在开始介绍之前,先提供一个参考文档:Hibernate3.1.2在线中文帮助文档,这个文档有着很好的参考价值,也有第一个Hibernate 应用程序的搭建过程:http://www.jq-school.com/Show.aspx?id=321。本人第一个Hibernate的搭建也是主要参考这个文档来完成的.

1、准备工作

a、在Hibernate官网下载Hibernate发布包,链接为:http://hibernate.org/orm/downloads/,下载后解压到相应的文件夹中,里面涉及到的一些Jar包将会为我们所用。我下载的是和ibernate-release-5.1.0.Final 这个版本。

b、数据库驱动包,JDBC Driver要根据你用的database来定,一般database官方网站上都会有。Hibernate支持常用的database,比如 MySQL, Oracle, PostgreSQL, 和MS-SQL Server。这些数据库都有JDBC Driver:

我自己下载的是MySQL数据库的Driver 。

Oracle JDBC Driver下载地址(下载前必须同意Oracle协议书)
http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

MySQL JDBC Driver下载地址
http://dev.mysql.com/downloads/connector/j/3.0.html

PostgreSQL JDBC Driver下载地址
http://jdbc.postgresql.org/download.html

MS-SQL Server JDBC Driver下载地址
http://www.microsoft.com/downloads/details.aspx?FamilyID=9f1874b6-f8e1-4bd6-947c-0fc5bf05bf71&displaylang=en

2、新建工程,添加Jar包

1)、我使用的IDE是MyEclipse ,打开MyEclipse,新建一个Java Project,我这里的工程取名为:HelloWorld_Hibernate,然后添加相应的Jar包。

怎么添加Jar包呢??

添加Jar包主要有两个方法,第一种方法为:点击项目—>Build Path—>Add External JARS;由于hibernate 有许多Jar需要添加,并且这些Jar包都是属于hibernate的,因此,我们就将其放在一起,然后引入工程这样才是最好的。这也就是第二种方法。

具体步骤如下:

window—>Java—->Build Path —->User Libraries —>new ,这样就新建了一个文件夹(我这里新建的文件夹为:hibernate),然后在这个夹 ,点击Add External JARS 中添加Jar包,需要添加的Jar包在hibernate解压后的lib/required下,我将这个文件夹下所有的包都加入进去了。具体截图如下:

当上面的步骤完成之后,我们就可以在工程中引入这个

实体类 Student

实体类中有几个属性:id name age,并为这些属性配上get/set 方法。

package com.hibernate.model;
    public class Student {
    private int id;
    private String name;
    private int age;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。构造器(constructor)的访问级别可以是private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是package 级别的访问控制

在数据库中创建表与实体类对应

这里我们采用的是自己创建表,我们也可以要Hibernate 帮我们创建。
在下面即将要介绍的配置文件hibernate.cfg.xml文件中:

<!--  属性hbm2ddl.auto 可选值有:create|update|drop-create|invalide 
        create  每次都会给你新建一个表,因此存在数据丢失
        update  当你的实体类中添加或删除了其他的属性,即将导致相应的表结构发生变化,因此会更改表的结构
        invalide  即对象关系映射的检查。
        -->
<property name="hbm2ddl.auto">create</property> 

Hibernate配置 hibernate.cfg.xml 配置文件

Hibernate 的配置文件名字叫 hibernate.cfg.xml,不要对此名字进行改动,在我们不懂Hibernate 原理的情况下进行了改动就是自找麻烦。

内容如下,主要是参考了上面所提到的参考文档资料,然后进行一定的改动即可:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hibernate</property>  <!--  hibernate为数据库名称 -->
        <!--  数据库的用户名和密码 -->
        <property name="connection.username">root</property>
        <property name="connection.password">123456789</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect 主要看你使用的是那种数据库 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
       <!-- <property name="hbm2ddl.auto">create</property> --> 
        <!-- Student类与表Student的映射关系 -->
        <mapping resource="com/hibernate/model/Student.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

创建映射文件

上面虽然我们建立了实体类的数据库表,但是我们还没有建立关联,即映射。

一个映射文件的基本结构看起来像这样 :

<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

    <hibernate-mapping>
    [...]
    </hibernate-mapping>

在我们的项目中,映射文件Student.hbm.xml文件内容如下:

<?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.hibernate.model">
    <class name="Student" table="Student"> <!-- 如果我们不写table,则默认表名与类名一致 -->
        <!-- 主键 -->
        <id name="id" column="id">
            <!-- 主键的生成策略 -->
            <generator class="native"/>
        </id>
        <!-- 其他属性,name对应实体类的属性,column对应关系型数据库表的列 -->
        <property name="name"  column="name"/>
        <property name="age"/>
    </class>
    </hibernate-mapping>

    <!-- 这样就将Student类和表Student关联在一起了 -->

测试类

待上面的工作完成之后,我们就可以建立一个测试类来进行测试了。测试类StudentTest的代码如下 :

package com.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hibernate.model.Student;

public class TestStudent {

    public static void main(String[] args) {
        Student s=new Student();        
        s.setId(1);
        s.setName("wu");
        s.setAge(19);
        //下面为固定格式的代码,即先获取Session ,然后跳用Session 的save方法。
        Configuration cfg=new Configuration();
        SessionFactory sf=cfg.configure().buildSessionFactory();
        Session session=sf.openSession();
        session.beginTransaction();
        session.save(s);
        session.getTransaction().commit();
        session.close();
        sf.close();
    }

}

测试结果在数据库中的结果 如下 :

这就说明我们的第一个Hibernate 程序就成功了。

用Annotation来创建第一个程序

上面采用的是xml配置文件的方式来创建实体类与数据库表的对应关系,下面就用Annotation的方式来创建第一个程序。

下面我们又创建一个实体类Teacher。

内容如下:

package com.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Teacher {
    private int id;
    private String name;
    private String title;
    @Id
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

}

从上面的代码中可以看到@Entity /@Id 等注解,利用这种方式我们就不需要写实体类和数据库表的映射文件了。

hibernate.cfg.xml文件的内容如下,与第一种方式的区别在于添加了这样一行代码:

<mapping class="com.hibernate.model.Teacher"/>

详细内容如下:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hibernate</property>  <!--  hibernate为数据库名称 -->
        <!--  数据库的用户名和密码 -->
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect 主要看你使用的是那种数据库 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
       <!-- <property name="hbm2ddl.auto">create</property> --> 
        <!-- Student类与表Student的映射关系 -->
        <mapping resource="com/hibernate/model/Student.hbm.xml"/>

        <mapping class="com.hibernate.model.Teacher"/>

    </session-factory>

</hibernate-configuration>

测试文件与TestStudent 一样,如下:

package com.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.hibernate.model.Teacher;

public class TestTeacher {

    public static void main(String[] args)  throws Exception{
        Teacher t=new Teacher();
        t.setId(1);
        t.setName("wuranghao");
        t.setTitle("professior");

        Configuration cfg=new Configuration();
        SessionFactory sf=cfg.configure().buildSessionFactory();
        Session session=sf.openSession();
        session.beginTransaction();
        session.save(t);
        session.getTransaction().commit();
        session.close();
        sf.close();
    }

}

同样当我们运行之后,在数据库表中查询的结果如下:

参考资料

1、blog :http://blog.csdn.net/doodoofish/article/details/43207/

2、http://www.jq-school.com/hibernate/html/tutorial.html#tutorial-firstapp

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值