一篇文章让你马上入门Hibernate

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一篇文章让你马上入门Hibernate

在前面我们学完了Struts2,接下来我们就要去学习第二个框架Hibernate。
那什么是Hibernate?
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲地使用对象编程思维来操纵数据库,Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。
顺带介绍一下什么是ORM。
ORM:对象关系映射,是一种程序技术,简单来说就是把我们程序中的实体类和数据库表建立起来对应关系。
那为什么要有对象关系映射呢?
假设一下,当你开发一个应用程序的时候,你可能会写不少数据访问层的代码,用来从数据库保存、删除、读取对象信息等等。你在DAO中写了很多的方法来读取对象数据,改变状态对象等等任务,而这些代码很多都是重复的。
对象映射关系赋予了程序一种强大的能力,让开发者仅仅掌握面向对象的思维来操作数据库,即在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。

HelloWorld

关于Hibernate的一些基本知识了解完之后,我们来编写一个Hibernate的入门项目。
首先我们得编写hibernate的配置文件,在src目录下新建hibernate.cfg.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 配置连接数据库的基本信息 -->
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql:///test</property>

        <!-- 配置hibernate的基本信息 -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <!-- 执行操作时是否在控制台打印sql -->
        <property name="show_sql">true</property>

        <!-- 是否对sql进行格式化 -->
        <property name="format_sql">true</property>

        <!-- 指定自动生成数据表的策略 -->
        <property name="hbm2ddl.auto">update</property>

        <!-- 指定关联的.hbm.xml文件 -->
        <mapping
            resource="com/itcast/hibernate/helloworld/Account.hbm.xml" />
    </session-factory>
</hibernate-configuration>

这里面就是配置一些相关的信息。
然后我们创建一个Bean类Account:

package com.itcast.hibernate.helloworld;

public class Account {
   
   

    private Integer id;
    private String name;
    private double money;

    public Account() {
   
   

    }

    public Account(String name, double money) {
   
   
        this.name = name;
        this.money = money;
    }

    public Integer getId() {
   
   
        return id;
    }

    public void setId(Integer id) {
   
   
        this.id = id;
    }

    public String getName() {
   
   
        return name;
    }

    public void setName(String name) {
   
   
        this.name = name;
    }

    public double getMoney() {
   
   
        return money;
    }

    public void setMoney(double money) {
   
   
        this.money = money;
    }

    @Override
    public String toString() {
   
   
        return "Account [id=" + id + ", name=" + name + ", money=" + money + "]";
    }
}

接下来我们需要创建对象关系映射的配置文件,在与该类同级的目录下新建Account.hbm.xml文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 使Account类对应数据表ACCOUNT -->
    <class name="com.itcast.hibernate.helloworld.Account" table="ACCOUNT">
        <!-- id标签中的name为类中的属性名;colum标签中的name为数据表中的列名 -->
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <!-- 指定主键的生成方式     native:使用数据库本地的方式-->
            <generator class="native" />
        </id>
        <!-- property表示非id的其它列 -->
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="money" type="double">
            <column name="MONEY" />
        </property>
    </class>
</hibernate-mapping>

简单地配置一下,该配置文件目的是使类和表进行一个映射。
然后我们编写一下测试代码:

        // 1、创建一个SessionFactory对象
        SessionFactory sessionFactory = null;
        // 1)、创建Configuration对象:对应hibernate的基本配置信息和对象关系映射信息
        // 默认关联的是hibernate.hbm.xml文件,如果你的配置文件名是hibernate.hbm.xml,使用无参构造即可
        Configuration configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
        // 2、创建一个Session对象
        Session session = sessionFactory.openSession();
        // 3、开启事务
        Transaction transaction = session.beginTransaction();
        // 4、执行保存操作
        Account account = new Account("张三",1000);
        session.save(account);
        // 5、提交事务
        transaction.commit();
        // 6、关闭Session
        session.close();
        // 7、关闭SessionFactory
        sessionFactory.close();

然后运行测试代码,hibernate就会把数据保存到数据库,如果你没有这张表,hibernate会自动帮我们创建好表然后插入数据。
因为hibernate版本的问题,所以这里面会有很多的坑,具体报了什么错大家可以自己百度解决。我这里的hibernate版本是5.X的。

+----+------+-------+
| ID | NAME | MONEY |
+----+------+-------+
|  1 | 张三 |  1000 |
+----+------+-------+
1 row in set (0.00 sec)

那么在创建持久化类的时候需要注意下面几个问题:

  • 必须提供一个无参的构造器
    因为Hibernate需要使用Constructor.newInstance()来实例化持久化类
  • 提供一个标识属性
    通常映射为数据表的主键字段,如果没有该属性,一些功能将不起作用
  • 为类的持久化类字段声明访问方法
  • 使用非final类
    在运行时生成代理是Hibernate的一个重要的功能,如果持久化类没有实现任何接口,Hibernate将使用CGLIB生成代理,如果使用的是final类,则无法生成CGLIB代理
  • 重写equals和hashCode方法
    如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法

入门案例我们就编写完了, 相信两个配置文件的配置信息大家都能明白,注释也写得很清楚,那么关于测试代码的一些类API,这里分别介绍一下。

  1. Configuration:
    Configuration类负责管理Hibernate的配置信息,包括如下内容:
    Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect、数据库连接池等(对应hibernate.cfg.xml文件)
    创建Configuration的两种方式:
    属性文件(hibernate.properties):
    Configuration cfg = new Configuration();
    Xml文件(hibernate.cfg.xml)
    Configuration cfg = new Configuration().configure();
    Configuration的configure方法还支持带参访问:
    File file = new File("文件名");
    Configuration cfg = new Configuration().configure(file);
  2. SessionFactory:
    针对单个数据库映射关系经过编译后的内存镜像,是线程安全的
    SessionFactory对象一旦构造完毕,即被赋予特定的配置信息
    SessionFactory是生产Session的工厂
    构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象
  3. Session:
    Session是应用程序与数据库之间交互操作的一个而单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存,显式执行flush之前,所有的持久化层操作的数据都缓存在session对象处,相当于JDBC中的Connection
  4. Transaction:
    事务,学过数据库的应该都明白,不重复说

更新

上面说到了插入数据,那么这里说一下如何使用hibernate完成更新操作。

  • session.save(obj); 【保存一个对象】
  • session.update(obj); 【更新一个对象】
  • session.saveOrUpdate(obj); 【保存或者更新的方法】
    没有设置主键,执行保存;
    有设置主键,执行更新操作;
    如果设置主键不存在报错!
        SessionFactory sessionFactory = null;
        Configuration configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        Account account = session.get(Account.class, 1);
        account.setMoney(2000);
        session.update(account);
        transaction.commit();
        session.close();
        sessionFactory.close();

运行然后查询数据库:

+----+------+-------+
| ID | NAME | MONEY |
+----+------+-------+
|  1 | 张三 |  2000 |
+----+------+-------+
1 row in set (0.00 sec)

查询

接下来是查询。

        SessionFactory sessionFactory = null;
        Configuration configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        Account account = session.load(Account.class, 1);
        System.out.println(account);
        transaction.commit();
        session.close();
        sessionFactory.close();

运行结果:
在这里插入图片描述

删除

最后是删除。

        SessionFactory sessionFactory = null;
        Configuration configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        Account account = session.get(Account.class, 1);
        session.delete(account);
        transaction.commit();
        session.close();
        sessionFactory.close();

运行结果:

mysql> select * from account;
Empty set (0.00 sec)

总结

关于增删改查的操作是非常简单的,只要会一个,其它的就都能会,因为道理是一样的。当然关于hibernate的使用远不止这么点功能,但本篇文章只是为了让你尽快入门,所以一些更高级的功能我打算写在进阶里。

推荐阅读

Hibernate对象状态之间的神奇转换

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
324 0
|
6月前
|
Java 数据库连接
杨老师课堂之JavaEE三大框架Hibernate入门第一课
杨老师课堂之JavaEE三大框架Hibernate入门第一课
36 0
|
7月前
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
|
7月前
|
SQL Java 数据库连接
Hibernate - 基础入门详解
Hibernate - 基础入门详解
138 1
|
7月前
|
SQL 缓存 Java
Hibernate - 检索策略入门与详解
Hibernate - 检索策略入门与详解
60 0
|
SQL XML Java
Mybatis01入门+使用和配置+面试题mybatis与hibernate的区别+ssm与ssh2开发对比
Mybatis01入门+使用和配置+面试题mybatis与hibernate的区别+ssm与ssh2开发对比
Mybatis01入门+使用和配置+面试题mybatis与hibernate的区别+ssm与ssh2开发对比
|
SQL Java 数据库连接
hibernate入门学习笔记
hibernate入门学习笔记
88 0
|
存储 SQL Java
Hibernate入门实例
Hibernate是一个基于jdbc的开源的持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
Hibernate入门实例
|
SQL 设计模式 缓存
【框架】[Hibernate]构架知识点详解入门与测试实例
【框架】[Hibernate]构架知识点详解入门与测试实例
122 0
【框架】[Hibernate]构架知识点详解入门与测试实例
|
Oracle Java 关系型数据库
Hibernate入门这一篇就够了(四)
Hibernate入门这一篇就够了
153 0
Hibernate入门这一篇就够了(四)
下一篇
DataWorks