hibernate初体验
简介:
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
下载Hibernate:
到Hibernate官网:http://www.hibernate.org/ 或 http://sourceforge.net/ 上都能下载到最新版本的Hibernate。
初探Hibernate
通过如下小实例演示如何使用hibernate操作数据库(增删改查等)。你会发现,在java代码中基本看不到对数据库作操作的jdbc语句或sql语句,这些都同hibernate来完成,用户只需要关心业务的实现。
参考手册:
hibernate_reference.pdf 下载地址:http://docs.jboss.org/hibernate/core/3.6/reference/zh-CN/pdf/hibernate_reference.pdf 虽说是中文版的,可是翻译不是很完整,而且是3.6版的,不过影响不大,本文以这个手册作为参考。
或者可以使用线上版的http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html_single/ hibernate4.2版,全英文。
环境介绍:
开发工具IDE: | Eclipse Java EE IDE for Web Developers. |
jdk版本 | jdk1.7 |
hibernate版本 | hibernate-release-4.2.5.Final |
数据库 | oracle11g |
如下数据库表,表名student:
一、搭建Hibernate的使用环境
- 我们这里建立Java Project。例如:HelloHibernate。
- 引入hibernate所需要的jar包。解压下载好的hibernate-release-4.2.5.Final.zip。打开解压后的文件夹,打开lib,把required目录下的jar包全引入到项目中。(以上是hibernate4所要导入的jar包,hibernate3所需要的jar包如下:根目录下的hibernate3.jar,lib->required目录下所有的jar包,依赖包:log4j-1.2.16.jar、commons-lang-2.3.jar、slf4j-log4j12-1.5.8.jar)
- 引入数据库驱动包。
二、创建实体类
接下来我们创建一个实体类,用来对应数据库的student表。Student.java代码如下:
package accp.hibernate; import java.util.Date; public class Student {
private int id;
private String name;
private Date birthDay;
//省略get,set方法……
}
可以看到Student类中的属性都对应着student表中的字段,上面代码省略了get和set方法,要让hibernate操作该属性,必须要提供get和set方法。(该段可以参考 hibernate_reference.pdf 第四章 持久化类(Persistent Classes))
三、映射文件
Hibernate 需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是 Hibernate 映射文件发挥作用的地方。映射文件告诉 Hibernate 它应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。
映射文件放在和相应实体类同一包下。命名为 Student.hbm.xml。代码如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="accp.hibernate">
<class name="Student" table="Student">
<id name="id" column="id">
<generator class="native"/>
</id> <property name="name" type="java.lang.String" column="name"/>
<property name="birthDay" type="java.util.Date" column="birthday"/>
</class>
</hibernate-mapping>
元素简介:
hibernate-mapping | package属性:指需要被持久化的类所位于哪个包。 |
class |
在 hibernate-mapping 标签(tag)之间, 含有一个 class 元素。所有的持久化实体类都需要一个这样的映射,来把类对象映射到SQL 数据库里的表。name属性:实体类名。table:对应的表名。 |
id | 对主键属性的声明。name:实体类中代表主键的字段名。column:表中的主键名。 |
generator |
嵌套在 id 元素中的 generator 元素指定标识符的生成策略(也就是标识符值是怎么产生的)。在这个例子里,我们选择 native,它提供了取决于数据库方言的可移植性。(可参考hibernate_reference.pdf 第 28 章 数据库移植性考量,第4节. 标识符的生成) |
property |
需要持久化属性的声明。默认情况下,类里面的属性都被视为非持久化的。和 id 元素一样,property 元素的 name 和 column 属性告诉 Hibernate 实体类属性和表字段的对应关系。 |
(该段可以参考 hibernate_reference.pdf 第五章 对象/关系数据库映射基础(Basic O/RMapping))
四、Hibernate 配置
此时,你应该有了持久化类和它的映射文件。现在是配置 Hibernate 的时候了。在项目的src目录下创建 hibernate.cfg.xml 文件,代码如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory>
<!-- 数据库连接 -->
<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">news</property>
<property name="connection.password">news</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</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>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<!-- 显示sql语句 -->
<property name="show_sql">true</property>
<!-- 引入映射文件 -->
<mapping resource="accp/hibernate/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
<property name="connection.driver_class"> | 所使用的JDBC驱动类全称 |
<property name="connection.url"> | 数据库连接字库串 |
<property name="connection.username"> | 数据库的用户名 |
<property name="connection.password"> | 数据库的密码 |
<property name="dialect"> | Hibernate SQL 方言。可参考下面 Hibernate SQL 方言表 |
<mapping> | resource属性指定映射文件的路径 |
Hibernate SQL 方言表(部分)
DB2 | org.hibernate.dialect.DB2Dialect |
DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
MySQL5 | org.hibernate.dialect.MySQL5Dialect |
MySQL5 with InnoDB | org.hibernate.dialect.MySQL5InnoDBDialect |
Oracle 9i | org.hibernate.dialect.Oracle9iDialect |
Oracle 10g | org.hibernate.dialect.Oracle10gDialect |
Sybase | org.hibernate.dialect.SybaseASE15Dialect |
Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
(本段可以参考 hibernate_reference.pdf 第三章 配置)
五、编写测试类
编写Test.java类,实现使用hibernate往数据库内插入一条数库。代码如下:
package accp.hibernate; import java.util.Date; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; public class Test {
public static void main(String[] args) {
//创建实体对象
Student s = new Student();
s.setName("张三");
s.setBirthDay(new Date());
//得到session
Configuration cfg = new Configuration().configure();
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
//开始事务
Transaction transaction = session.beginTransaction();
session.save(s); //插入数据
transaction.commit(); //事务提交
session.close();
}
}
其中第17-19行得到session的代码是hibernate3的写法,在hibernate4中也能正常运行,但会报方法已过时的警告。解决方法,把17-19行的代码换成下面的代码:
Configuration cfg = new Configuration().configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sf = cfg.buildSessionFactory(sr);
Session session = sf.openSession();
程序运行后可以看到控制台打印出如下SQL语句:
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into Student (name, birthday, id) values (?, ?, ?)
这是由hibernate自动生成,可以看到hibernate还自动生成了一个名为hibernate_sequence的序列,用来作为自增长的主键。sql语句发出的同时数据库也增加了相应的数据。
hibernate初体验的更多相关文章
- Hibernate初体验及简单错误排除
Hibernate是什么,有多少好处,想必查找这类博文的都知道,所以就不多说了.下面是我对Hibernate简单使用的一个小小的总结.与君(主要是刚入门的)共勉吧! 创建的顺序 创建Hibernate ...
- Hibernate 初体验
为什么会产生 Hibernate Mybatis 这类的dao层框架 传统的jdbc 虽然执行速度很快,但是开发效率很低,随着面向对象开发的设计思想,在面向对象编程中 将对象 进行持久化,存入关系型的 ...
- hibernate初使用
准备工作,安装及配置Hibernate http://zhoualine.iteye.com/blog/1190141 在产生数据库表映射 Java 对象时,我增加了数据库中的两张表分别为Chatlo ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- hibernate--CRUD初体验
hibernate的crud操作初体验. 看具体实例 package com.fuwh.model; import javax.persistence.Column; import javax.per ...
- SSH初体验系列--Hibernate--2--crud操作
Ok,今天比较详细的学习一下hibernate的C(create).R(read).U(update).D(delete) 相关api... 前言 Session: 是Hibernate持久化操作的基 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
随机推荐
- react-native 环境配置及hello world
一.前言 最近手头的工作繁多,有研究性的项目和系统研发,正好遇到同事离职,接手了框架的UI组件,不仅需要维护和填坑,还需要开发新的功能组件.因为身在H5-Hybird的框架部门,最近团队开始尝试使用R ...
- Oracle官方版Entity Framework
千呼萬喚始出來! Oracle官方版Entity Framework問市,邁入開發新時代 自從我得了一種"不用LINQ就不會寫資料庫程式"的病,為了滿足工作上要搭配Oracle(雖 ...
- 如何在美国公司写project plan 邮件--以hadoop安装和Mahout数据分析为例子
Hi, XXX (boss name) Project Title: Hadoop installation and Data analysis based on Mahout Deliverabl ...
- .net web api 一
web api可以提供方便简单可靠的web服务,可以大量的用于不需要提供复杂的soap协议的环境,以简单明了的形式返回数据,在不太复杂的环境中web api可以做为wcf等重级web服务的一种可替代方 ...
- 在IIS上Office Word下载失败,检索 COM 类工厂中 CLSID 为000209FF的组件失败,80070005 拒绝访问。
最近在做一个网站时,有一个下载word文档功能,在本地直接调试是可以下载的,但部署到IIS上就出现问题了. 出现问题如下:Error:下载简历方法出错:检索 COM 类工厂中 CLSID 为 {000 ...
- Oracle 11g完全卸载(Windows)(转)
Oracle 11g完全卸载(Windows) 1.关闭oracle所有的服务.可以在windows的服务管理器中关闭: 一般有以下服务: (1)Oracle SID VSS Writer ...
- 《C++ Primer Plus 6th》读书笔记 - 第十一章 使用类
1. 运算符重载 2. 计算时间:一个运算符重载示例 3. 友元 1. 友元有三种: 友元函数 友元类 友元成员函数 4. 重载运算符:作为成员函数还是非成员函数 5. 再谈重载:一个矢量类 6. 类 ...
- CDZSC_2015寒假新人(1)——基础 a
Description Contest time again! How excited it is to see balloons floating around. But to tell you a ...
- Android 使用网络ADB调试.
前提: android Phone和PC在同一局域网内. android Phone 有虚拟终端(CM系统集成了ADB网络调试,比较赞.); 1.在android phone虚拟终端输入 stop a ...
- 为TL-WR720N编译带mentohust和njit-client的openwrt固件
openwrt的trunk版已经支持720N了.简单好多. 首先下载openwrt源码,我下的是trunk版 svn co svn://svn.openwrt.org/openwrt/trunk/ 然 ...