Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Hibernate的搭建

Hibernate的搭建

作者头像
用户10175992
发布于 2022-11-15 05:36:38
发布于 2022-11-15 05:36:38
55000
代码可运行
举报
文章被收录于专栏:辰远辰远
运行总次数:0
代码可运行

1 Hibernate概述

       Hibernate是Java世界中使用最广泛的数据持久化框架,使用ORM(对象关系映射)模式简化关系型数据库的的数据增删改查功能。

1.1 数据持久化

数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。数据模型可以是任何数据结构或对象模型,存储模型主要是关系型数据库,还可以是XML、二进制流等。在Java中提供了JDBC组件来实现对象和数据库之间的持久化。

1.2 ORM框架

(1)JDBC的不足

直接使用JDBC开发具有以下问题:开发效率低、代码冗余高和重复性工作多。为了减少数据库开发中的管道代码,把开发精力集中在解决业务问题上,Java世界出现了很多的持久化框架,比较著名的有:Hibernate、MyBatis、TopLink(Oracle商业产品)等。

(2)ORM框架

对象关系映射(ORM,Object Relation Mapping)是持久化框架经常采用的技术模式。Object是指编写程序的时候,以面向对象的方式处理数据;Relation是指保存数据的时候,以关系型数据库的方式存储;而ORM框架则通过映射信息自动完成Java对象与数据库表之间的存取。

1.3 Hibernate

Hibernate是Java世界最经典的对象关系映射框架,堪称ORM技术的典范,简化了JDBC繁琐的编码,大大增加程序可靠性。

Hibernate的创始人Gavin King是EJB3.0专家委员会成员,EJB 3.0 JPA规范的主要制定者,是JBoss核心开发者之一著有《Hibernate in Action》一书。

2 Hibernate起步

       下面通过简单的示例,介绍Hibernate的基本用法。

(1)导入hibernate依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
           <!-- mysql jdbc驱动,或替换为Oracle的jar包 -->

              <dependency>

                     <groupId>mysql</groupId>

                     <artifactId>mysql-connector-java</artifactId>

                     <version>5.1.8</version>

              </dependency>

              <!-- Hibernate 3.6.10, Core+Annotation -->

              <dependency>

                     <groupId>org.hibernate</groupId>

                     <artifactId>hibernate-core</artifactId>

                     <version>3.6.10.Final</version>

              </dependency>

              <!-- 为Hibernate 提供支持 -->

              <dependency>

                     <groupId>javassist</groupId>

                     <artifactId>javassist</artifactId>

                     <version>3.9.0.GA</version>

              </dependency>

(2)构建Hibernate主配置文件

       在项目“类路径”下,添加hibernate.cfg.xml配置文件.

该文件主要配置JDBC连接、SQL方言和实体映射文件的位置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- 数据库连接配置 -->

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="connection.url">jdbc:mysql://localhost:3306/MyCinema</property>

        <property name="connection.username">root</property>

        <property name="connection.password">1234</property>

        <!-- SQL方言(Dialect)配置 -->

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

        <!-- 是否显示执行的SQL语句 -->

        <property name="show_sql">true</property>

              <!-- 是否格式化SQL语句 -->

        <property name="format_sql">true</property>

        <!-- 配置实体映射文件路径 -->

        <mapping resource="mapping/Category.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

(3)编写实体映射文件

在项目类路径下创建mapping文件夹,在其下创建“实体映射文件”,描述Java对象和数据库表的对应关系。

实体映射文件中元素功能如下:

  1. class元素用于声明Java类和数据库表的映射关系

2)id 元素用于声明主键属性映射,name属性用于指定对象属性名,column用于指定对应的表字段名

3)id中的generator子元素用于指定主键的生成策略,常见的策略有identity(自增长字段)、sequence(Oracle序列)、native(自适应)、uuid(全局唯一编号)等。

4)property元素用于声明普通属性映射

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    

       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="demo.entity">

    <class name="Category" table="CATEGORY">

              <id name="id" column="ID">

                     <generator class="identity" />

              </id>

        <property name="name"  column="NAME"/>

    </class>

</hibernate-mapping>

(4)编写查询功能

       要实现查询Hibernate需要使用以下几个重要对象

  1. Configuration:用于加载配置信息(hibernate.cfg.xml),是SessionFactory的工厂。
  2. SessionFactory:Session的工厂,用于维护数据库连接池和二级缓存。在一个应用程序中,一般只需要一个SessionFactory对象,应用单例模式维护其唯一性。
  3. Session:代表Hibernate与数据库之间的一次回话,维护数据连接和一级缓存,该对象不是线程安全的,应该每次使用前创建用完关闭,建议保存在方法或请求级别。
  4. Query:用于执行HQL查询语句的工具对象,由Session对象创建。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      public static void main(String[] args) {

              Configuration cfg = new Configuration();                //创建Configuration对象

              cfg.configure();                                                      //读取配置文件

              SessionFactory factory = cfg.buildSessionFactory(); //创建SessionFactory对象

              Session session = factory.openSession();                 //获取Session

              Query query = session.createQuery("from Category");    //创建查询对象

              List<Category> list = query.list();                            //执行查询

              for(Category c : list){

                     System.out.println(c.getName());

              }

              session.close();                                                       //关闭Session

       }

3 Hibernate中持久化对象的三种状态

       在Hibernate框架中的持久化对象有三种状态:瞬时状态(临时状态)、持久状态、游离状态。

(1)瞬时状态(Transient)

  通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态。

Session对于瞬时状态的Java对象是一无所知的,当对象不再被其他对象引用时,它的所有数据也就丢失了,对象将会被Java虚拟机按照垃圾回收机制处理。

(2)持久状态(Persistent)

  当对象与Session关联,被Session管理时,它就处于持久状态。处于持久状态的对象拥有数据库标识(数据库中的主键值)。

  那么,对象是什么时候与Session发生关联的呢?有两种方法:

第一种,通过Sesison的查询接口,或者get()方法,或者load()方法从数据库中加载对象的时候,加载的对象是与数据库表中的一条记录关联的,此时对象与加载它的Session发生关联;

第二种,瞬时状态的对象,通过Session的save()方法或SaveOrUpdate()方法时,Java对象也与Session发生关联。

对于处于持久状态的对象,Session会持续跟踪和管理它们,如果对象的内部状态发生了任何变更,Hibernate会选择合适的时机(如事务提交时)将变更固化到数据库中。

(3)游离状态(Detached)

  处于持久状态的对象,脱离与其关联的Session的管理后,对象就处于游离状态。

  处于游离状态的对象,Session无法保证对象所包含的数据与数据库中的记录一直,因为Hibernate已经无法感知对该对象的任何操作。

Session提供了两个方法(update()、merge()),将处于游离状态的对象,与一个新的Session发生关联。

Hibernate中对象的三种状态的相互转换机制如下图所示。

4 实现DAO模式

(1)封装一个用于构建Session对象的工具类

       为维护SessionFactory的全局单例,建议创建一个HibernateUtil工具类对其进行封装。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HibernateUtil {

       private static SessionFactory factory;                //确保单例

       static{

              Configuration cfg = new Configuration();

              cfg.configure();

              factory = cfg.buildSessionFactory();

       }

       public static Session openSession(){

              return factory.openSession();

       }

}

(2)添加DAO组件并实现增删改查功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CategoryDaoImpl implements CategoryDao {

       public List<Category> getAll() {

              Session sess = HibernateUtil.openSession();

              try{

                     return sess.createQuery("from Category").list();

              }finally{

                     sess.close();

              }

       }

       public Category fetchById(int id) {

              Session sess = HibernateUtil.openSession();

              try{

                     return (Category)sess.get(Category.class, id);

              }finally{

                     sess.close();

              }

       }

       public void add(Category entity) {

              Session sess = HibernateUtil.openSession();

              Transaction tx = null;

              try{

                     tx = sess.beginTransaction();

                     sess.save(entity);

                     tx.commit();

              }catch(RuntimeException ex){

                     if(tx!=null)

                            tx.rollback();

                     throw ex;

              }finally{

                     sess.close();

              }

       }

       public void update(Category entity) {

              Session sess = HibernateUtil.openSession();

              Transaction tx = null;

              try{

                     tx = sess.beginTransaction();

                     sess.update(entity);

                     tx.commit();

              }catch(RuntimeException ex){

                     if(tx!=null)

                            tx.rollback();

                     throw ex;

              }finally{

                     sess.close();

              }

       }

       public void delete(int id) {

              Session sess = HibernateUtil.openSession();

              Transaction tx = null;

              try{

                     tx = sess.beginTransaction();

                     sess.delete(sess.get(Category.class, id));

                     tx.commit();

              }catch(RuntimeException ex){

                     if(tx!=null)

                            tx.rollback();

                     throw ex;

              }finally{

                     sess.close();

              }

       }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hibernate文件配置
映射需要通过XML的配置文件来完成,这个配置文件尽量统一(xxx.hbm.xml) Hibernate核心的配置:必须的配置、可选的配置、映射文件的引入
用户3112896
2019/09/26
4310
Hibernate文件配置
java之hibernate之crud
这篇文章主要讲解:   1>.对Hibernate使用的一些简单封装; ·  2>.在单元测试中,使用Hibernate的封装的工具进行增删改查的测试 1.目录结构展示 2.代码展示 2.0 配置文件
Vincent-yuan
2019/09/11
3980
java之hibernate之crud
IDEA 下新建 Hibernate 项目
Hibernate 概述 什么是 Hibernate 一个 Java 领域的持久化框架 一个 Java 领域的ORM 框架 什么是持久化 持久化是指把对象永久保存到数据库中 持久化包括和数据库相关的各种操作(增、删、改、查) 什么是 ORM ORM 是指对象关系映射(Object/Relation Mapping) ORM 将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转换为对对象的操作 面向对象概念中的类对应着面向关系概念中的表,对象对应着表的行,属性对应着表的列
bgZyy
2018/07/05
9430
javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之二 基础Hibernate框架搭建篇
   我们在搭建完Struts框架之后,从前台想后端传送数据就显得非常简单了。Struts的功能不仅仅是一个拦截器,这只是它的核心功能,此外我们也可以自定义拦截器,和通过注解的方式来更加的简化代码。   接下来就开始Hibernate的框架的开发。Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数
ShenduCC
2018/04/27
6520
javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之二 基础Hibernate框架搭建篇
Java ORM Hibernate 入门笔记
一、下载 官网地址:http://hibernate.org/ Hibernate下有ORM(关系型数据库)、OGM(NoSQL数据库)、Search(对象全文检索)、Validator的工具。 ORM 5.2下载地址为:http://hibernate.org/orm/releases/5.2/ 使用时,将Hibernate Lib下的required Jar包引入即可,其他高级功能可继续引用相关包。 二、工具 Hibernate通过XML将对象映射到数据库表,可以通过Hibernate Tools自动生
用户1637609
2018/04/12
1.1K0
Java ORM Hibernate 入门笔记
Hibernate初级入门
private String userName;<—————>t_userName(这个我们要通过映射文件来创建)
全栈程序员站长
2022/06/30
4410
Hibernate的缓存机制如何应用?
2.一级缓存应用: save()。当session对象调用save()方法保存一个对象后,该对象会被放入到session的缓存中。 get()和load()。当session对象调用get()或load()方法从数据库取出一个对象后,该对象也会被放入到session的缓存中。 使用HQL和QBC等从数据库中查询数据。
小小鱼儿小小林
2020/06/24
4610
hibernate笔记(一)
原始的jdbc操作, Connection/Statement/ResultSet
HUC思梦
2020/09/03
8340
SSH框架之Hibernate第一篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/09/18
5900
探索Hibernate的奥秘:简解其使用与实现过程
在现代的Java开发中,数据持久化是一个至关重要的环节。而在众多持久化框架中,Hibernate以其强大的功能和灵活性,成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法,希望能为广大开发者提供一些有价值的参考。
繁依Fanyi
2024/06/23
3430
Hibernate基础知识
CBeann
2023/12/25
1350
[ SSH框架 ] Hibernate框架学习之一
 CRM(Customer Realationship Management)客户关系管理,是利用相应的技术信息以及互联网技术来协调企业与顾客间在销售、营销和服务上的交互,向客户提供创新式的个性化的客户交互和服务的过程。其最终目标是将面向客户的各项信息和活动集成起来,组建一个以客户为中心的企业,实现对面向客户的活动的全面管理。
Kevin_Zhang
2018/05/07
1.2K2
[ SSH框架 ] Hibernate框架学习之一
web基础之hibernate(一篇)
                                                               hibernate的一些基本的认识    hibenate是一个框架(framework)    hibernate是一个orm框架    orm(object relation mapping)对象关系映射框架    hibernate处于我们项目的持久层位置(正因为如此,所以有人又把hibernate称为持久层框架)    hibernate实际上就是对jdbc进行了轻量级的分装
Gxjun
2018/03/26
6840
web基础之hibernate(一篇)
【框架】[Hibernate]构架知识点详解入门与测试实例
Hibernate是一个开放源码的、非常优秀、成熟的O/R Mapping框架。它提供了强大、高性能的Java对象和关系数据的持久化和查询功能。
谙忆
2021/01/21
4480
【框架】[Hibernate]构架知识点详解入门与测试实例
hibernate5二级缓存配置
hibernate默认有一个一级缓存,就是默认的Session缓存,当我们做了一次查询,hibernate会把这个结果缓存起来,叫做一级缓存,当我们接着在这个Session会话里面再做一次同样条件的查询,hibernate不会再次查询数据库,而是直接在一级缓存中获取结果并返回。一级缓存是内置的,他也不能被卸载。一级缓存是指在同一个Session会话内的查询做的缓存,如果跨了Session,或者当前Session关闭,重新开启了一个新的Session,这时候一级缓存是失效的。
全栈程序员站长
2022/08/31
3590
hibernate5二级缓存配置
java之spring之spring整合hibernate
4.在src下,编写 hibernate.cfg.xml ,并且在cn.vincent.vo下编写vo类的映射文件 User.hbm.xml
Vincent-yuan
2019/09/11
7000
java之spring之spring整合hibernate
杨老师课堂之JavaEE三大框架Hibernate入门第一课
---- 本篇任务 1. 使用Hibernate框架完成对客户的增删改查的操作 ---- 教学导航 1. 能够说出Hibernate的执行流程 2. 能够独立使用Hibernate框架完成增删改查的操作 ---- 框架和CRM项目的整体介绍 1. 什么是CRM * CRM(Customer Relationship Management)客户关系管理,是利用相应的信息技术以及互联网技术来协调企业与顾客间在销售、营销和服务上的交互,向客户提供创新式的个性化的客户交互和服务的过程 * 其最终
杨校
2018/12/06
4150
Hibernate学习---基本介绍+作用+配置
从今天开始重新学习(以前学的太匆忙)Hibernate,这篇文章主要就一下几点进行讲解和说明: Hibernate的基本介绍 Hibernate的作用 Hibernate基本配置 Hibernate的基本介绍: Hibernate最开始的作者是Gavin King,是澳大利亚人,在工作中因为不满EJB的种种不足,而自行花费两年的时间开发出最原始的Hibernate,后来被Jboss收购了Gavin King所在的公司(最主要是看上了Hibernate),后来的Jboss被红帽收购,所以现在Hibernate
MindMrWang
2018/04/16
1.7K0
Hibernate学习---基本介绍+作用+配置
Hibernate_day01总结
第1章 Hibernate_day01总结 今日内容 Hibernate框架的概述 Hibernate的快速入门 Hibernate核心API的介绍 Hibernate的持久化类 主键的生成策略 1.
Java帮帮
2018/03/19
1.3K0
Hibernate_day01总结
maven构建hibernate入门使用(1)
3:hibernate需要怎么去存储和加载持久化类的对象,这时我们要搞一个映射文件(该文件和实体类放在同一目录下面)
用户5166556
2019/04/16
1.5K1
相关推荐
Hibernate文件配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验