hibernate

Hibernate——建立第一个hibernate项目 背景:今天学习了考研内容。 阅读详情

hibernate和jdbc对比

jdbc缺点

    1、编程的时候很繁琐,用的try和catch比较多

    2、jdbc没有做数据的缓存

    3、没有做到面向对象编程

    4、sql语句的跨平台性很差

jdbc的优点

    效率比较高

hibernate的优点

       1、完全的面向对象编程

       2、hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存   重点

    3、编程的时候就比较简单了

    4、跨平台性很强

    5、使用场合就是企业内部的系统

hibernate的缺点

    1、效率比较低

    2、表中的数据如果在千万级别,则hibernate不适合

    3、如果表与表之间的关系特别复杂,则hibernate也不适合


利用hibernate实现crud的操作

步骤

1、创建一个工程
2、导入jar包

             

        说明:

            javassist包是用来创建代理对象的

              代理对象的三种创建方式:

                    1、jdkproxy

                    2、cglib

                    3、javassist

           jta: Java Transaction API,是sun公司给分布式事务处理出来的规范

3、hibernate.cfg.xml

       主要的用途:

         告诉hibernate连接数据库的信息,用的什么样的数据库(方言)

         根据持久化类和映射文件生成表的策略

4、持久化类和映射文件
5、生成表
6、客户端

说明

hibernate.cfg.xml文件的加载

   


 

    可以指定配置文件的路径,配置文件可以随意放

sessionFactory

1、hibernate中的配置文件、映射文件、持久化类的信息都在sessionFactory中

2、sessionFactory中存放的信息都是共享的信息

3、sessionFactory本身就是线程安全的

4、一个hibernate框架sessionFactory只有一个

5、sessionFactory是一个重量级别的类

session

1、得到了一个session,相当于打开了一次数据库的连接

2、在hibernate中,对数据的crud操作都是由session来完成的

transaction

 hibernate中的事务默认不是自动提交的

  

      设置了connection的setAutoCommit为false

     只有产生了连接,才能进行事务的操作。所以只有有了session以后,才能有transaction

流程

内部执行原理

根据表生成持久化类和映射文件

把一个工程变成hibernate工程

把数据库引入到myeclipse中

类型

hibernate类型

   这个效率比较低

java类型

   该种类型的效率比较高

在hibernate内部,为了一张表,这张表中有如下的映射关系:

   hibernate类型       java类型        数据库的字段的类型

      string            java.lang.String   varchar/varchar2

对象的状态

      

 


 

save

       该方法可以把一个对象从临时装填转换成持久化状态

get

    从数据库中根据主键提取出一个对象,该对象就是一个持久化状态的对象

update

把一个对象变成持久化状态

evict

把一个对象从持久化状态转化为脱管状态

clear

把所有的hibernate中的持久化对象都转换成脱管状态的对象

flush

副本

缓存

     oscache,ehcache    小型的应用

     memorycache,redis,hbase   分布式的应用



一级缓存

概念:为session级别的缓存,一级缓存的生命周期和session的生命周期保持一致

位置:

操作:

get方法:

  可以把对象放入到一级缓存中,也可以从一级缓存中把对象提取出来

save方法:

  可以把一个对象放入到一级缓存中

evit方法:

  可以把一个对象从session的缓存中清空

update方法:

  可以把一个对象放入到一级缓存(session)中

clear方法:

  清空一级缓存中所有的数据

close方法:

  当调用session.close方法的时候,一级缓存的生命周期就结束了



二级缓存

适用的场合

  公开的数据

  数据基本不发生变化

  该数据保密性不是很强

说明:如果一个数据一直在变,不适合用缓存


生命周期

 二级缓存的生命周期和sessionFactory是一致的


位置


设置二级缓存

利用的是ehcache实现的二级缓存

1.在hibernate的配置文件中

2.指定哪个类开启二级缓存

操作

get方法,list方法可以把一个或者一些对象放入到二级缓存中

get方法,iterator方法可以提取


策略

<cache usage=""/>

read-only:对象只要加载到二级缓存以后,就只能读取了,不能进行修改。

read-write:对二级缓存中的对象能够进行读和写的操作


查询缓存

    一级缓存和二级缓存都是对象缓存:就是把该对象对应的数据库表中的所有的字段

    全部查询出来了,这种查询在某些场合下会让效率降低。例如:表中的字段特别多,

    但是程序中所需要的字段却很少。

      查询缓存也叫数据缓存:内存(页面)中需要多少数据就把多少数据放入到查询缓存中。


生命周期

只要一些数据放入到查询缓存中,该缓存就会一直存在,直到缓存中的数据被修改了,该缓存的生命周期就结束了


操作步骤

在hibernate的配置文件中,开启查询缓存

<property name="cache.use_query_cache">true</property>

总结

hibernate总共有三种缓存

    一级缓存解决的问题是在一次请求中,尽量减少和数据库交互的次数,在session.flush之前,改变的是一级缓存的对象的属性。当session.flush的时候才要

跟数据库交互,一级缓存解决不了重复查询的问题。一级缓存是对象缓存

    二级缓存可以把经常不改变、常用的公共的数据放入进来,可以重复查询,利用get方法和iterator方法可以把二级缓存中的数据得到。

    查询缓存可以缓存数据或者对象,可以利用list方法把数据放入到缓存中。


sessionFactory.getCurrentSession

在hibernate.cfg.xml文件中

<property name="current session context class">thread</property>

如果用该方法产生session,则crud操作必须在事务的环境下运行

当执行transaction.commit 的方法时,session自动关闭


说明:

   这么做相当于把session与transaction绑定在一起了。当事务提交的时候,session最好不要关闭,因为如果事务提交以后,再做关于

数据库的操作,就不能做了


关系操作


一对多的单向

inverse与casade的关系

  cascade指的是级联操作,操作的是一般属性,指的是对象与对象的操作

  inverse指的是关系操作,针对的就是外键

一对多的双向

当多的一方维护关系时,不会发出更新关系的update语句,而一的一方维护关系时,需要发出维护关系的update语句,所以,

一般情况下,多的一方维护关系效率比较高

多对多

多对多建立关系相当与在第三张表中插入一行数据

多对多解除关系相当于在第三张表中删除一行数据

多对多修改关系相当与先删除后增加

多对多谁维护效率都一样,看需求


lazy

需要数据的时候才要加载

类的懒加载

session.load方法产生的是代理对象,该代理类是持久化类的子类

集合的懒加载

set的延迟加载:true、false、extra

说明:

 1.因为延迟加载在映射文件设置,而映射文件一旦确定,不能修改

 2.延迟加载是通过控制sql语句的发出时间来提高效率的

manytoone的懒加载

对性能来说,没什么影响

抓取策略

fetch=“”

join:左外连接

select:默认的值

subselect:子查询

说明:

 1.因为抓取策略的设置在映射文件中,所以一旦映射文件生成就不能改变了

 2.通过发出怎么样的sql语句加载集合,从而优化效率


hql语句

单表

from Classes


select cid,name from Classes

select new 类的全限定名(cid,name) from Classes

select count(cid) from Classes

结果为Long类型的数据,该表的总行数



一对多

from Classes c inner join c.students

from Classes c inner join fetch c.students

from Classes c left outer join fetch c.students


Criteria查询


sql查询


错误分析

错误1

该Person在hibernate的映射文件中没有找到:

    1、在hibernate的配置文件中没有加载对应的映射文件

    2、也有可能是客户端的session的操作对象在映射文件中找不到


错误2

在映射文件中找不到该类,因为类写错了


错误3

当在hibernate内部生成sql语句的时候,要给insert语句赋值,值从属性的getter方法中得到,在拼接getter方法的时候,出错了


错误4

在执行session.get方法的时候,会利用Java的反射机制创建一个对象,利用的是默认的构造函数,所以一个持久化类中必须有一个默认的构造函数


错误5

要求主键必须在程序中进行设置


错误6

主键的生成策略支持表的主键的值的自动增长,但是该表本身没有这样的机制


错误7

错误解析:在flushing之前,保存一个临时状态的对象

前提条件:在Class.hbm.xml文件中,set集合中没有设置级联


错误8

错误原因:当一个对象从数据库中加载数据的时候,session已经关闭了

所有的数据在数据库中加载出来以后,session才能关闭

hibernate还有人用吗 🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪,专注Java硬核干货分享,立志做到Java赛道全网Top N。🏆本文收录于,,目前已经700+订阅,CSDN最强Java专栏,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例,理论结合实战,实现Java的轻松学习。🏆姐妹篇,,包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识点。🏆姐妹进阶篇, 阅读详情

相关推荐

JDBCHibernate区别

JDBCHibernate在性能上相比,JDBC灵活性有优势。而Hibernate在易学性,易用性上有些优势。当用到很多复杂的多表联查和复杂的数据库操作时,JDBC有优势。 相同点: ◆两者都是JAVA的数据库操作中间件。 ◆两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。 ◆两者都可以对数据库的更新操作进行显式的事务处理。 不同点: ◆使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL(Hibernate query language)语言 ◆操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。 ◆数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。 JDBCHibernate读取性能 。 。 。 。 。 。 。 。

HibernateJDBC的区别

HIbernate:   1.概念:ORMapping (对象关系映射)     1)操作数据库的框架,底层是通过JDBC操作数据库的     2)用面向对象的方式操作数据库   2.JDBC的缺点:     1)代码繁琐     2)不是面向对象的数据库操作     3)资源关闭的代码也很繁琐     4)没有做到数据库缓存     5)移植性比较差(MySQL无法移植到Oracle)    JDBC优点:     1)因为是底层操作所以效率高        3.Hibernat

aiwokache的博客 803

jdbchibernate的区别

jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别jdbchibernate的区别

jdbc,mybatis,hibernate各自优缺点及区别

由于JDBC存在的缺陷,在实际工作中我们很少直接使用jdbc进行编程,用的更多的是ORM对象关系模型来操作数据库,就是一个ORM模型。

花&败 819

java数据操作——HibernateJDBC

  这是我第一次写技术博文,喜欢大家提出宝贵意见。这篇文章主要想讲三个问题。   第一:HibernateJDBC的区别。   作为java程序员,我觉得弄清楚HibernateJDBC的区别,不仅对打好扎实的基本功比较重要,就是以后的学习,开发也具有相当的借鉴意义。可惜的是现在有好些程序员不屑于学习JDBC,觉得它落伍了,在他们的心目中Java数据库连接始祖(JDBC)远没有ORM(

kehongyong的专栏 735

Java中jdbchibernate、mybatis浅析

jdbc,java database connectivity,是java连接数据库操作的原生接口。jdbc是所有框架操作数据库所必须的,是数据库的统一接口标准。 orm,object relational mapping,一般指对象关系映射,是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。 jpa,是orm框架的统一接口标准,即orm框架的规范。 hibernate,是一个标准的orm框架,实现了jpa接口,可理解成jpa是接口,hibernate是实现类。

ldcaws的专栏 1180

数据库操作【JDBC & HIbernate & Mybatis】

jdbc,mybatis,hibernate

菜鸟零号 kungfu~peng 880

UFS Hibernate介绍--代码部分

一 . UFS Hibernate简介

guozhidixian的博客 3822

UFS Hibernate介绍--协议部分

一. UFS Hibernate 简介 Hibernate是一种Unipro的状态,这个Hibernate 进出的流程是在M-PHY定义的。 Hibernate 是一种 UniPro 状态,其中 PHY 处于 HIBERNATE_STATE,UniPro 堆栈保持 只有最小的一组功能处于活动状态。 UniPro 堆栈保留每个堆栈层定义的最小状态。 在休眠期间,UniPro 堆栈无法进行应用级数据传输/通信, 并且应用程序级接口的原语 T_CO_SAP 具有未定义的行为。 中 休眠,DME 继续可供 DM

guozhidixian的博客 3885

hibernate进阶】hibernate搭建开发环境+实例讲解

本篇博客将带着大家以一个简单的实例来学习hibernate项目。 1、创建java项目 2、创建User Library,加入依赖包 * HIBERNATE_HOME/lib/*.jar * HIBERNATE_HOME/hibernate3.jar * 加入数据库驱动(mysql驱动) 具体的操作步骤参考我的上一篇博客:【hibernate进阶】如何在myeclipse中添加ja

陈晓婵 8411

hibernate实战

离下班还有半个小时,写这个东东吧。 今天写了个hibernate实例。 第一步:向工程中添加hibernate的lib           * HIBERNATE_HOME/hibernate3.jar           * HIBERNATE_HOME/lib/*.jar           * 数据库 jdbc驱动 第二步:写hibernate.cfg.xml文件如下,这里有连接数据库,设置数据库方言,注册类映射文件User.hbm.xml(后面会提到)   jdbc:m

bluekeyv的专栏 834

Springboot整合Hibernate拦截器EmptyInterceptor

Springboot整合Hibernate拦截器EmptyInterceptor

2017年 5616

有关HIBERNATE

 有关HIBERNATE继承实现的三种策略 单表继承。每棵类继承树使用一个表(table per class hierarchy)  具体表继承。每个子类一个表(table per subclass)  类表继承。每个具体类一个表(table per concrete class)(有一些限制) 单表继承     双向关联  概念:双向关联允许通过关联的任一端访问另外一端。

summer的专栏 679

HIBERNATE是什么

无意中,一个朋友问我HIBERNATE是什么。这个问题让我很震惊。学了这么久。用了半年的HIBERNATE,对它就像自己的孩子。可是我连它的是什么我都不是很清楚。我能说HIBERNATE就是框架吗?这样也太让HIBERNATE默默无闻了。最起码框架这个词也太抽象了,讲给任何没接触过HIBERNATE的人,他们都不会理解。于是我去网上COPY了一份。希望大家好好理解。Hibernate是一个开放

chowqingbao1的专栏 1457

Hibernate批量处理海量

最近一直常常看到别人javaeye网站上看到别人在问在hibernate怎么样处理海量数据,怎么样提高性能,本人在CSDN博客上看到这篇好的文章,并结合本人一一验证 确实如作者所说 故拿出来和大家分享。希望对初学HIBERNATE框架的朋友有所帮助。  Hibernate批量处

雪禅子 4846

hibernatejdbc的比较

hibernatejdbc相比较的主要优点是: 一、面向对象:hibernate可以让开发人员以面向对象的思想来操作数据库。jdbc只能通过SQL语句将元数据传送给数据库,进行数据操作。而hibernate可以在底层对元数据和对象进行转化,使得开发者只用面向对象的方式来存取数据即可。 二、移植性:hibernate使用xml或JPA的配置以及数据库方言等等的机制,使得hibernate具有更好的

Dk先生的专栏 646

jdbc

jdbc是什么? java database connectivity (java数据库连接)是一组接口,之所以会有它,就是使用java操作各种数据库。 hibernate是ORM框架,它封装了jdbc,使程序员以更加简单的方式开发数据访问层,使开发中不再出现重复冗余的代码。 mysql-connector-java-5.1.40-bin.jar就是由mysql官方实现的驱动,jar包实现

share_free的博客 2378

数据库操作 ORM 框架:JDBCHibernate、MyBatis 比较

JDBC 是 Java 提供的数据库访问 API,允许 Java 应用程序多种数据库进行交互。它提供了一套标准的接口和类,以执行 SQL 语句、获取结果集并处理数据库连接。Hibernate 是一个开源的 ORM 框架,它通过将数据库表映射为 Java 对象,简化了数据库操作。开发者可以通过对象操作而不是直接执行 SQL 来访问数据库。MyBatis 是一个半自动的 ORM 框架,它提供了 SQL 映射的能力,允许开发者编写原生 SQL,并通过 XML 或注解的方式进行映射。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 940
上一篇: Struts2
qzquuu
博客等级 码龄10年 0粉丝 16原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值