Hibernate学习之(一)ORM概述

Hibernate是一个高性能的对象/关系型持久化存储和查询的服务。主要完成Java类到数据库表的映射、Java类字段到数据表字段的映射以及Java类字段类型到数据库表字段类型的映射。也提供了数据查询和检索的服务。

ORM概述

什么是JDBC

JDBC代表Java Database Connectivity,它提供了一组Java API 来访问关系型数据库的Java应用程序。这些Java API 可以使Java应用程序执行SQL语句,能够与任何符合SQL规范的数据库进行交互。

JDBC提供了一个灵活的框架来编写操作数据库的独立的应用程序,该应用程序具有Java的跨平台特性,能够与不同的DBMS(数据库管理系统)进行交互

JDBC的优点和缺点

JDBC的优点 JDBC的缺点
干净整洁的SQL处理 大项目中使用很复杂
大数据下有良好的性能 很多的编程成本
对于小应用特别好 没有封装
易学的简易语法 难以实现MVC概念
速度比较快 查询需要指定DBMS

为什么要使用关系映射(ORM)?

我们工作在一个面向对象的系统中时,存在一个对象模型和关系数据库不匹配的问题。RDBMS(关系数据库管理系统)使用表格的形式存储数据,然而像Java这样的面向对象的语言表示一个对象关联图。例如一个带有构造函数和公有方法的Java类:

public class Employee{
    private Integer id;
    private String name;
    private int salary;
    public Employee(){
    }
    public Employee(String name, int salary){
        this.name = name;
        this.salary = salary;
    }
    //setter和getter
}

现在考虑将上面的对象存储和索引到对应的RDBMS表格中

create table employee(
        id int not null auto_increment primary key,
        name varchar(100) not null,
        salary int default null
    );

目前有以下两个问题

  • 第一、在开发应用程序的工程中需要修改数据库的设计该怎么办?
  • 第二、在关系型数据库中存储和索引对象时面临的不匹配问题…
不匹配 描述
粒度 有时会有一个对象模型,该模型的数量比数据库中关联的表的数量多
继承 关系型数据库中无法定义在面向对象语言中本来就有的继承
关联 面向对象的语言使用对象引用来表示关联,数据库使用外键表示关联
导航 在Java和数据库中访问数据的方式完全不同
身份 在数据库中使用主键来确定一条记录,在Java中定义对象判等(a==b)对象值判等(a.equals(b))

object-relational mapping(ORM)就是来解决上述不匹配问题的!

什么是ORM

ORM是一种方便在关系型数据库和面向对象编程语言中转换书籍的技术。一个ORM系统相比于普通的JDBC有如下优点:

序号 优点
1 使用业务代码访问对象而不是数据库的表
2 从面向对象逻辑中隐藏SQL查询的细节
3 基于JDBC的 “ under the hood”
4 没有必要去处理数据库实现
5 实现是基于业务的概念而不是数据库的结构
6 事务管理和键的自动实现
7 应用程序的快速开发

一个ORM解决方案有一下四个实体组成:

序号 优点
1 一个API在持久类的基础上实现基本的crud
2 一个语言或API来指定应用类的属性和查询
3 一个可配置的服务用来制定映射元数据
4 一个技术和事务对象交互执行dirty checking,lazy association fethcing 和其他优化功能

JavaORM框架

Java中有几个持久化的框架和ORM选项:

  • Hibernate
  • Mybatis
  • Toplink
  • Spring Dao
  • ….