从零开始学习Hibernate框架(2)

 

 

 

 

上次讲了一下Hibernate的简介和搭建,这次就说一下比较细一些的东西。

Hibernate的核心组件:

在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层。它通过配置文件和映射文件把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作。

除配置文件,映射文件和持久化类外,Hibernate的核心组件包括以下几部分:

a)Configuration:用来读取Hibernate配置文件,并生成SessionFactory对象。
b)SessionFactory接口:产生Session实例工厂。
c)Session接口:用来操作PO。它有get(),delete(),load(),save(),update()和等方法用来对PO进行加载,保存,删除及更新等操作。它是Hibernate的核心接口。
d)Query接口:用来对PO进行查询操。它可以从Session的createQuery()方法生成。
e)Transaction接口:用来管理Hibernate事务,它主要方法有commit()和rollback(),可以从Session的beginTrancation()方法生成。

Persistent Object(持久化对象):

持久化对象可以是普通的Javabeans,惟一特殊的是它们与(仅一个)Session相关联。

JavaBeans在Hibernate中存在三种状态:

1.临时状态(transient):当一个JavaBean对象在内存中孤立存在,不与数据库中的数据有任何关联关系时,那么这个JavaBeans对象就称为临时对象(Transient Object)。
2.持久化状态(persistent):当一个JavaBean对象与一个Session相关联时,就变成持久化对象(Persistent Object)
3.脱管状态(detached):在这个Session被关闭的同时,这个对象也会脱离持久化状态,就变成脱管状态(Detached Object),可以被应用程序的任何层自由使用

Hibernate的运行过程:

  1. 应用程序先调用Configration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactpry对象。
  2. 然后从SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象;
  3. 可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载,保存,更新,删除等操作;
  4. 在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;
  5. 如果没有异常,Transaction对象将 提交这些操作结果到数据库中。

Hibernate的运行过程如下图:

Java Web 三层架构

  1. Web层  Struts框架
  2. Service层  spring框架
  3. Dao层  hibernate 框架

MVC思想

  1. M  模型
  2. V   视图
  3. C   控制器

Hibetnate 核心API详解:

Configuraction

到src 下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)

Sessionfactory(重点)

1. 使用configuration对象创建sessionFactory对象

创建sessionFactory对象过程中做事情

根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面数据映射关系把表创建

<property name="hibernate.hbm2ddl.auto">update</property>

2. 创建sessionFactory过程中,这个过程特别耗资源的

   在hibernate操作中,建议一个项目一般创建一个sessionFactory对象

3.具体实现

写工具类,写静态代码块实现

静态代码块在类加载时候执行,执行一次

Session(重点)

  1. Session类似于JDBC中的counnection
  2. 调用session里面不同的方法实现Crud操作

            1)添加 save方法

            2)修改update方法

            3)删除delete 方法

            4)根据id查询get方法

    3. Session对象单线程对象

Session对象不能共用,只能自己使用

Transaction

      1. 事务约束

transaction = session.beginTransaction();

 

      2. 事务提交和回滚方法

 transaction.commit();
transaction.rollback();

Hibernate对象的状态:

瞬时状态:一个对象既没有id也没有和session绑定

持久化状态:一个对象有id也和session绑定在一起

游离状态:有id没有和session绑定

Hibernate提供的四个crud不是增删改查的意思,而是改变对象的状态从而达到修改数据库的目的。

SaveOrUpdate

持久化状态的对象,随着对象的数据更改,数据库会自动更新

Hibernate 查询

hql

hqlhibernate独家语言

hql (Hibernate Query Language) 的特点:面向对象查询,在查询时不会出现数据库里的东西。

查询提供了更加丰富的和灵活的查询特性,因此HibernateHQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。HQL查询在整个Hibernate实体操作体系中站核心地位

criteria

criteria的用法:

QBE (Query By Example):

QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成
session = this.getSession();
Criteria cri = session.createCriteria(JdItemSerialnumber.class);
Criterion cron = Restrictions.like("customer",name);
cri.add(cron);
list = cri.list();

Criteria cri = session.createCriteria(Student.class);

cri.add(Example.create(s)); //s是一个Student对象

list cri.list();

使用session创建CriteriaBuilder

使用工厂类 创建CriteriaQuery

制定根元素

增加条件

封装到query

把query传给session.createQuery(query)

得到结果集

Sql原生态的查询方式:

应用的环境

Hql 推荐使用 适用于一些简单的查询

Criteria 推荐使用  只适用于单表查询

Sql 不推荐  非常非常复杂的查询,推荐使用sql

事务:

事物的出现就是为了解决事务的安全。

同时对两张表进行操作,当操作完第一张表,然后出现了异常导致第二张表的数据出现了问题,这种情况就叫做事务安全。

事物的特性:

  1. 原子性
  2. 一致性
  3. 持久性
  4. 隔离性

由于有了事务,就又有了问题叫做事务线程安全(事务并发问题)。

  1. 脏读数据
  2. 不可重复读
  3. 脏读(幻读)

为了解决以上三个问题,事务隔离:隔离性  四种级别

  1. 读未提交   哪种都不解决(效率最高,最不安全)1
  2. 读已提交   脏读                              2
  3. 可重复读   脏读和不可重复读(最常用的Mysql默认的级别就是4)
  4. 串行化     所有的问题都解决(效率最低)

Hibernate中事务的应用:

事务应该在service层开启和提交或者回滚。

事物的开启需要 session

获得session有两种方式:openSession  每次打开都是一个新的

                                          GeiCurrentSession  线程绑定的session

Service层有session

Dao也层有session  这两个session必须保证是同一个session

这样事务的提交才能起到作用

Hibernate框架中所有增删改 都必须提交事务性才能最终修改到数据库

所以在增删改操作中必须使用getCurrentSession

 

使用currentSession必须在配置文件中加入属性

<property name="hibernate.current_session_context_class">thread</property>

表与表之间的关系:

1对1关系   

1对多关系

多对多关系

Hibernate维护一对多关系:

在实体类中加上对应的属性

职工类  加入一个 企业类型属性

企业类  加入职工集合  set

在配置文件中增加以下代码:

多的一方

<many-to-one name="enterprise" class="Enterprise" column="enterpriseId"></many-to-one>

一的一方

<set name="employees">
     <key column="enterpriseId"></key>
     <one-to-many class="cn.hd.bean.Employee"></one-to-many>
</set>

在代码中维护关系时

要为两方都添加对应的属性

级联操作:

Cascade

取值为:delate  create  save-update   all

加在多的一方   在代码中就要使用多的一方维护

加在一的一方   就要用一的一方维护

关系维护:

inserse  true  就是放弃维护关系

让一的放弃(字段多为一方)

多对多关系:

Hibernate的查询方式:

crud

Crud:增查改删的英文首字母

save:保存

delete: 删除

update: 更新

get: 查询

get方法  需要主键和class文件

hql

比较常见

criteria

适用于单表

sql

  1. 适用于复杂查询
  2. 对象导航查询

分页查询

排序查询

基本条件查询

模糊查询

  多表查询:

   1. 笛卡尔积

A 集合 B  集合

A集合中和B集合中所欲的元素,自由组合生成新的数据

     2. 内连接

隐式内连接

SELECT * from t_employee,t_enterprise WHERE t_employee.enterpriseId=t_enterprise.id;

显式内连接
SELECT * from t_employee t1 INNER JOIN t_enterprise t2 on t1.enterpriseId = t2.id;

     3.外链接

右外连接

左外链接和右外连接没什么太大区别

Hibernate 实现多表查询

迫切内连接:

内连接:

区别就是:  结果的封装是一个数组(普通)  一个对象(迫切)

检索策略:

Hibernate缓存技术

Hibernate 默认开启一级

二级缓存(废弃)  redis

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值