欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate 5.3(一)

程序员文章站 2024-03-23 13:12:16
...

通过本篇博客,你可以快速了解Hibernate,以及简单的Hibernate的应用,本文只是体验篇,重头戏在后面系列。

Hibernate 简介

Hibermate是轻量级JavaEE应用的持久层解决方案,Hibernate不仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度缩短使用JDBC处理数据持久化的时间。

目前的主流数据库依然是关系数据库,而Java语言则是面向对象的编程语言,当把二者结合在一起使用时相当麻烦,而Hibernate则减少了这个问题的困扰,它完成对象模型和基于SQL的关系模型的映射关系。使得应用开发者可以完全采用面向对象的方式来开发应用程序。

对象/关系数据库映射(ORM)

ORM的全称是Object/Relation Mapping, 对象/关系数据库映射。ORM可理解成一 *种规范, 它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后,既可利用面向对象程序设计语言的简单易用性,又可利用关系数据库的技术优势。因此,我们可把ORM框架当成应用程序和数据库的桥梁。

ORM工具作用示意图

Hibernate 5.3(一)

ORM工具的唯一作用就是:把对持久化对象的保存、删除、修改等操作,转换成对数据库的操作。从此,程序员可以以面向对象的方式操作持久化对象,而ORM框架则负责转换成对应的SQL (结构化查询语言)操作。

基本映射方式

  • 数据表映射类:持久化类被映射到-一个 数据表。当我们使用这个持久化类来创建实例、修改属性、 删除实例时, 系统自动会转换为对这个表进行CRUD操作。
  • 数据表的行映射对象(即实例) :持久化类会生成很多实例, 每个实例就对应数据表中的一行记录。当我们在应用中改持久化类的某个实例时, ORM工具将会转换成对对应数据表中特定行的操作。每个持久化对象对应数据表的一行记录。
  • 数据表的列(字段)映射对象的属性:当我们在应用中修改某个持久化对象的指定属性时(持久化实例映射到数据行),ORM将会转换成对对应数据表中指定数据行、指定列的操作。

Hibernate 下载与配置

Hibernate下载时到官网下载,下载之后,解压,到lib目录下,required(使用Hibernate最基础的jar包)包的所有jar包拷到项目下,句可以使用了。

Hibernate数据库操作

前面已经介绍了,在所有ORM框架中有一一个非常重要的媒介: PO ( Persistent Object,持久化对象)。持久化对象的作用是完成持久化操作,简单地说,通过该对象可对数据执行增、刪、改的操作以面向对象的方式操作数据库。

Hibernate里的PO是非常简单的,POJO (普通Java对象)类,和普通JavaBean类没有什么区别。Hibernate被称为低侵入式设计的原因,Hibernate不要求持久化类继承任何父类,或者实现任何接口,这样可保证代码不被污染。

public class News {
   private int id;
   private String title;
   private String content;
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public String getContent() {
    return content;
}
public void setContent(String content) {
    this.content = content;
}

}

这样的JavaBean还不具备持久化操作的能力,还需要配置Hibernate映射文件。

Hibernate 映射文件

映射文件应该创建在src目录下,并且命名xxx.hbm.xml。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定hibernate的标签库文件  -->
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 5.3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.example.test.bean">//指定包名,下面class就不需要包含包名了。
<class name="News" table="News"> <!-- table标签是对应数据库表的名称 -->
   <id name="id"> <!-- id标签用来申明持久化类标识属性,也就类似于主键 -->
   <generator class="identity"></generator><!-- 指定标识属性的生成策略 -->
   </id>
   <property name="title"></property><!-- property 使用来定义常规属性 -->
   <property name="content"></property>
</class>
</hibernate-mapping>

Hibernate的配置文件

同样的该文件存放在src目录下,文件名用hibernate.cfg.xml(不要改)。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入hibernate配置文件的标签 -->
<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 5.3.0//EN"
        "http://www.hibernate.org/dtd/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">123456</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <!-- 指定连接池里最小连接数 -->
        <property name="hibernate.c3p0.min_size">1</property>
        <!-- 指定连接池里连接的超时时长 -->
        <property name="hibernate.c3p0.timeout">5000</property>
        <!-- 指定连接池里最大缓存多少个Statement对象 -->
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="hibernate.c3p0.validate">true</property>
        <!-- 指定数据库方言 -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <!-- 根据映射文件自动创建数据表,前提你数据库要创建好,表它可以自动生成,update表示只创建一个表,每次修改的内容不保存,如果是create,每次都会生成一个表,数据都会保留下来 如果值为create-drop每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。-->
        <property name="hbm2ddl.auto">update</property><!--①-->
        <!-- 显示Hibernate持久化操作所生成的SQL -->
        <property name="show_sql">true</property>
        <!-- 将SQL脚本进行格式化后再输出 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 罗列所有持久化映射文件-->
        <mapping resource="myhibernate.hbm.xml"/>//我这里是放在src的,所以直接写文件名,如果放在是某个包,如com/example/test/xxx.hbm.xml,这里的mapping,可以有多个标签,说明可以有多个映射文件
        </session-factory>
        </hibernate-configuration>
Hibernate的连接方式

hibernate不推荐使用DriverManager来连接,而是推荐c3po,使用这个需要导入hibernate下载的lib包下的option,导入c3pojar包。

数据源是一种提高数据库连接性能的常规手段,数据源会负责维持一个数据连接池,当程序创建数据源实例时,系统会-一次性地创建多个数据库连接,并把这些数据库连接保存在连接池中。当程序需要进行数据库访问时,无须进行重新获得数据库连接,而是从连接池中取出一个空闲的数据库连接。当程序使用数据库连接访问数据库结束后,无须关闭数据库连接, 而是将数据库连接归还给连接池即可。通过这种方式, 就可避免频繁地获取数据库连接、关闭数据库连接所导致的性能下降。

数据库增删改查

注意:下面的类均是Hibernate,不要导入有误。

public class NewsDao {
   public static void main(String[] args) {
       //实例化Configuration,并加载hibernate.cfg.xml文件
       Configuration con = new Configuration().configure();
       SessionFactory sf = con.buildSessionFactory();
       Session ss = sf.openSession();
       //打开事务
       Transaction tt = ss.beginTransaction();
       News n = new News();
       n.setContent("hibernate 你好");
       n.setTitle("hibernate");
       n.setId(1);
       ss.save(n);
       //提交事务
       tt.commit();
       ss.close();
       sf.close();
   }
}

由上面可见:
PO(JavaBean类)与Session的关联关系, PO实例可有如下三种状态。
-瞬态:如果PO实例从未与Session关联过, 该PO实例处于瞬态状态。
-持久化: 如果PO实例与Session关联起来,且该实例对应到数据库记录,则该实例处于持久化状态。
-脱管:如果PO实例曾经与Session关联过,但因为Session的关闭等原因,PO实例脱离了Session的管理,这种状态被称为脱管状态。

Hibernate 体系结构

Hibernate 5.3(一)

在前面的Hibemate入门中,我们都没有使hibernate.properties 文件, 而是采用了另一种形式的配置文件: *.cfg.xml 文件。在实际应用中, 采用XML配置文件的方式更加广泛。 两种配置文件的实质是一样的,只是文件形式不同而已。