Hibernate框架简介基础

来源:互联网 发布:asp会员管理系统源码 编辑:程序博客网 时间:2024/05/16 09:18

一:hibernate框架介绍

Hibernate是一款工作在持久化层的大型、开源、免费的ORM框架。下图是hibernate的图标,大家在仓库中选取jar包时需要注意。

1.将对数据库的操作转换为对象Java对象的操作,从而简化开发。通过修改一个“持久化”对象的属性从而修改数据库表中对应的记录数据。通过操作对象达到数据库的目的。

2.提供线程和进程两个级别的缓存提升应用程序性能。
缓存:查询出来数据之后在缓存中进行保存,下次查询相同数据直接从缓存中读取,减少数据库操作。缓存可以大大的提高数据查询的速度,以及减少服务器的压力。

3.有丰富的映射方式将Java对象之间的关系转换为数据库表之间的关系。

4.屏蔽不同数据库实现之间的差异。在Hibernate中只需要通过“方言”的形式指定当前使用的数据库,就可以根据底层数据库的实际情况生成适合的SQL语句。

hibernate主要名词介绍:

持久化:狭义:将数据从“不可掉电”设备保存到“可以掉电”的设备上。不可掉电,是指电脑在从有网有电的状态下到突然没有电,数据就会丢失。而可掉电恰好相反。

广义:指与数据库相关的一切操作。 curd(增删改查)
[1]保存:对应标准SQL中的INSERT语句。
[2]删除:对应标准SQL中的DELETE语句。
[3]更新:对应标准SQL中的UPDATE语句。
[4]查询:对应标准SQL中的SELECT语句。在Hibernate中,往往特指使用专门的查询API查询特定的数据。查询API包括HQL查询和QBC查询。(hibernate应对复杂查询语句的解决方法)
[5]加载:在Hibernate中,加载指的是根据对象的OID查询数据库中的一条具体的记录。
oid——Object ID,特指Java对象中与数据库表的主键相对应的一个属性。 一般用到这个属性的时候,就是对数据库主键进行操作。

ORM:概念:Object/Relationship Mapping,对象关系映射

②对象:Java程序中用于封装业务数据的对象。通常称为实体类(Entity),以JavaBean(POJO)技术实现。例如:Book 、User、Person等等这样的类的对象。
③关系:关系型数据库,目前主流的数据库都是关系型的。
④映射:建立从“对象”到“关系型数据库”之间的对应关系。
简单的说:使用一个pojo类表示一张表的结构,这个动作就是映射。
Hibernate搭建环境

①导入Hibernate需要的JAR包

http://mvnrepository.com/artifact/org.hibernate/hibernate-core 这个是在maven中央仓库中的hibernate jar包链接。建议不要选用太新的版本。因为新的版本都不太稳定。我用的是4.3.9版本。


见图箭头,需要将选中的部分放在程序中的pom.xml的dependcies中。这样就可以使用hibernate了。

②导入数据库驱动

同导入hibernate基本相同,就是在上图网址搜索mysql ,我选用的是5.1.24版本的。
③创建Hibernate自身的配置文件:hibernate.cfg.xml

一般的软件,像eclipse是可以自动生成该文件的,但是初学者,可以自己写一下,把大的框架复制,把其中的内容改一下就好了。Hibernate所需的配置文件。主要配置数据库连接相关等。Ps:文件名不能修改。路径在src路径下,maven项目在resourse路径下。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"                                         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><!-- hibernate主配置文件,主要配置连接数据库所需要的一些常量 --><hibernate-configuration><!--配置session,session 工厂 ,用于生产session对象 此session非HttpSession.此处的session对象可以通过操作实体类达到操作数据库的目的 --><!-- 工厂类需要我们提供连接数据库的常量,这样工厂类才能够正常运转 --><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--704hibernate是指数据库名,就是你用的那个表所在的数据库-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/704hibernate</property>
<!--root和123是你的数据库软件创建时自己定义的账号密码-->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<!-- 实现显示sql语句,true和false两个可选值 显示在控制台,hiberntae会把当前执行的sql语句进行打印 --><property name="show_sql">true</property><!-- 添加映射文件的位置,有多个映射文件,这里就添加多少次 -->
<mapping resource="com/qianfeng/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
④创建持久化类PO Persistence Object (POJO类,实体类,数据模型类) 

持久化类,也就是实体类。在Hibernate中,我们将封装业务数据的实体类称为持久化类。持久化类经过Hibernate映射后可以自动生成对应的数据库表。

要求: 
{1]有无参的构造器。
[2]有OID属性:就像数据库表一定要有主键一样,持久化类也一定要有OID属性用于和数据库表的主键相对应。
[3]包含使用JavaBean风格声明的属性:getXxx()和setXxx()方法
[4]非final类
⑤创建持久化类对应的关系映射文件:Student.hbm.xml文件
⑥在hibernate.cfg.xml文件中声明映射文件的位置

如图左,我们在myeclipse中定义了一个maven项目,Student是该项目的实体类,里面定义了右图数据库中的四个变量。这时候我们需要编写一个编写Student.hbm.xml实体类配置文件。开头的Student同表名相同,后面的不能改变。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><!-- name实体类的包名+类名, table 就是表名 --><class name="com.qianfeng.Student" table="student"><!-- 属性名设置为id,hibernate默认会把它当做主键 --><!-- name代表类的属性名 ,type是属性的类型 --><id column="id" name="id" type="int" ><generator class="native" /></id><!-- property表示普通字段 --><property name="name" column="name" type="java.lang.String"></property><property name="age" column="age" type="int"></property><property name="address" column="address" type="java.lang.String"></property></class></hibernate-mapping>
 [1]创建位置:和持久化类在同一个包下[2]创建名称:pojo类名.hbm.xml用于声明类与表,属性与字段之间关系的配置文件。该文件中name指的是实体类中的变量名,column指的是数据库中的变量名。此外,还需要在hibernate.cfg.xml中声明hbm.xml文件的位置,使两者相关联。每一个想通过hibernate操作的表都有对应类,都有对应的hbm.xml文件,回本儿吧都有一个对应的映射声明。

eg: <mapping resource="com/atguigu/bean/Student.hbm.xml" /> 

该行代码写在hibernate.cfg.xml中。

Hibernate中重要api

Session SessionFactory Configuration :读取配置文件负责管理Hibernate的配置信息。hibernate.cfg.xml文件中的信息:数据库URL地址、用户名、密码、JDBC驱动类、数据库方言、数据库连接池参数等。*.hbm.xml文件中的信息:持久化类与数据库表之间的对应关系。 Transaction代表一次数据库事务。Hibernate主张将所有持久化操作都纳入到事务控制中,哪怕仅仅是只读操作。

session:代表Hibernate应用程序和数据库之间的一次会话,作用相当于JDBC中的Connection。其中封装了操作一系列方法操作数据库并包含缓存功能。SessionFactory:用于创建Session对象的工厂类。特点1SessionFactory对象一旦构造完毕,即被赋予特定的配置信息。2构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory对象。3Hibernate4新增了一个ServiceRegistry 接口,所有基于Hibernate的配置或者服务都必须统一向这个ServiceRegistry注册后才能生效。创建SessionFactory对象的步骤[1]创建封装配置信息的Configuration对象。[2]在ServiceRegistry对象中注册配置信息。[3]通过Configuration对象构建SessionFactory对象。Hibernate中的第一个HelloWorld

测试目标:使用Hibernate实现将Student对象保存到数据库中。实现步骤[1]创建SessionFactory对象(1)创建Configuration对象封装Hibernate的配置信息。注意:仅通过构造器创建Configuration对象读取不到配置信息,还需要再调用configure()方法加载配置文件。Configuration configuration = new Configuration().configure(); (2)创建ServiceRegistry对象用于注册Hibernate配置信息这是Hibernate4中新增的特性。<1>创建构建ServiceRegistry对象的ServiceRegistryBuilder对象ServiceRegistryBuilder builder = new ServiceRegistryBuilder(); <2>通过builder对象接收configuration对象中封装的配置信息builder.applySettings(configuration.getProperties()); <3>通过builder对象构建ServiceRegistry对象ServiceRegistry serviceRegistry = builder.buildServiceRegistry(); (3)通过Configuration对象创建SessionFactory对象SessionFactory factory = configuration.buildSessionFactory(serviceRegistry); [2]通过SessionFactory对象创建Session对象,也就是开启和数据库之间的一次会话Session session = factory.openSession(); [3]开启事务Transaction transaction = session.beginTransaction(); [4]执行操作Student student = new Student(null, "Tom2015", 20, new Date());session.save(student); [5]提交事务transaction.commit(); [6]关闭Sessionsession.close(); [7]关闭SessionFactoryfactory.close();

持久化对象状态:

Hibernate把持久化类的对象分为4种状态:持久化状态、临时状态、游离状态、删除状态。 
①临时状态
[1]OID:没有OID。例如:new Student(null, "Kate2015", 18, new Date());
[2]是否在Session缓存中:不在
[3]是否在数据库中有对应的记录:没有
②持久化状态
[1]OID:有OID。例如:Student student = (Student) session.get(Student.class, 1);
[2]是否在Session缓存中:在
[3]是否在数据库中有对应的记录:有
③游离状态
[1]OID:有OID。例如:new Student(1, "Kate2015", 18, new Date());
[2]是否在Session缓存中:不在
[3]是否在数据库中有对应的记录:有
④删除状态
[1]OID:有OID。通常是经过删除操作得到的。
[2]是否在Session缓存中:不在
[3]是否在数据库中有对应的记录:没有



Session核心方法

save()
②对于OID:忽略临时对象中的“OID”值,save()方法会将数据库产生的新的OID的值赋值给持久化对象
③持久化状态的对象的OID的值是不允许修改的


persist()
①作用和save()相同
②不允许保存带有OID的对象,会抛异常:org.hibernate.PersistentObjectException

 
原创粉丝点击