Hibernate 5.3(一)

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

Hibernate 简介

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

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

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

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

ORM工具作用示意图

这里写图片描述

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 体系结构

这里写图片描述

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

猜你喜欢

转载自blog.csdn.net/venus321/article/details/81152326