Hibernate框架学习之一:Hello World程序

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

前言

对一个框架的直观认识,往往是从一个Hello World程序开始。Hibernate是一个ORM(Object Relationship Mapping)对象映射框架。实现了JDBC轻量级的封装,使得在进行JDBC开发的时候可以直接使用面向对象的思维进行开发,说白了Hibernate框架的作用是在Java对象与关系数据库中做了一个映射,使得程序员不用再使用各种SQL了。所以总结Hibernate以下几点:

1、完成了对JDBC的封装,不用再与各种Connection打交道了
2、在业务体系中是一个持久层框架(除了持久层还有业务层,主要使用Struts2或者SpringMVC完成,还有视图层,就是诸如jsp、freemarker啦这些显示信息的技术),对持久层的解释,我摘抄了官方的一句话:

Persistence simply means that we would like our application’s data to outlive the applications process. In Java terms, we would like the state of (some of) our objects to live beyond the scope of the JVM so that the same state is available later.

3、是一个ORM框架,不用与各种SQL打交道

Hibernate 入门程序:XML版

第一步:在myeclipse中创建一个web项目,取名为hibernate
第二步:在项目中添加使用Hibernate框架必须的jar包:如下图:

jar

第三步:编写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.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">1234</property>

        <!-- JDBC 连接池 -->
        <property name="connection.pool_size">1</property>

        <!-- SQL 方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- 禁用二级缓存  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- 是否显示执行的SQL语句 -->
        <property name="show_sql">true</property>

        <!-- 删除并重建数据库 -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 引入外部映射文件 -->
        <mapping resource="bean/Person.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

上面的配置文件指明了一些必要的数据库连接属性,通过这些属性,Hibernate可以连接上数据库。可以配置各种不同的数据库,其中sql 方言属性指明了使用你所配置的数据库的sql语法(比如Oracle与MySQL中一些语法还是存在很大不同的)。

第四步:创建bean对象

package bean;

public class Person {

    private int id;
    private String sname;
    private int age;
    private float salary;

    //无参构造方法,但是如果不写的话。Person类已经有一个默认的构造方法,那就是无参构造方法
    public Person(){}
    //省略get和set方法,这里把id的set方法设为private
    private void setId(int id){
        this.id = id;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", sname=" + sname + ", age=" + age
                + ", salary=" + salary + "]";
    }


}

这是一个标准JavaBean对象,Hibernate也建议我们这么写。但是在编写这个JavaBean的时候,有几点需要注意:一是对象的id属性,另一个是id属性的set方法。在Hibernate框架中,使用一个id为标识一个对象,所以在JavaBean中为一个对象添加id属性是必要的,因为在使用Hibernate框架时候,只有Hibernate才可以为一个对象分配id值(你可以试试在没有添加id属性的时候会出现什么异常)。另外,由于id是一个对象的标示符,所以我们一般禁止其他对象对这个属性进行随意的修改,所以将其set访问设为private也是出于这个层面的考虑。

第五步:编写Person.hbmxml映射文件,该文件的作用是把Java中的Bean对象与数据库中(确切说是RDBMS,关系数据库)中一条记录做了一个映射(这里就是ORM的关键),代码如下:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'  
        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>  
<hibernate-mapping package="bean">
    <class name="Person" table="PERSON">
        <!--id就是指明对象标识符 name属性对应Person对象id属性
            column表示该属性映射到数据表的哪个字段
        -->
        <id name="id" column="PERSON_ID">
            <!-- 主键生成策略,native表示使用本地数据库的生成策略
                比如这里使用的是MySQL,那么使用的主键策略就是MySQL的自动增长策略
             -->
            <generator class="native"/>
        </id>
        <!-- 普通属性name属性表示Person对象中的字段,type属性表示该属性的类型
            当然也可以指明column属性,如果不知名,数据表中的字段与属性名称是一致的
         -->
        <property name="sname" type="java.lang.String"/>
        <property name="age"/>
        <property name="salary"/>
    </class>
</hibernate-mapping>

创建JavaBean之后,就是上面的映射文件了,上面的文件名以及文件内容可能有一些难以理解的地方。首先我们得知道,一个映射文件(后缀hbm也正是hibernate映射文件的意思)的作用是什么?前面提到了Hibernate是一个对象映射框架,对象映射到哪里去了呢?当然是数据库中数据表的一条记录(一个对象映射到了数据库表的一条记录,就这么理解)了。那么这个映射的过程的实现就是通过上面的映射文件了。映射文件告诉Hibernate怎么样去加载和存储持久化类的对象,映射文件告诉Hibernate去数据库中的那张表寻找以及应该使用表中的哪些字段。

除此之外,我们注意到,有一些属性并没有指定type属性,有一些却指定了,那么什么类型属性需要指定,什么类型又不需要呢?对于一些常见的类型(

第六步:编写测试程序实现CRUD操作

package manager;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import utils.HibernateUtils;
import bean.Person;

public class PersonManager {

    public static void main(String[] args) {
        SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction t = session.beginTransaction();
        // 创建一个Person对象并保存到数据库中
        /*Person p = new Person();
        p.setSname("赵云");
        p.setAge(23);
        p.setSalary(10000);

        session.save(p);
        // 开启事务并提交
        t.commit();

        // 查询
        List list = session.createCriteria(Person.class).list();
        for (Object object : list) {
            Person pe = (Person) object;
            System.out.println(pe);
        }

        // 更新
        Person p2 = (Person) session.load(Person.class, new Integer(1));
        p2.setSname("黄忠");
        session.save(p2);
        t.commit();

        // 查询
        List list2 = session.createCriteria(Person.class).list();
        for (Object object : list2) {
            Person pe = (Person) object;
            System.out.println(pe);
        }*/

        //删除
        Person p3 = (Person) session.get(Person.class, 2);
        session.delete(p3);
        t.commit();
    }
}

在测试的时候,为了对每个操作是否成功进行测试,可以把其他程序注释。其中涉及了Hibernate一些核心类:SessionFactory、Session和Transaction。

1、SessionFactory

熟悉设计模式的小伙伴应该知道,这是典型的工厂模式,一个org.hibernate.SessionFactory工厂对象就是生成org.hibernate.Session实例的。在整个应用程序总一个org.hibernate.SessionFactory应该只被初始化一次,并且应该是线程安全的。所以上面的代码使用HibernateUtils类封装了SessionFactory实例,从而保证了整个应用期间,只有一个SessionFactory实例。这也是设计模式的一种——单例模式。对SessionFactory的解释我引用官方的一句话:

A threadsafe, immutable cache of compiled mappings for a single database. A factory for Session and a client of ConnectionProvider, SessionFactory can hold an optional (second-level) cache of data that is reusable between transactions at a process, or cluster, level.

下面是HibernateUtils.java的代码:

package utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

    // 创建全局单一sessionFactory对象
    private static final SessionFactory sessionFacoty = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            return new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory(){
        return sessionFacoty;
    }
}

2、Session

Session代表了一个工作单元,一个Session的产生往往是在事务开始的时候创建的,比如在调用getCurrentSession方法的时候,一个事务就开始了。通过这种方式获取的Session与openSession方法的不同在于前者在事务结束的时候就会自动关闭,所以在一个事务commit或者rollback的时候,该session对象就已经关闭了。而后者则可以一直生效,每次得到的Session都是一个新的对象。

Session is a single-threaded, short-lived object representing a conversation between the application and the persistent store. It wraps a JDBC connection and is a factory for Transaction. Session holds a mandatory first-level cache of persistent objects that are used when navigating the object graph or looking up objects by identifier.

3、Transaction

数据库中事务的概念是指访问并且可能更新数据项的程序执行单元,在sql编程中,一个事务可能是一条SQL查询语句。在Hibernate中,事务是与Session相关的。对此官方解释如下:

(Optional) A single-threaded, short-lived object used by the application to specify atomic units of work. It abstracts the application from the underlying JDBC, JTA or CORBA transaction. A Session might span several Transactions in some cases. However, transaction demarcation, either using the underlying API or Transaction, is never optional.

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
7天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
8 1
|
3月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
45 1
|
3月前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
68 0
|
4月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
70 0
|
5月前
|
前端开发 Java 数据库连接
程序技术好文:电脑睡眠(sleep)和休眠(Hibernate)的区别,以及休眠功能的设置
程序技术好文:电脑睡眠(sleep)和休眠(Hibernate)的区别,以及休眠功能的设置
|
5月前
|
Java 数据库连接 数据库
探索JPA生态:Hibernate与其他ORM框架的对比分析
【6月更文挑战第25天】**JPA标准下的Hibernate是流行的ORM实现,提供丰富功能如二级缓存和延迟加载,但其学习曲线较陡,性能优化复杂。相比如MyBatis,Hibernate的JPQL更面向对象,MyBatis则接近SQL。选择ORM需考虑项目需求和个人偏好。**
79 0
|
5月前
|
Java 数据库连接
杨老师课堂之JavaEE三大框架Hibernate入门第一课
杨老师课堂之JavaEE三大框架Hibernate入门第一课
28 0
|
6月前
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
|
6月前
|
SQL Java 关系型数据库
数据库访问:什么是Hibernate框架?
【4月更文挑战第15天】Hibernate是开源ORM框架,将Java对象与数据库表映射,简化对象-关系映射,提升开发效率和性能。它自动化处理数据操作,支持多种数据库,自动生成SQL,提供配置选项和高级特性,减少手动SQL编写,便于切换数据库。
69 2