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简单介绍的更多相关文章

  1. Hibernate体系结构的简单介绍

    Hibernate体系结构的简单介绍 1.SessionFactory: 单个数据库映射关系经过编译后的内存镜像,是线程安全的.它是生产Session的工厂,本身需要依赖于ConnectionPeov ...

  2. Hibernate学习(1)简单介绍

    1.什么是Hibernate?           首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等 ...

  3. 史上最简单的Hibernate入门简单介绍

    事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate ...

  4. SQLite数据库和JPA简单介绍

    SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLit ...

  5. Hibernate的介绍

    1.什么是Hibernate? 首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等等. 而且Hiber ...

  6. 简单介绍Struts2

    Struts2概述 Struts2虽然是Struts1的基础上发展起来的,但是实质上是以WebWork框架为核心,为传统的Struts1注入了WebWork的设计理念,统一了Struts1和WebWo ...

  7. SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)

    SQL 数据库 学习 007 通过一个示例简单介绍什么是字段.属性.列.元组.记录.表.主键.外键 (上) 我们来介绍一下:数据库是如何存储数据的. 数据库是如何存储数据的 来看一个小例子 scott ...

  8. JSR 303 - Bean Validation 简单介绍及用法

    一.JSR-303简单介绍 JSR-303 是 JAVA EE 6 中的一项子规范.叫做 Bean Validation,官方參考实现是Hibernate Validator. 此实现与 Hibern ...

  9. 简单介绍几种Java后台开发常用框架组合

    01 前言 Java框架一直以来都是面试必备的知识点,而掌握Java框架,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能对当前正在开发中的系统有整体的认知,从而更好的熟悉和学习技术,这篇 ...

随机推荐

  1. Aqua Data Studio 查询结果中文乱码

    菜单条里[文件]-[选项]会弹出个选项对话框 然后选[一般]  在右边的[外观]以下找到[网格结果字体] 将字体类型改成宋体即可了 watermark/2/text/aHR0cDovL2Jsb2cuY ...

  2. 【转】linux挂载新硬盘,开机自动挂载

    [转]linux挂载新硬盘,开机自动挂载 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ Linux的硬盘识别: 2.6 kernel以后,linux会将 ...

  3. ThinkPHP - 自动创建 + 自动验证 + 自动完成

    自动创建:创建数据模型. $User->create(); 自动验证:验证提交的表单数据. protected $_validate = array( array('verify','requi ...

  4. iOS弹出底部视图简单实现

    - 项目基本目录 其中xib文件用来自定义需要弹出的视图. 在主控制器里设置popview的frame等信息代码如下: 底部视图(popview)初始化放在父类视图的最顶部或者说是整个屏幕的最底部,宽 ...

  5. 毕业论文endnote使用

    毕业论文的参考文献的标准格式,参考了一下文章 http://blog.sina.com.cn/s/blog_62a1f43801016fq5.html http://blog.csdn.net/zhe ...

  6. 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器

    小猪猪C++笔记基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始 ...

  7. 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)

    中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中 ...

  8. BZOJ 3626: [LNOI2014]LCA( 树链剖分 + 离线 )

    说多了都是泪啊...调了这么久.. 离线可以搞 , 树链剖分就OK了... -------------------------------------------------------------- ...

  9. Android有效解决加载大图片时内存溢出的问题

    首先,您需要了解一下,图片占用内存的计算方法,传送门:http://blog.csdn.net/scry5566/article/details/11568751 尽量不要使用setImageBitm ...

  10. 单实例支撑每天上亿个请求的SSDB

    SSDB 是一个 C++ 开发的 NoSQL 存储服务器, 支持 zset, map 数据结构, 可替代 Redis, 特别适合存储集合数据. SSDB 被开发和开源出来后, 已经在生产环境经受了3个 ...