前一段时间对Struts2这个框架有了一点点地了解,很高兴,自己开始学习Hibernate这个框架了。本篇博文将记录下第一个Hibernate程序的搭建过程。其实有时候个人觉得无论我们学习什么语言也好,还是学习什么框架也好,第一个HelloWorld程序真的相当重要,假如 我们在学习第一个HelloWorld程序都跑不出来,这完全影响着我们对新接触的东西的兴趣和动力,但是,往往第一个程序都会涉及到很多的配置,因此使得对于初学者要摸索一定的时间,对于我也是如此,因为对于刚开始学习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的搭建也是主要参考这个文档来完成的.
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
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下,我将这个文件夹下所有的包都加入进去了。具体截图如下:
当上面的步骤完成之后,我们就可以在工程中引入这个
实体类中有几个属性: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 原理的情况下进行了改动就是自找麻烦。
内容如下,主要是参考了上面所提到的参考文档资料,然后进行一定的改动即可:
<?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 程序就成功了。
上面采用的是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