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 ...
随机推荐
- [mysql] 随机查询 效率比较
select primary_count as primaryCount, primary_score as primaryScore, junior_count as juniorCount, ju ...
- MapReduce调度与执行原理系列文章
转自:http://blog.csdn.net/jaytalent?viewmode=contents MapReduce调度与执行原理系列文章 一.MapReduce调度与执行原理之作业提交 二.M ...
- qt 窗口控件自动调整大小
/******************************************************************** * qt 窗口控件自动调整大小 * * 在写gui的时候,希 ...
- Apache HttpComponents 学习
基本上,用户常用的就是HttpClient:它基于Http Core部分,但 Core部分太过于 low level,不建议使用,除非有特殊需要. Apache HttpComponentsTM 项目 ...
- e650. 激活事件
An object wishing to fire item events must implement ItemSelectable. This example shows typical code ...
- 类加载器详解 (转至http://blog.csdn.net/jiangwei0910410003/article/details/17733153)
首先来了解一下字节码和class文件的区别: 我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程的 ...
- JMeter使用记录2 -- Web測试
Web測试用例 新建线程组.配置起3线程,循环1次.1秒启动全部线程.进行login.循环1个主要页面的读写,并对另外一个主要页面进行读操作,最后logout并在aggregate graph/gra ...
- 做asp.net的在别人眼中都是渣渣吗?
做asp.net的在别人眼中都是渣渣吗?
- Centos6.8/7.0搭建Git服务http访问方式
安装Git版本:git 2.10.0 Git访问方式:基于http的基本验证(非SSL) 1. 安装Apache软件: [root@localhost ~]# yum install httpd 设置 ...
- js点击标签时获取当前标签属性值
document.body.onclick=function(){ var obj = document.elementFromPoint(event.clientX,event.clientY); ...