hibernate简单介绍
1. Hibernate是什么?
hibernate是 轻量级的 ORM 框架。
ORM全称object/relationmapping [对象/关系映射]。
Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供数据查询和获取数据的方法。能够大幅度降低开发时人工使用SQL和JDBC处理数据的时间。
Hibernate的目标是对于开发人员通常的数据持久化相关的编程任务,解放当中的95%。对于以数据为中心的程序来说,它们往往仅仅在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方式;对于那些在基于Java的中间层应用中。它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最实用的。
Hibernate能够帮助你消除或者包装那些针对特定厂商的SQL代码,而且帮你把结果集从表格式的表示形式转换到一系列的对象去。
1.1. orm是什么?
对象关系映射(ObjectRelation Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说。ORM是通过使用描写叙述对象和数据库之间映射的元数据。将java程序中的对象自己主动持久化到关系数据库中。本质上就是将数据从一种形式转换到第二种形式。使用orm技术(hibernate是当中最为流行的)能够在java程序以类和对象的方式去操控数据库表和记录。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAyMjgxMjg0OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
1.2. pojo是什么?
在使用hibernate时。要求和数据库的某张表相互映射的那个java类,是一个POJO类,一般放在com.xxx.domain包下,POJO类翻译过来就是:简单的Java对象(Plain Ordinary Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来。
一个POJO类应当具有:
1) 有一个主键属性,用于唯一标识该对象。(这就是为什么hibernate设计者建议要映射的表须要一个主键)
2) 有其他的属性
3) 有对各个属性操作的get/set方法
4) 属性通常是private修饰
5) 一定有一个无參的构造函数(用于hibernate框架反射用.)
在POJO有一些private的參数作为对象的属性。然后针对每一个參数定义了get和set方法作为訪问的接口。比如:
public class User { private long id; private String name; public void setId(long id) { this.id = id; } public void setName(String name) { this.name=name; } public long getId() { return id; } public String getName() { return name; } } |
POJO对象有时也被称为Data对象,大量应用于表现现实中的对象。
2. 为什么要用Hibernate?
1) 引入hibernate能够使工作人员角色细化,让程序猿更关心业务流程。
让数据库人员关注数据库相关的各种操作。
2) 分层更清晰,耦合性更小。
3) 通用性强:能够更轻松的从一个数据库平台转移到别的平台。
4) 对象化:把关系数据库变成了Java的对象。更加方便操作。
5) 性能保证:hibernate可能按不同的数据库,处理不同的操作是用最优化的SQL语句,不用我们去想,对于分等算法。在hibernate中会显得更简单,可靠。
6) 添加了程序的鲁棒性!
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAyMjgxMjg0OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
3. hibernate体系结构
一个很简要的hibernate体系结构的概要图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAyMjgxMjg0OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
从这个图能够看出hibernate使用配置信息和数据向应用程序提供持久化服务。
“Hibernate执行时体系结构最小”的体系结构方案。要求应用程序提供自己的 JDBC 连接并管理自己的事务。这样的方案使用了Hibernate API 的最小子集。
“全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来,而让Hibernate来处理这些细节。
Ø SessionFactory (org.hibernate.SessionFactory)针对单个数据库映射关系经过编译后的内存镜像。是线程安全的(不可变)。它是生成Session的工厂,本身要用到ConnectionProvider。
Ø Session (org.hibernate.Session)表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期非常短。隐藏了JDBC连接,也是Transaction的工厂。
Ø Transaction (org.hibernate.Transaction)应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期非常短。它通过抽象将应用从底层详细的JDBC、JTA以及CORBA事务隔离开。
Ø ConnectionProvider (org.hibernate.connection.ConnectionProvider)生成JDBC连接的工厂(有连接池的作用)。
它通过抽象将应用从底层的Datasource或DriverManager隔离开。仅供开发人员扩展/实现用,并不暴露给应用程序使用。
Ø TransactionFactory (org.hibernate.TransactionFactory)生成Transaction对象实例的工厂。
仅供开发人员扩展/实现用。并不暴露给应用程序使用。
4. Hibernate入门案例
开发环境:
1) eclipse Luna Release (4.4.0)
2) mysql 5.0
3) hibernate 4.3
开发过程例如以下:
1) 使用eclipse新建java webproject。命名为hello_hbm
2) 引入hibernate所必须的jar(从官网下载后,取其文件夹下/lib/required下全部jar文件)
3) 引入mysql驱动jar包
4) 在src下新建hibernate配置文件: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> <!-- Database connection settings --> <!-- 驱动名 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 指定jdbc连接池的个数 --> <property name="connection.pool_size">1</property> <!-- 指定用什么数据库 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 是否显示sql语句 --> <property name="show_sql">true</property> <!-- 自己主动创建表 --> <property name="hibernate.hbm2ddl.auto">create</property> <mapping resource="com/morris/model/UserModel.hbm.xml" /> </session-factory> </hibernate-configuration> |
5) 在com.morris.model下新建pojo类UserModel,该类有三个属性。其它方法为geter,seter两个构造函数,还有重写了父类object的equals和hashCode方法:
package com.morris.model; public class UserModel { private String userId; private String userName; private Integer age; public UserModel() { super(); // TODO Auto-generated constructor stub } public UserModel(String userId, String userName, Integer age) { super(); this.userId = userId; this.userName = userName; this.age = age; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((age == null) ? 0 : age.hashCode()); result = prime * result + ((userId == null) ? 0 : userId.hashCode()); result = prime * result + ((userName == null) ? 0 : userName.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; UserModel other = (UserModel) obj; if (age == null) { if (other.age != null) return false; } else if (!age.equals(other.age)) return false; if (userId == null) { if (other.userId != null) return false; } else if (!userId.equals(other.userId)) return false; if (userName == null) { if (other.userName != null) return false; } else if (!userName.equals(other.userName)) return false; return true; } @Override public String toString() { return "UserModel [userId=" + userId + ", userName=" + userName + ", age=" + age + "]"; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } |
6) 在com.morris.model下新建配置文件UserModel.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="com.morris.model"> <!-- class name=类名 table=数据库的表名 id name=类的属性 column=表的主键列名 generator=自己指定 --> <class name="UserModel" table="user"> <id name="userId" column="userId"> <generator class="assigned" /> </id> <property name="userName" column="userName" /> <property name="age" column="age" /> </class> </hibernate-mapping> |
7) 编写測试类Test.java
package com.morris.model; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class Test { public static void main(String[] args) { // 读取配置文件,得到Configuration对象 Configuration config = new Configuration().configure(); // 获得会话工厂 SessionFactory sf = config.buildSessionFactory(); Session session = sf.openSession(); Transaction tx = null; try { // 開始事务 tx = session.beginTransaction(); UserModel userModel = new UserModel("002", "morris", 22); // 保存对象 session.save(userModel); // 提交事务 tx.commit(); } catch (Exception e) { e.printStackTrace(); if (tx != null) { tx.rollback(); } } finally { session.close(); } } } |
执行结果例如以下图所看到的。
后台打印sql:
Hibernate:create table user (userId varchar(255) not null, userName varchar(255), ageinteger, primary key (userId))
Hibernate:insert into user (userName, age, userId) values (?, ?, ?
)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAyMjgxMjg0OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
hibernate简单介绍的更多相关文章
- Hibernate体系结构的简单介绍
Hibernate体系结构的简单介绍 1.SessionFactory: 单个数据库映射关系经过编译后的内存镜像,是线程安全的.它是生产Session的工厂,本身需要依赖于ConnectionPeov ...
- Hibernate学习(1)简单介绍
1.什么是Hibernate? 首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等 ...
- 史上最简单的Hibernate入门简单介绍
事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate ...
- SQLite数据库和JPA简单介绍
SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLit ...
- Hibernate的介绍
1.什么是Hibernate? 首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等等. 而且Hiber ...
- 简单介绍Struts2
Struts2概述 Struts2虽然是Struts1的基础上发展起来的,但是实质上是以WebWork框架为核心,为传统的Struts1注入了WebWork的设计理念,统一了Struts1和WebWo ...
- SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)
SQL 数据库 学习 007 通过一个示例简单介绍什么是字段.属性.列.元组.记录.表.主键.外键 (上) 我们来介绍一下:数据库是如何存储数据的. 数据库是如何存储数据的 来看一个小例子 scott ...
- JSR 303 - Bean Validation 简单介绍及用法
一.JSR-303简单介绍 JSR-303 是 JAVA EE 6 中的一项子规范.叫做 Bean Validation,官方參考实现是Hibernate Validator. 此实现与 Hibern ...
- 简单介绍几种Java后台开发常用框架组合
01 前言 Java框架一直以来都是面试必备的知识点,而掌握Java框架,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能对当前正在开发中的系统有整体的认知,从而更好的熟悉和学习技术,这篇 ...
随机推荐
- UDP包结构
UDP包结构 // 参考: http://www.2cto.com/net/201307/224715.html UDP数据包由首部和数据组成,每行4个字节(32位),首部固定长度为8个字节(2行) ...
- ssh "openssh-daemon is stopped"操作之伤+sftp访问“-bash: /dev/null: Permission denied”
1.ssh "openssh-daemon is stopped"操作之伤 原来好好的 sshd服务突然发现 不能重新启动了: [root@bogon rules.d]# ser ...
- Clojure学习05:谓词函数
谓词函数是一个判断式,一个返回bool值的函数. clojure中(lisp习惯)有个规定:对于判断功能的函数,函数名后面都有一个“?”号.所以只要看到后面带问号的函数名,就知道这一定是一个判断函数. ...
- html中事件处理中的this和event对象
在用js编写页面事件处理代码时,会经常涉及到this和event对象,但有时在采用不同的事件处理,尤其是在与自定义的对象关联时,这些对象的指向变的有些复杂. 本文来详细介绍下各种场景下 这些对象 真正 ...
- cocos2dx进阶学习之CCEGLView
继承关系 CCEGLView-> CCEGLViewProtocol CCEGLView是窗口,在不同平台上有不同的实现,而CCEGLViewProtocol是CCEGLView定义的接口,所以 ...
- Pencil OJ 02 安装
Mongo 官方的安装方法 官方教程已经很好啦,这里就不罗嗦了. 源码编译 待补.我是从这里看到的. 遇到的问题 启动时的警告信息 2015-03-06T21:01:15.526-0800 I CON ...
- Mybatis3 框架理解
最近工作比较闲,维护一个政府机关的短信发送平台,大部分业务逻辑都在Oracle数据库上,但自己明明应聘的是Java开发啊!!!整天写存储过程的我还是有一颗写高级语言的心啊!!!好吧!!!先找个数据库方 ...
- c++ - Create empty json array with jsoncpp - Stack Overflow
python中multiprocessing.pool函数介绍_正在拉磨_新浪博客 multiprocessing.pool c++ - Create empty json array wit ...
- Ubuntu 12.04 (10) Personal Environment - @staticor
Chinese Input ================= I use Wubu, so Fcitx, sudo add-apt-repository ppa:fcitx-team/nightly ...
- c# winform 弹出确认消息框判断是否删除?
if (MessageBox.Show("确认删除?", "此删除不可恢复", MessageBoxButtons.YesNo) == DialogResult ...