Hibernate框架基础
简介
Hibernate是一个开放源代码的对象关系映射框架,对JDBC进行轻量级的对象封装
提供从java类到数据表之间的映射
提供了查询和事务机制
用于减少操作数据库的操作量
1.概述
采用ORM(object/relation Mapping)映射机制,实现java对象和关系数据库之间的映射
将SQL语句传给数据库,并且把数据库返回的结果封装成对象
内部封装了JDBC访问数据库的操作,向上层应用应用提供了面向对象的数据访问API(application programming interface)
1.1 ORM
其基本思想是将对象模型(如javaBean对象)与关系数据库的表建立映射关系
把对数据库的操作转化为对JavaBean对象的操作,从而不需要再使用SQL语句操作数据库中的表,而是直接操作javaBean对象就可以实现存储、查询、更改和删除
映射关系
类---------------数据表
对象------------表中行记录
属性------------表中列字段
1.2 结构体系
基于Hibernate的应用程序是通过配置文件(hibernate.properties/hibernate.cfg.xml)和映射文件(*.hbm.xml)把持久化对象映射到数据库的数据表,通过操作持久化对象对数据进行增删改查
1.3Hibernate核心组件
Transcation接口:
用来管理Hibernate事务,主要方法有commit()和rollback(),可从Session的beginTranscation()方法生成
Query接口:
对PO进行查询操作。可从Session的createQuery()方法生成
Session接口:
用来操作PO,有get(),save(),update()方法和delete()等方法,用来进行增删改查等操作
SessionFactory接口:
产生Session实例的工厂,是Hibernate的容器
Configuration类:
用来读取Hibernate配置文件和映射文件,并创建SessionFactory对象
1.4 运行过程
1.应用程序调用Configuration类,该类读取配置文件和映射文件,根据这些信息生成SessionFactory对象
2.每次执行数据库事务时,先从SessionFactory中获取一个Session实例
3.由Session对象启动事务,并生成Transcation对象
4.通过Session对象的方法对PO进行增删改查操作。在查询时,通过Session对象生成一个Query对象,执行查询操作
5.若无异常,则Tanscation对象将提交操结果到数据库,否则将事务回滚
6.事务操作完毕,关闭Session对象
代码:
//创建Configuration对象
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();//创建一个ServiceRegistry对象:Hibernate的任何配置和服务都需要在该对象中注册后才有效
//1
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//2
Session session = sessionFactory.openSession();
//3
Transcation transcation = session.beginTranscation();
//4
Book book = new Book();
book.setBookId("123");
book.setBookName("Java程序设计");
session.save(book);
//5
transcation.commit();
//6
session.close();
2 搭建Hibernate开发环境
2.1导入Hibernate核心jar包和相关包(数据库的驱动jar包)
2.2安装Hibernate Tools
离线安装:在Eclipse环境下Help->Install New Software->Add->Archive,选择所下载的文件,按提示安装Hibernate Tools即可
是否安装成功:重启后选择File->new ->other看是否能找到Hibernate选项
3 配置文件建立
3.1 建立数据库配置文件hibernate.cfg.xml
主要用来设置访问数据库所需要的参数
基本配置分为三类:
1.JDBC连接参数基本配置
2.Hibernate连接池(C3P0)的参数配置(可以不配,但实际应用中可以提高系统性能)
3.注册ORM映射文件的配置参数
3.1.1采用基本JDBC连接数据库
配置说明:
1.该配置文件通常放在src路径下,默认名称为hibernate.cfg.xml
2.前五项<property>设置是必须的,分别为驱动程序类、数据库连接、url、用户名、密码和数据库方言(表示连接的是那种数据库)
3.<property name="hbm2ddl.auto>update</property>表示可由类和映射文件自动生成数据库表
4.<property name="show_sql">true</property>显示运行过程中执行的SQL语句(一般调试时设为true)
5.<property name="foamt_sql">true</property>在控制台上按格式显示SQL语句
6.<mapping resource="...."/>用来设置映射文件位置,注意resource的值是文件路径
3.1.2在Hibernate中使用C3P0数据源
1.导入C3P0相关的jar包
2.在Hibernate配置我呢见中添加配置项
- hibernate.c3p0.max_size:数据库连接池的最大连接数
- hibernate.c3p0.min_size:数据库连接池的最小连接数
- hibernate.c3p0.acquire_increment:当连接池中连接耗尽时,需要一次添加的连接数
- hibernate.c3p0.timeout:连接池中连接对象在多长时间不使用后,需要被销毁
- hibernate.c3p0.idle_test_period:表示连接池检测线程多长时间检测一次池内的所有连接对象是否超时,以决定是否销毁目标连接对象
- hibernate.c3p0.max_statements:缓存Statement对象的数量
通常使用以下配置即可
4 PO对象
一个数据记录对应一个持久化对象PO,PO可为普通的JavaBean
4.1 PO规则
1.提供无参构造方法
2.提供一个标识属性(OID):通常映射为数据库表的主键字段
3.每个属性都有get/set方法:Hibernate对JavaBeans风格的属性实行持久化
4.2 PO的状态及转换条件
PO与Session关联,有四种状态:
- 瞬时(Transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new创建,且与session没有关联的对象,OID为0/null
- 持久(Presistent)数据库中有数据与之对应,当前与session关联,并且相关联的seesion没有关闭,事务没有提交
- 删除(Removed):在数据库中没有与OID对应的记录,不在处于Session缓存中,一般情况下,应用程序不再使用被删除的对象
- 脱管(Detached):数据库中有数据与之对应,但当前没有session与之关联
转换关系图如下
5 Hibernate映射文件
映射文件将一个PO类和一个数据表联系起来。通常一个PO对象对应一个映射文件
命名规范:PO类名.hbm.xml
与PO在同一个包下
1.New->Other->Hibnate->HibernateXML Mapping file命令建立hbm.xml文件,过程中选择目标类完成建立
配置模板如下
1.配置项<class>
- name:指定持久化类的名称
- table:对应数据库表名,如省略则同类名一致
- catelog:指定数据库名称
2.配置项<id>
配置主键
- name:持久化类的标识符属性的名称
- type:指定Hibernate的映射类型。
- column:数据库的主键字段名
- <generator>设置主键生成方式
主键生成策略如下
3.配置项<property>
- name:持久化类的标识符属性的名称
- type:指定Hibernate的映射类型
- column:数据库的字段
6 Hibernate核心类
1.configuration类
主要作用:用来解析Hibernate配置文件和映射文件中的信息
执行configuration.configure()时,Hibernate会自动在classpath下搜索Hibernate配置文件,在Java Web应用中,Hibernate会在WEB-INF/classes目录下搜索,然后获取其有关配置信息
2.SessionFactory接口
负责初始化Hibernate,充当数据存储源的代理,并负责创建Session对象
所有基于Hibernate的配置或者服务都必须在ServiceRegistry中注册才能生效
SessionFactory是线程安全的,当哭护短发送一个请求时,从SessionFactory中获取Session对象,由Session对象处理客户请求
3.Session接口
是应用与数据库之间的会话(与HttpSession无关)
Session对象使用方法如下
createQuery()方法:由HQL语言查询语句,创建查询接口,代码如下:
Query query = session。createQuery(“HQL语句”);
4.Transcation接口
对实际事务的抽象
7 HQL语言与Query接口及应用
与SQL不同的是,SQL语句是对表进行操作,而语法相同的HQL则是对对象进行操作
select 属性名 from 类名
条件带未知参则用?,创建语句完成后使用query.setParameter(索引下标,参数);
PASS
1.Query接口和应用
list():返回List类型的查询结果
setMaxResults():设置返回最大记录数
setParameter():设置带参数的查询语句中的参数值
executeUpdate():执行更新或删除语句
2.设置分页
查询结果过多,将结果分页显示
- setFirstResult():设置起始位置(索引位置是从0开始)
- setMaxResults():设置返回最大记录数