Hibernate,大部分开发者的第一个ORM框架?

前言

上篇分析了CRUD过程,借助JDBC直接操作SQL语句。虽然能达到效果,但总感觉写起来有点繁琐,既然是在Java的世界,那CRUD能否面向对象编程呢?
当然可以,轮到ORM出场了。
通过本篇文章,你将了解到:

  1. ORM 是什么?
  2. Hibernate 操作数据库
  3. Hibernate 与JDBC 关系
  4. 小结

1. ORM 是什么?

ORM是Object-Relational Mapping(对象关系映射)的缩写,是一种编程技术,用于在面向对象语言(如 Java)和关系型数据库(如 MySQL、PostgreSQL)之间自动转换数据。
一言概之:

将数据库表映射为类,将数据库行映射为对象,将字段映射为属性。

如此一来,我们只需要操作对象无需操作具体的SQL语句。

假设我们有一个数据库表名为:hi_user
映射为Java 类:HiUser

它字段如下:


image.png

那么id/password/phone/username 就可以作为HiUser的属性:

public class HiUser {
    private Long id;

    private String username;

    private String password;

    private String phone;
}

当需要往hi_user表里插入一条数据时可作如下操作:

  1. 创建HiUser对象,将对象里的各个属性赋值
  2. 保存对象到数据库
image.png

此时表里有三条数据,对应的是三个HiUser对象。

我们没有写任何SQL语句,也仅需两步操作即可完成往数据库添加数据的功能,实际上背后的工作都是由ORM框架完成。

Java常见的ORM框架:


image.png

本次,我们主要分析Hibernate。

2. Hibernate 操作数据库

接下来分析在IDEA里如何添加和使用Hibernate。

首先,在pom.xml里添加依赖。

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.32.Final</version>
        </dependency>

其次,编辑Hibernate配置文件。

image.png

该文件里主要是设置:数据库地址、驱动、数据库账号、密码、表映射的实体类等。
注意此处的文件位置和文件名是固定的,无需更改。

再然后,初始化Hibernate Session工厂,后续的session都是通过工厂构造。

sessionFactory = new Configuration().configure().buildSessionFactory();

最后,就到了CRUD阶段了。
以HiUser为例,定义类结构:

@Entity
@Table(name = "hi_user")
public class HiUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "phone")
    private String phone;
  
}

@Entity 表示该类为数据库表映射
@Table 表示该类映射的数据库表名
@Column 表示类属性映射的数据表字段名

有了类和对象,就可以进行CRUD了。

  1. 插入数据:
    public void saveUser(HiUser user) {
        Transaction transaction = null;
        try (Session session = sessionFactory.openSession()) {
            transaction = session.beginTransaction();
            session.save(user);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }

构造好HiUser实体,调用session.save方法即可。

  1. 查询数据:
    public List<HiUser> getUsers() {
        long startTime = System.currentTimeMillis();
        try (Session session = sessionFactory.openSession()) {
            List<HiUser> list = session.createQuery("from HiUser", HiUser.class).list();
            System.out.println("getUsers time: " + (System.currentTimeMillis() - startTime));
            return list;
        }
    }

此处createQuery 执行的是HQL(Hibernate Query Language)语句。
"from HiUser"里的HiUser对应的是要查询的表对应的类。
HQL使用类名和属性名查找数据。
SQL使用表名和字段名查找数据。

  1. 编辑数据
    public void updateUser(HiUser user) {
        Transaction transaction = null;
        try (Session session = sessionFactory.openSession()) {
            transaction = session.beginTransaction();
            session.update(user);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }
  1. 删除数据
    public void deleteUser(HiUser user) {
        Transaction transaction = null;
        try (Session session = sessionFactory.openSession()) {
            transaction = session.beginTransaction();
            session.delete(user);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }

可以看出,以上的CRUD我们都是在操作对象,并且使用的方法名也直观地表示出要做的动作。这就是ORM框架的核心,将对象和数据库映射起来。
同时我们也注意到,上述操作涉及到了事务。

事务(Transaction) 是用于控制数据库操作的一组逻辑单元,确保数据在执行增删改等操作时满足 ACID 特性(原子性、一致性、隔离性、持久性)。

以deleteUser为例:
先开启事务,再执行delete操作,最后提交事务,如果删除失败,那么就回滚事务,当做什么都没发生。
其它的操作流程类似。

3. Hibernate 与JDBC 关系

JDBC:

JDBC(Java Database Connectivity) 是 Java 提供的一组接口和类,用于连接和操作数据库。
它是最基础的数据库访问方式,直接使用 SQL 语句进行操作

Hibernate:

Hibernate 是一个 ORM(对象关系映射)框架,它在 JDBC 上层封装,将 Java 对象与数据库表自动映射。
开发者无需编写 SQL,而是通过操作 Java 对象来间接操作数据库。

两者关系如下图:


image.png

4. 小结

最后展示一个Hibernate CRUD 实战的例子:


my_hibernate.gif

完整工程请点击:点我跳转

下篇我们将通过servlet+hibernate+jsp 来阐述最原始的MVC理念,敬请期待。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容