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配置文件的方式更加广泛。 两种配置文件的实质是一样的,只是文件形式不同而已。
上一篇: 【Hibernate】(一)快速入门
下一篇: hibernate快速搭建开发环境