Hibernate详解

补充学习hibernate

一、概念

Hibernate是一个开源的、轻量级的ORM(对象关系映射)工具。ORM工具简化了数据创建、处理和访问,是将对象映射到数据库中存储的数据(表)的编程技术。

ORM工具内部使用JDBC API与数据库进行交互

PO(持久化对象,用于完成持久化操作)=POJO(持久化类,普通的传统的java对象)+持久化注解


二、优点

Hibernate框架有很多优点。它们分别如下:

开源和轻量级

快速性能: Hibernate框架的性能很快,因为缓存在Hibernate框架内部使用。 hibernate框架中有两种类型的缓存:一级缓存和二级缓存。一级缓存默认是启用的。

数据库独立查询: HQL(Hibernate查询语言)是面向对象的SQL版本。 它生成数据库独立查询。 所以你不需要编写数据库特定的查询语句。 在Hibernate之前,如果项目更改了数据库,我们需要更改SQL查询,从而导致维护变得非常复杂。

自动创建表: Hibernate框架提供了自动创建数据库表的功能。 因此,无需手动在数据库中创建表。

简化复杂连接: 在hibernate框架中可轻松获取多个表中的数据。

提供查询统计和数据库状态: Hibernate支持查询缓存,并提供有关查询和数据库状态的统计信息。


三、hibernate架构:

hibernate架构中有4层Java应用层,hibernate框架层,反手api层和数据库层。

体系结构要素:

1.会话工厂(SessionFactory):提供工厂方法获取Session的对象。

2.会话(Session):提供应用程序和存储在数据库中的数据之间的接口。接口提供插入,更新和删除对象的方法。 它还提供了事务,查询和标准的工厂方法。

3.事务(Transaction):可选项

4.连接提供者(ConnectionProvider):JDBC连接工厂。 它从DriverManager或DataSource抽象出来的应用程序。可选项。

5.事务工厂(TransactionFactory):可选项。


四、应用程序配置框架

创建一个java项目

为hibernate添加jar文件

创建持久类(一整个数据模型,类名是表名,有setter和getter方法)

创建持久类的映射文件(直接对持久类右键生成对应映射文件,xxx.hbm.xml)

创建配置文件(hibernate.cfg.xml:包含数据库所有内容,详解在下面)

创建检索或存储持久对象的类

运行应用程序



前阵子自学了hibernate  有点忘记了 写个博客顺便记录一下免得我很快忘了。

记操作不怎么记知识点。

这里是用eclipse 然后数据库用的mysql 不过我用navicat premium来管理数据库。

(navicat premium是一个很轻量级数据库管理工具,可以连接多种数据库Mysql啊 oracle啊 sqlserver都可以 之所以用它是因为觉得它启动快,在我只是需要查看数据库数据的情况下,挺方便的,好过去打开mysql。它在网上可以找到免费的破解版)

项目目录

其实都还不算项目 只是自己试着用hibernate连数据库进行简易的操作。

1.启动mysql服务 (我经常忘记这步导致最后数据库连接不上),

2.打开navicat premium连接mysql数据库

3.实体类是Address类和Students类

Address类:

Students类:

然后其实Students下面也都是写getter、setter方法了 ,记住要重写一个tostring方法,自动生成的那种,这主要是为了之后输出可以成功,否则数据库查找操作会报错。

为了比较有代表性,所以有一个Address属性,到时候关联hibernate要多一些操作,还有Blob类型的,尝试一下传图片类型的。

4.实体类创建完就直接对着那个包鼠标右键生成映射文件,注意后缀,选hbm.xml

下一步选择关联Students类

写映射文件(中间注释掉的是我一开始没写Address类,而写的String类的Address)

有点记不清了,但这里的代码记得是自动关联实体类的属性生成的,不用写。

也解释一下:

class name 类名,然后定义了生成的表名是student(一般与实体类名一致,也可以自己改)

然后下面就是映射类的各个属性。

此处的hibernate对象关系映射也可以不用,可以使用hibernate注解在实体类上标注。

5.接着对这个项目生成一个hibernate.cfg.xml,是hibernate的配置文件。

(是在src下而不是src的目录下)

注释有干货!!

基本上的配置就是这些,注释有干货!!!

6.写测试类。

同项目下建了另一个测试包和实体类包名一致,类名为StudentTest

使用JUnit测试 

@Before:初始化方法

@Test:测试方法

@After:释放资源


这两部分代码是不修改的,增删改查操作主要是在test方法中

一、插入数据:

在目录方法对应位置右键run as junit执行

进度条绿色的表示执行成功

看一下navicat中已经建了student表,并插入了数据

增加操作完成(此时没有插入图片)

这里尝试再添加一个图片流,

增加了输入流,图片是用blob定义

junit执行,成功,再看一下navicat

此时插入了图片

二、修改操作

注意此时要把hibernate配置中的hibernate.auto改成update否则会失败

然后增加修改的test方法:

junit执行一下,再查看navicat:

已经修改成功了

三、查找操作

同样是要把hibernate配置中的hibernate.auto改成update否则会失败

1.查找并在控制台输出整项的所有数据:(注意在所有实体类中一定要先重写toString方法)

执行,成功后看一下控制台,已经成功输出了。

前面的几行是执行的sql语句,后面就是输出结果

2.查找并输出图片:

注意此时要把hibernate配置中的hibernate.auto改成update否则会失败

junit执行,成功啦,然后就看到输出的图片就是我输入的图片(TT的照片hhh)

四、删除操作

同样是要把hibernate配置中的hibernate.auto改成update否则会失败

删除操作的代码

junit执行,然后查看navicat

发现已经是空表了


总结一下,hibernate进行单表操作的时候,session的一些操作:

session.save():保存数据(这主要是用在插入数据的时候)

session.update(): 更新数据(用于修改数据的时候)

session.delete():删除数据(用于删除数据的时候)

session.get():查询单个记录(用于查询、修改、删除的第一步取数据,调用后会立即向数据库发出sql语句,返回持久化对象,不存在则返回null)

session.load():查询单个记录(用于查询、修改、删除的第一步取数据,调用后返回一个代理对象,只保存了实体对象的id,直到使用对象的非主键属性才会发出sql语句,查询不存在,则抛出异常)


以上 是用hibernate进行简单数据库操作。

自学了hibernate注解 但这里不贴了

以后更多还是贴代码吧 关于hibernate的学习 这一部分还会再补充的。


五、hibernate映射

1、使用持久化注解:(主流)

@Entity:声明该类是一个hibernate的持久化类

@Table:指定该类的映射的表

@Id:用于指定该类的标识属性

@GeneratedValue:指定主键生成策略(strategy=GenerationType.IDENTITY 自动增长的生成策略)

2、使用JPA提供的XML配置描述文件(很少用)

3、使用Hibernate传统的XML了映射文件(.hbm.xml):少数用


六、Hibernate配置文件:

1、hibernate.properties:会提供属性,但是要自己手动添加持久化类,因此开发中少使用

2、hibernate.cfg.xml:常用 

 Configuration cfg=new Configuration().configure();

3、不使用配置文件


七、配置属性:

1、数据库相关配置:dirver_class、url、username、password

2、方言:决定数据库

<property name="dialect" >org.hibernate.dialect.MySQLDialect</property>

3、其他常用配置属性:

hibernate.show_sql:是否控制台输出sql语句

hibernate.format_sql:是否将SQL转成格式良好的sql

hibernate.connection.autocommit:是否自动提交

hibernate.hbm2ddl.auto:(1)create:每次都重新建表,会丢失前面插入的数据 (2)create-drop:每次显式关闭时,程序会自动drop刚刚创建的表 (3)update:会保留数据(常用)


八、对hibernate体系结构各对象解析:

SessionFactory:单个数据库映射关系经过编译后的内存镜像,是线程安全的,是生成session的工厂。依赖于ConnectionProvider。

Session:应用程序与持久存储层之间交互操作的一个单线程对象。所有持久化对象都必须在session管理下才可进行持久化操作。该对象生存期很短,它底层封装了JDBC连接,也是Transaction的工厂。,在显式执行flush之前,所有持久化操作的数据都在缓存中的session对象处。

持久化对象(POJO实例):可以是普通实例

事务(Transaction):代表一次原子操作,具有数据库事务的概念。一个session内可能包含多个transaction对象。

连接提供者(ConnectionProvider):是生成JDBC连接的工厂,通过抽象将应用程序与底层的DataSource或DriverManager隔离开,无须应用程序直接访问,仅在应用程序需要扩展时使用。

事务工厂(TransactionFactory):是生成Transaction对象实例的工厂,无需应用程序直接访问。负责对底层具体事务实现进行封装,将底层具体的事务抽象成hibernate事务。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persi...
    大同若鱼阅读 4,310评论 4 27
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 1,967评论 0 27
  • 测试用PDO方式进行预处理语句插入数据,发现选定了数据库名,但是不生效的BUG(无效的数据库名),原来是前后有关系...
    hello大象阅读 3,833评论 1 1
  • 积极主动不仅指行事的态度,还意味着人一定要对自己的人生负责。个人行为取决于自身的抉择,而不是外在环境,人类应该有营...
    锦潇阅读 364评论 2 3
  • 想让这风带去我的思念 又怕北风无情使你着凉 这样的天气啊 多着件衣裳 期盼见面时 再诉衷肠
    李吱呦阅读 154评论 0 0