Hibernate----初识
一、Hibernate概述
1、Hibernate(开放源代码的对象关系映射框架)
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO[普通Java实体类]与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Hibernate英文原意为“冬眠”,因而引申为“数据持久化存储”之意。它是2001年出现的。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
JDBC就是一种持久化机制。文件IO也是一种持久化机制。但很多时候,数据并不是用IO存储于文件,而使用JDBC进行数据库操作,又存在很多冗余,如:各种JDBC语句,connection的管理,所以出现了Hibernate把JDBC封装了一下,框架简化了繁琐的操作。
简单说,Hibernate就是一个框架,对JDBC底层操作进行了包装,很容易实现Java实体类对象对应于数据库关系表的记录,实现Java实体对象的存储,这极大的加快了Java Web的引用开发。该框架关注的是:普通Java对象[数据]怎么存进去,怎么查询取出来,使得操作更方便。
2、提到框架,先来认识一下什么是框架?
1.框架框架不可直接运行,它是一个应用程序的半成品。
2.框架提供可重用的公共模块。
3.通过配置开发适用不同应用的系统。
4.利用框架进行开发,就像组装汽车;因为框架约定了事务处理逻辑,相当于制定了规则,如果要使用框架,就必须按规则来。
5.框架有很多种,不同的框架解决不同的问题.如SSH三大框架,Netty、Lucene、Solr都在不同的问题域展现各自的优势。
但无论框架有多少更新,所有框架基本都做了2件事:把繁琐的过程简单化,把处理流程规范化。就像Hibernate一样,把Java实体对象到数据库关系表中的记录通过配置文件映射,繁琐的JDBC数据库存储对象的操作简单化了;框架制定的规则使得处理的逻辑规范化。除此之外,很多框架都对相对底层的繁琐操作进行了包装,对外提供更易用、更方便的接口可以有效提高框架使用者的开发。但是,框架也有局限性,框架约定了“规则”,使用框架进行开发提高效率是没错,但是必须遵守“框架制定的规则”,这也造成很多时候,并不能像使用底层代码那样自由灵活。
二、环境搭建
你需要Java SDK、 Hibernate包、JDBC Driver数据库驱动、Eclipse(JavaEE版本eclipse-jee-mars-2-win32-x86_64.zip)或MyEclipse。
1、Hibernate包下载地址:
http://download.csdn.net/detail/ljheee/9625583
2、连接数据库的驱动
http://download.csdn.net/detail/ljheee/9625612
当然要在电脑上安装一个数据库,首当推荐使用MySQL。
3、Eclipse
eclipse-jee-mars-2-win32-x86_64.zip这个版本的Eclipse是支持动态Web工程的,如果要使用Hibernate,还需要在Eclipse中安装一个插件。这个步骤很简单,在有网络条件下,打开Eclipse,选择工具栏菜单help---->Eclipse Marketplace,然后在搜索框搜索Hibernate,选JBoss Tools,点击安装即可自动完成。如下图:
当然这里默认的大家都已配置好Java JDK等基础环境。可参阅:http://blog.csdn.net/ljheee/article/details/50810570
三、Hibernate核心接口和类
Hibernate的核心类和接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心类和接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口和类分别加以介绍。
1、Session
Session接口负责执行被持久化对象的CRUD[数据库增删改查]操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。此处Hibernate的Session可理解为一个数据库连接[用它可完成数据库操作];而HttpSession对象称为用户session,是用户的一次交互。
2、SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
3、Transaction
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate的设计者自己写的底层事务处理代码。 Transaction接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
4、Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。Query经常被用来查询所有,条件查询以及分页查询。
5、Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询---。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。它常用于用于模糊查询。
6、Configuration
Configuration 类的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration类在整个Hibernate项目中只扮演着一个很小的角色,但它是启动hibernate时所遇到的第一个对象。这是相对较老的方式,现在有便捷方式创建SessionFactory。目前已有5.2的版本。
由上图可以看出Hibernate核心内容,其中核心接口和类的关系。
四、Hibernate包的作用
net.sf.hibernate.* ----该包的类基本上都是接口类和异常类
net.sf.hibernate.cache.* ----JCS的实现类
net.sf.hibernate.cfg.* ----配置文件读取类
net.sf.hibernate.collection.* ----Hibernate集合接口实现类,例如List,Set,Bag等等,Hibernate之所以要自行编写集合接口实现类是为了支持lazy loading
net.sf.hibernate.connection.* ----几个数据库连接池的Provider
net.sf.hibernate.dialect.* ----支持多种数据库特性,每个Dialect实现类代表一种数据库,描述了该数据库支持的数据类型和其它特点,例如是否有AutoIncrement,是否有Sequence,是否有分页sql等等
net.sf.hibernate.eg.* ----Hibernate文档中用到的例子
net.sf.hibernate.engine.* ----这个包的类作用比较散
net.sf.hibernate.expression.* ----HQL支持的表达式
net.sf.hibernate.hq.* ----HQL实现
net.sf.hibernate.id.* ----ID生成器
net.sf.hibernate.impl.* ----最核心的包,一些重要接口的实现类,如Session,SessionFactory,Query等
net.sf.hibernate.jca.* ----JCA支持,把Session包装为支持JCA的接口实现类
net.sf.hibernate.jmx.* ----JMX是用来编写App Server的管理程序的,大概是JMX部分接口的实现,使得App Server可以通过JMX接口管理Hibernate
net.sf.hibernate.loader.* ----也是很核心的包,主要是生成sql语句的
net.sf.hibernate.lob.* ----Blob和Clob支持
net.sf.hibernate.mapping.* ----hbm文件的属性实现
net.sf.hibernate.metadata.* ----PO的Meta实现
net.sf.hibernate.odmg.* ----ODMG是一个ORM标准,这个包是ODMG标准的实现类
net.sf.hibernate.persister.* ----核心包,实现持久对象和表之间的映射
net.sf.hibernate.proxy.* ----Proxy和Lazy Loading支持
net.sf.hibernate.ps.* ----该包是PreparedStatment Cache
net.sf.hibernate.sql.* ----生成JDBC sql语句的包
net.sf.hibernate.test.* ----测试类,你可以用junit来测试Hibernate
net.sf.hibernate.tool.hbm2ddl.* ----用hbm配置文件生成DDL
net.sf.hibernate.transaction.* ----Hibernate Transaction实现类
net.sf.hibernate.type.* ----Hibernate中定义的持久对象的属性的数据类型
net.sf.hibernate.util.* ----一些工具类,作用比较散
net.sf.hibernate.xml.* ----XML数据绑定
五、Hibernate优缺点
优点:
1、封装JDBC,使操作更加对象化
以对象化的思维操作数据库,我们只需要操作对象就可以了,开发更加对象化。
2、移植性
因为Hibernate做了持久层的封装,你就不知道数据库,你写的所有的代码都具有可复用性。
3、Hibernate是一个没有侵入性的框架,没有侵入性的框架我们称为轻量级框架。
对比Struts的Action和ActionForm,都需要继承,离不开Struts。Hibernate不需要继承任何类,不需要实现任何接口。这样的对象叫POJO对象。
4、Hibernate代码测试方便。
5、提供可重用的公共模块,提高效率,提高生产力。
缺点:
1、使用数据库特性的语句,将很难调优。
2、对大批量数据更新存在问题。
3、系统中存在大量的攻击查询功能。
4、大量的配置文件(XML)的编写问题
六、ORM框架概念
ORM(Object Relational Mapping)框架采用元数据来描述对象----关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
只要提供了持久化类[Java实体类]与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有四种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink。
ORM是通过使用描述对象和数据库之间映射的元数据,在我们想到描述的时候自然就想到了xml和特性(Attribute).目前的ORM框架中,Hibernate就是典型的使用xml文件作为描述实体对象的映射框架,而大名鼎鼎的Linq则是使用特性(Attribute)来描述的。
对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
面向对象[Java实体类]是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的。两者之间是不匹配的,而ORM作为项目中间件形式实现数据在不同场景下数据关系映射,对象关系映射(Object Relational Mapping)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM就是这样而来的。
当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层[DAL]的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。对于每个对象都要重复的写这些代码。除此之外,还有更好的办法吗?有,引入一个ORM。实质上,一个ORM会为你生成DAL。与其自己写DAL代码,不如用ORM。你用ORM保存,删除,读取对象,ORM负责生成SQL语句,你只需要关心对象就好。
由上图可以看出,ORM在面向对象的实体类与关系型数据库之间扮演的角色。
实体对象到数据库关系表中记录的映射
通过ORM很容易实现一个实体对象保存为关系表中的一条记录,其中的关系通常使用XML文件映射实现。
常见的ORM框架
Hibernate
iBATIS
Apache ObJect
RelationalBridge (OJB)
Java Data Objects (JDO)
Oracle TopLink
Java Persistence API
Torque
Castor
Apache Cayenne
后续文章将继续分享Hibernate相关应用工程。
Hibernate----初识相关推荐
- hibernate mysql 多表查询_查询hibernate表程序
Hibernate初识 简介 相信学过SSH2框架的同学们对Hiberate一点也不陌生.Hibernate是Gavin King于2001年开始,作为EJB2风格实体bean的替代品开发的对象关系映 ...
- Java学习之路(基础到高级200讲)
(由于合同未续,视频课程已被下线,可到另一个平台观看对应的视频教程) https://www.yingyinyi.com/site/view/57171.html 对应博客有300余篇基础到高级的文章 ...
- FreeMarker制作模板并使用
html模板demo制作: 导入jar包,修改pom.xml 新建resources文件夹和java文件夹 resources文件夹用于存放ftl模板文件 java文件夹用于存放java文件 再res ...
- 初识hibernate小案例
使用hibernate前需要导入相关JAR包. 1.它可以接受词文法语言描述,并能产生识别这些语言的语句的程序 2.是一个Java的XML API,类似于jdom,用来读写XML文件的 3.支持注解配 ...
- 初识Hibernate之关联映射(一)
上篇文章我们对持久化对象进行的学习,了解了它的三种不同的状态并通过它完成对数据库的映射操作.但这都是基于单张表的操作,如果两张或者两张以上的表之间存在某种关联,我们又该如何利用持久化对象进行操作呢?本 ...
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
这篇博客是hibernate学习的第一篇,主要简单介绍hibernate框架,之后简单说一下hibernate的目录结构,最后写一个简单的hibernate实例.通过这三步来简单的认识一下hibern ...
- 初识Hibernate 缓存
生活就像一杯咖啡,让你我慢慢的品尝,品尝它的苦涩和甘甜...... 一.什么是Hibernate缓存. 解析:白话来说就是缓存数据的容器 官方标准点缓存:是计算机领域的概念,它介于应用程序和永久性数据 ...
- 初识Hibernate——关系映射
Hibernate的主要目的就是是Java程序员可以随心所欲的使用对象编程思维来操纵数据库.所以,一些数据库表的关系我们应该可以通过hibernate实现,比如在数据库中我们厂用的用到的主外键关系,还 ...
- springdatajpa之初识hibernate(一)
springdata jpa springbootjpa 默认采用hibernate实现,只要springboot引入了jpa就把hibernate作为一个实现 hibernate 和 jpa 关系 ...
- 基于按annotation的hibernate主键生成策略
这里讨论代理主键,业务主键(比如说复合键等)这里不讨论. 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id ...
最新文章
- JS如何深度复制对象和数组,避免指针变量引用修改值
- 容器化方案Docker的使用方法
- 人工智能:看看BAT三巨头怎么说
- Ubuntu 10.10(64位)编译Android 2.3
- 内核堆栈 用户堆栈_弹性堆栈介绍
- Linux下编译运行Go程序
- ant-build.xml打包报错解决方法
- Feature flag,一个让软件发布轻松不掉发的神技
- 计算机编程的计算法,计算方法
- Python-1-基础
- special word count
- asp毕业设计——基于asp+access的工资管理系统设计与实现(毕业论文+程序源码)——工资管理系统
- comsol服务器的性能如何,COMSOL Server
- excel做ns流程图_如何制作传统流程图和NS流程图教程详解.ppt
- 特斯拉又起火燃烧,一人死亡!公司又处于负面新闻中,马斯克到底有多难?
- Python爬虫 使用Selenium爬取腾讯招聘信息
- 第②波 | 纯福利,无套路资源分享~
- 数据模型建设-维度建模详解
- 计算机应用数学 教材,计算机应用数学(第2版)
- FPGA中的LUT LUTRAM BRAM DSP FF
热门文章
- ubuntu的pycharm或程序卡主,强制关闭方法
- python 发包的方法_有没有快一点的Python扫描发包方法,原来的速度好慢
- 泽风大过:改过自新;坎为水:坦然面对
- imgaug quokka_Quokka CMS的新功能和Beta版路线图
- 这几个插件,让你的 vscode 更牛逼!
- 解决 VMware 中安装虚拟机时屏幕显示不全的问题
- 我的python程序_我试着运行我的python程序,但当我运行它时什么也没有发生
- Shiro实现用户认证和授权
- 利用Tensorflow构建RNN并对序列数据进行建模
- python scrapy框架 抓取的图片路径打不开图片_Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码...