Hibernate--快速上手
一、初识 Hibernate
经典的软件应用体系结构有三层:表示层(提供了与用户交互的接口,实现用户操作界面,展示用户需要的数据)、业务逻辑层(完成业务流程,处理表示层提交的数据请求,并将要保存的数据提交给数据库)、数据库层(存储需要持久化的业务数据,数据库独立于应用,它提供了系统状态的一种持久化表现形式)。为了使业务逻辑层的开发人员能够真正专注于业务逻辑开发,不纠缠于底层实现,可以把数据访问从业务逻辑中分离出来,形成一个新的、单独的持久化层。增加了持久层以后,三层就变成原来的四层。
对象关系映射(object relation map): 由面向对象基本理论知识可知,内存中的对象之间是存在关联和继承关系的,而在关系数据库中,数据之间无法直接表达多对多的关联和继承关系。为了将面向对象与关系数据库之间的差别屏蔽掉,使得开发人员能够以面向对象的思路来操作关系数据库,对象-关系映射组件就应运而生。本质是ORM是将数据的一种表现形式转换为另一种表现形式。
二、开发Hibernate项目,需要完成下面几步:
(1)准备开发环境,创建Hibernate项目
(2)在数据库中创建数据表
(3)创建持久化类
(4)设计映射文件,使用Hibernate映射文件将POJO(plain old java objective)对象映射到数据库。(一个POJO类不用继承任何类,也无需实现任何接口,它很像一个JavaBean,POJO类中包含与数据库表中相对应的各个属性,这些属性通过getter和setter方法来访问。
(5)编写Hibernate的配置文件Hibernate.cfg.xml
(6)编写辅助工具类HibernateUtils类,用来实现对Hibernate的初始化并提供获得Session的方法,此步可根据情况取舍。
(7)编写DAO层类
(8)编写Service类
(9)编写测试类
三、Hibernate的工作原理:
Hibernate开发过程中会用到5个核心接口:Configuration接口、SessionFactory接口、Session接口、Transaction接口以及数据查询的Query接口。以下是Hibernate进行持久化操作的主要步骤:
(1)Hibernate的初始化,创建configuration对象。
这一步读取XML配置文件和映射文件的信息到configuration对象的属性中。具体为:I、从Hibernate配置文件Hibernate.cfg.xml中读取配置信息,存放到Configuration对象(内存)中。II、根据配置文件中的mapping元素加载所有实体类对应的映射文件到configuration对象中。
(2)创建SessionFactory实例
通过configuration对象读取到的配置文件信息创建SessionFactory,即将Configuration对象内的配置信息存入SessionFactory的内存(属性)中。SessionFactory充当数据存储源的代理,并负责创建Session对象。得到SessionFactory对象后,configuration对象的使命就结束了。
(3)创建Session实例,建立数据库的连接
Session通过SessionFactory打开,创建一个Session对象就相当于与数据库建立了一个新的连接。Session对象用来操作实体对象,并把这些操作转换成对数据库中的数据的增加、删除、查询和修改操作。
(4)创建Transaction实例,开始一个事务。
Transaction用于事务管理,一个Transaction对象对应的事务可以包括多个操作,在使用Hibernate进行增加、删除和修改操作时必须先创建Transaction对象。
(5)利用Session的方法进行持久化操作。将实体对象持久化到数据库中。
(6)提交操作结果并结束事务。对实体对象的持久化操作结束后,必须提交事务。
(7)关闭Session,与数据库断开连接。
一个简单的Hibernate.cfg.xml配置文件
<?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>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mysqldb</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
编写一个辅助工具类HibernateUtil来处理Java应用程序中Hibernate的一些基本启动操作
package org.hibernate.entity;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil{
private static SessionFactory sessionFactory;
//创建线程局部变量threadLocal,用来保存Hibernate的Session
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
//使用静态代码块初始化hibernate
static{
try{
Configuration cfg = new Configuration().configure();//读取配置文件hibernate.cfg.xml
sessionFactory = cfg.buildSessionFactory();//创建SessionFactory
}catch(Throwable ex){
throw new ExceptionInitializerError(ex);
}
}
//获得SessionFactory实例
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
//获得ThreadLocal对象管理的Session实例
public static Session getSession()throws HibernateException{
Session session = (Session) threadLocal.get();
if(session==null||!session.isOpen()){ if(sessionFactory==null){
rebuildSessionFactory();
}
//通过SessionFactory对象创建Session对象
session = (sessionFactory!=null)?sessionFactory.openSession():null;
//将新打开的Session实例保存到线程局部变量threadLocal中
threadLocal.set(session);
}
return session; } //关闭Session实例
public static void closeSession()throws HibernateException{
Session session = (Session) threadLocal.get();
//从线程局部变量threadLocal中获取之前存入的Session实例
threadLocal.set(null);
if(session!=null){
session.close();
}
}
//重建SessionFactory
public static void rebuildSessionFactory(){
try{
configuration.configure(/hibernate.cfg.xml);
//读取配置文件hibernate.cfg.xml
sessionFactory = configuration.buildSessionFactory();
//创建SessionFactory
}catch(Exception e){
System.err.println("Error Creating SessionFactory");
e.printStackTrace();
}
}
//关闭缓存和连接池
public static void shutdown(){
getSessionFactory().close();
}
}
Hibernate--快速上手的更多相关文章
- Hibernate 快速上手操作入门
本文主要是从技术操作角度去介绍hibernate,并且简单描述如何快速的上手操作hibernate,用于作为与数据库的连接的持久层. 简单讲述一下hibernate究竟是什么,它有什么作用,在理解它的 ...
- Hibernate学习笔记(1)---hibernate快速上手与准备工作
持久层介绍 持久化:将内存中的数据保存在磁盘等存储设备中. 持久化对象:指已经存储在数据库护着磁盘的业务对象 经典的软件应用体系结构(三层结构) 在三层结构中,由于业务逻辑除了负责业务逻辑以外,还要负 ...
- Hibernate快速上手
一. Hibernate介绍 1. Hibernate简介 Hibernate是一个开放源码的对象-关系映射(ORM)框架,他对JDBC进行了轻量级封装,开发人员可以使用面向对象的编程思想来进行持久层 ...
- NHibernate3快速上手教程FluentNHibernate配置与DBHelper
很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...
- Spring Boot 揭秘与实战(一) 快速上手
文章目录 1. 简介 1.1. 什么是Spring Boot 1.2. 为什么选择Spring Boot 2. 相关知识 2.1. Spring Boot的spring-boot-starter 2. ...
- NHibernate3快速上手教程FluentNHibernate配置与DBHelper(已过期,有更好的)
很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- 快速上手Unity原生Json库
现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手
原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
随机推荐
- 15 款优化表单的 jQuery 插件
网页上的表单提供给用户的一种交互的方式,用户输入数据,提交到服务器,等待后续的处理.这些表单在我们浏览的网页中随处可见,也容易被我们忽略. 比如,“联系我们”页面会提供一个表单给用户填写他们的信息和想 ...
- Resource接口,及资源
Resource介绍 编码的时候,除了代码本身,我们还需要对外部的资源进行处理.例如:URL资源.URI资源.File资源.ClassPath相关资源.服务器相关资源(VFS等)等等. 而这些资源的处 ...
- Windows App开发之集成设置、帮助、搜索和共享
应用设置和应用帮助 "设置"合约 上一节中我们学习了怎样将应用设置保存到本地.这样的方式是通过在App内加入设置选项,这里另一种方式. 微软将其称为"设置"合约 ...
- 【转载】关于quartus ii软件中注释乱码问题的解决方法
最近在看Verilog代码,由于我的quartus版本打开他们的文件注释会全部乱码,痛苦万分!从网上找了下原因,解决方法基本没有,不过看到有人提出是编码的问题,立马我就想到一个解决方法,经过实验果然有 ...
- python改动文件内容,不须要read,write多个动作。
python 要改动文件内容,经常使用 是先read.后write , 再 rename.非常不爽. 比方:须要 把 yuv_dir ="../HD/" # &q ...
- 4 kafka集群部署及kafka生产者java客户端编程 + kafka消费者java客户端编程
本博文的主要内容有 kafka的单机模式部署 kafka的分布式模式部署 生产者java客户端编程 消费者java客户端编程 运行kafka ,需要依赖 zookeeper,你可以使用已有的 zo ...
- app服务端server端数据库设计
- css之导航菜单的制作
通过设置<a>的背景改变样式,通过a:hover改变交互效果,改变文字颜色color 纵向 <!DOCTYPE html> <html> <head lang ...
- jquery 中的回调函数,回调函数(callback)是什么?
知乎上果然大牛比较多 大神解释如下: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里, ...
- 第四章 Spring.Net 如何管理您的类___对象、对象工厂和应用程序上下文
在前面一章我们介绍了依赖注入,控制反转的概念,以及自己动手搭建了一下Spring.Net的环境.通过这些操作,我们知道了Spring.Net 的核心是使用依赖注入或控制反转这种思想来管理业务对象,降低 ...