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框架,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能对当前正在开发中的系统有整体的认知,从而更好的熟悉和学习技术,这篇 ...
随机推荐
-
UILabel实现自适应高宽
UILabel是iOS开发常用的控件.UILabel的属性需要了解,UILabel的特殊显示效果也需要我们掌握.UILabel自适应高宽度是很多初学者遇到的技术性难题.比如段文字,要让他完全地分行显示 ...
-
第一个 Asp.Net vNext 应用程序
要说免费的虚拟主机的话,最好的服务商应该就是Microsoft Azure(不是Windows Azure由世纪互联运营),提供免费的1GB .NET/Java/Python/Php空间,日流量有限制 ...
-
Oracle(+)号用法
Oracle左连接.右连接.全外连接以及(+)号用法 Oracle 外连接(OUTER JOIN) 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应S ...
-
实战Google深度学习框架-C3-TensorFlow入门
第三章:TensorFlow入门 TensorFlow存在计算模型,数据模型和运算模型(本文用TF代表TensorFlow) 3.1 计算模型-计算图 3.1.1 计算图的概念 TensorFlow这 ...
-
PE 添加系统管理员账号(域控可加)转
使用U盘制作一个PE系统,这里推荐老毛桃或者大白菜:开机进入Bios,选择U盘启动:进入U盘启动画面后,选择一个PE系统:进入PE系统后,我们去本机系统盘,将 C:/Windows/System32/ ...
-
Python基础01_介绍_HelloWorld
首先,当然是python的版本了,老师讲课学习都是以python3为主, 我的centos中还是python2.6.6 然后参照老师的教程升级到了2.7.14 谢谢! 平时主要练习3的,有时间的情况下 ...
-
Java并发编程(1)-Java内存模型
本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...
-
Java for循环和foreach循环的性能比较
就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了? 两种循环的语法格式: 普通for循环语法: for (int i = 0; i ...
-
[js]面向对象编程
一.js面向对象基本概念 对象:内部封装.对外预留接口,一种通用的思想,面向对象分析: 1.特点 (1)抽象 (2)封装 (3)继承:多态继承.多重继承 2.对象组成 (1)属性: 任何对象都可以添加 ...
-
UML_01_画图工具
一.推荐工具 1.processon 在线画图,类型丰富 www.processon.com 2.StarUML staruml.io 破解方法 StarUML 3.0.2 (Crack + Keyg ...