1、Hibernate框架
Hibernate是一个开放源代码的对象关系映射框架,它对 JDBC进行了很是轻量级的对象封装,它将POJO类与数据库表创建映射关系,是一个
全自动的ORM框架,hibernate能够自动生成SQL语句,自动执行。Hibernate能够应用在任何使用 DBC的场合,既能够在Java的客户端程序使用,
也能够在Servlet/JSP的Web应用中使用。Hibernate下载orm,jar包官网:https://hibernate.org/orm/releases/
2、ORM(对象关系映射)模型框架
用于实现面向对象编程语言里不一样类型系统的数据之间的转换。对象关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的
开发方法是当今主流开发方法,关系数据库是应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务
实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据没法直接表达多对多
关联和继承关系。所以,ORM系统通常以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
3、Hibernate配置文件
1.映射文件
映射配置文件主要是用于描述实体类与数据表之间的映射关系。位置要与实体类在同一个包下。名称:类名.hbm.xmljava
<hibernate-mapping> <class name="*.*.*" table="t_customer" catalog="***"> <id name="id" column="c_id"> <generator class="identity" /> </id> <property name="name" column="c_name" length="20" /> <set name="orders" inverse="false" cascade="save-update"> <key column="c_customer_id" /> </set> </class> </hibernate-mapping>
(1)统一声明包名,这样在<class>中就不须要写类的全名。
(2)关于<class>标签配置
name 属性:类的全名称
table 表的名称,能够省略,这时表的名称就与类名一致
catalog 属性:数据库名称 能够省略.若是省略,参考核心配置文件中 url 路径中的库名称
(3)关于<id>标签,<id>是用于创建类中的属性与表中的主键映射。
name 类中的属性名称
column 表中的主键名称 column 它也能够省略,这时列名就与类中属性名称一致
length 字段长度
type 属性 指定类型
<generator>它主要是描述主键生成策略。
(4)关于<property>标签 ,是描述类中属性与表中非主键的映射关系。
2.核心配置文件
主要包含了链接数据库相关信息,hibernate相关配置等。位置:在项目根目录下建立一个。名称:hibernate.cfg.xml
根据hibernate.properties文件下的信息能够配置mysql
<hibernate-configuration> <session-factory> <!-- 配置关于数据库链接的四个项 driverClass url username password --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///**</property> <property name="hibernate.connection.username">***</property> <property name="hibernate.connection.password">***</property> <!-- 设置链接提供者 --> <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> <!-- c3p0链接池的配置 --> <property name="hibernate.c3p0.max_size">20</property> <!-- 最大链接池 --> <property name="hibernate.c3p0.min_size">5</property> <!-- 最小链接数 --> <property name="hibernate.c3p0.timeout">120</property> <!-- 超时 --> <property name="hibernate.c3p0.idle_test_period">3000</property> <!-- 空闲链接 --> <!-- 能够将向数据库发送的sql显示出来 --> <property name="hibernate.show_sql">true</property> <!-- 格式化sql --> <property name="hibernate.format_sql">true</property> <!-- hibernate的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 自动建立表 --> <property name="hibernate.hbm2ddl.auto">create</property> <!-- 用于设置事务提交方式 --> <property name="hibernate.connection.autocommit">false</property> <!-- 配置hibernate的映射文件所在位置 --> <mapping resource=".././*.hbm.xml" /> </session-factory> </hibernate-configuration>
注意:不管是映射文件仍是核心配置文件,都要有约束在xml文件中,已3.0.dtd为例:算法
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
位置是:hibernate的jar包下的\project\etc\hibernate.properties
4、Hibernate工做原理:
1.经过 Configuration().configure(); 读取并解析 hibernate.cfg.xml 配置文件。
2.由hibernate.cfg.xml中的<mappingresource="xx/xx/xxx.hbm.xml"/> 读取解析映射信息。
3.经过 config.buildSessionFactory(); 获得 sessionFactory。
4.sessionFactory.openSession(); 获得 session。
5.session.beginTransaction(); 开启事务。
6.session.getTransaction().commit(); 提交事务
7.关闭 session;
5、Hibernate持久化类与 主键生成策略
在 hbm.xml 中能够设置的主键生成策略以下:
主键生成器 描述
increment 代理主键。由 hibernate 维护一个变量,每次生成主键时自动以递增。 问题:若是有多个应用访问一个数据库,因为每一个应用维护本身 的主键。此时主键可能冲突。建议不采用。
identity 代理主键。由底层数据库生成表识符。条件是数据库支持自动增加数据类型。 好比:mysql 的自增主键,oracle 不支持主键自动生成。 若是数据库支持自增建议采用。
sequence 代理主键。Hibernate 根据底层数据库序列生成标识符。条件是数据库支持序 列。好比 oracle 的序列。若是数据库支持序列建议采用。
native 代理主键。根据底层数据库对自动来选择 identity、sequence、hilo因为生成主键策略的控制权由 hibernate 控制,因此不建议采用。
uuid 代理主键。Hibernate 采用 128 位的 UUID 算法来生成标识符。该算法可以在网络环境中生成惟一的字符串标识符。此策略能够保证生 成主键的惟一性,而且提供了最好的数据库插入性能和数据库平台的无关性。建议采用。
assigned 天然主键。由 java 程序负责生成标识符。不建议采用。
6、Hibernate持久化对象状态
1. 瞬时态:也叫作临时态或自由态,它通常指咱们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录。它使用
完成后,会被jvm直接回收掉,它只是用于信息携带。
简单说:无OID与数据库中的信息无关联,不在 session 管理范围内。
2. 持久态:在 hibernate session 管理范围内,它具备持久化标识OID它的特色,在事务未提交前一直是持久态,当它发生改变时,hibernate
是能够检测到的。
简单说:有OID 由session管理,在数据库中有可能有,也有可有没有。
3. 托管态:也叫作游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不
存在。对于托管态对象,它发生改变时hibernet不能检测到。
7、Hibernate注解开发
1.PO类注解开发
@Entity 声明一个实体
@Table 来描述类与表对应
@Id 来声明一个主键
@GenerateValue 用它来声明一个主键生成策略
默认状况下至关于native,能够选择的主键生成策略 AUTO IDENTITY SEQUENCE
@Column 来定义列
注意:对于 PO 类中全部属性,若是你不写注解,默认状况下也会在表中生成对应的列。列的名称就是属性的名称
@Temporal 来声明日期类型
TemporalType.DATA 只有年月日
TemporalType.TIME 只有小时分钟秒
TemporalType.TIMESTAMP 有年月日小时分钟秒
2.一对多(多对一)
@OneToMany
@ManyToOne
3.级联
@Cascade
8、Hibernate检索方式概述
Hibernate提供如下5种检索对象方式:
1 导航对象图检索方式,根据已加载的对象导航到其它对象
2.OID检索方式,按照对象的OID来检索对象
3.HQL检索方式,使用面向对象的HQL查询语言
4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象,这种API封装基于字符串形式的查询语句,提供了更加面向对象的查询接口
5.本地SQL检索方式,使用本地数据库的SQL查询语句
9、Hibernate事务管理
1.Hibernate事务管理级别
xxx.hbm.xml配置事务管理sql
<property name="hibernate.connection.isolation">4</property>
1 表明的事务隔离级别为 READ UNCOMMITTED
2 表明的事务隔离级别为 READ COMMITTED
4 表明的事务隔离级别为 REPEATABLE READ
8 表明的事务隔离级别为 SERIALIZABLE
EAD_UNCOMMITED 读取未提交,它引起全部的隔离问题
READ_COMMITTED 读已提交,阻止脏读,可能发生不可重复读与虚读.
REPEATABLE_READ 重复读 阻止脏读,不可重复读 可能发生虚读
SERIALIZABLE 串行化 解决全部问题 不容许两个事务,同时操做一个目标数据。 (效率低下)
ORACLE 默认的是事务隔离级别 READ_COMMITTED
MYSQL 默认的事务隔离级别 REPEATABLE_READ
2. Hibernate中session管理
Hibernate提供了三种管理session的方式:
(1)Session 对象的生命周期与本地线程绑定(ThreadLocal)
(2)Session 对象的生命周期与 JTA 事务绑定(分布式事务管理)
(3)Hibernate 委托程序来管理 Session 的生命周期数据库