Hibernate基础入门

hibernate的基本概念

hibernate是 轻量级的 ORM 框架,ORM全称object/relation mapping [对象/关系 映射]。

orm概念

对象关系映射(Object Relation Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。使用orm技术(hibernate是其中最为流行的)可以在java程序以类和对象的方式去操控数据库表和记录。

Hibernate基础入门

POJO类

在使用hibernate时,要求和数据库的某张表相互映射的那个java类,是一个POJO类,一般放在com.xxx.domain包下,POJO类翻译过来就是:简单的Java对象(Plain Ordinary Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来。一个POJO类应当具有:

  • 有一个主键属性,用于唯一标识该对象。(这就是为什么hibernate设计者建议要映射的表需要一个主键)
  • 有其它的属性
  • 有对各个属性操作的get/set方法
  • 属性一般是private修饰.

  • 一定有一个无参的构造函数(用于hibernate框架反射用.)

Hibernate核心类及接口

Hibernate基础入门

Configuraion类

  • 负责管理hibernate的配置信息
  • 读取hibernate.cfg.xml
  • 加载hibernate.cfg.xml配置文件中配置的驱动,url,用户名,密码,连接池.

  • 管理 *.hbm.xml对象关系文件.

SessionFactory(会话工厂)接口

  • 缓存sql语句和某些数据
  • 在应用程序初始化的时候创建,是一个重量级的类(吃内存),一般用单例模式保证一个应用中只需要一个 SessionFactory实例.

  • 如果某个应用访问多个数据库,则要创建多个会话工厂实例,一般是一个数据库一个会话工厂实例.

  • 通过SessionFactory接口可以获得Session(会话)实例.

Session(会话)接口

  • Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合)
  • Session实例通过SessionFactory获取,用完需要关闭。
  • Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSession()。
  • Session可以看做是持久化管理器,它是与持久化操作相关的接口

session.get()和session.load()区别

get()方法直接返回实体类,如果查不到数据则返回null。load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时,如果没有数据不存在,就会抛出个org.hibernate.ObjectNotFoundException异常
load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,这就是我们常说的 load在默认情况下支持延迟加载(lazy)
get先到缓存(session缓存/二级缓存)中去查,如果没有就到DB中去查(即马上发出sql)。总之,如果你确定DB中有这个对象就用load(),不确定就用get()(这样效率高)

openSession()和 getCurrentSession()区别

  • 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会
  • 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭.

  • 使用getCurrentSession()需要在hibernate.cfg.xml文件中加入

* 如果使用的是本地事务(jdbc事务,单库)
<property name="hibernate.current_session_context_class">threadproperty>
* 如果使用的是全局事务(jta事务,多库)
<property name="hibernate.current_session_context_class">jtaproperty>

openSession()和 getCurrentSession()联系

在 SessionFactory启动的时候,Hibernate 会根据配置创建相应的 CurrentSessionContext,在getCurrentSession()被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession()。在
currentSession()执行时,如果当前Session为空,currentSession会调用SessionFactory的openSession。

openSession()和getCurrentSession()选择原则

  • 如果需要在同一线程中,保证使用同一个Session,则使用getCurrentSession()
  • 如果在一个线程中,需要使用不同的Session,则使用opentSession()

Transaction(事务)接口

事务简单的说,就是一组对数据库的操作集合,它们要么全部成功,要么全部失败.这个可以保证数据的一致性,事务具有原子性。

  • ①Transaction是底层的事物实现中抽象出来的接口
  • ②可能是一个jdbc或者jta的事务,这样有利于hibernate在不同执行环境的移植。
  • ③hibernate要求显示的调用事务(如果仅仅是查询可以不调用.)

Query接口

Query接口类型的对象可以对数据库操作,它可以使用Hql,Qbc,Qbe和原生SQL(native Sql)对数据库操作.官方推荐使用Hql语句。Query接口查询出来的结果是一个List接口类型的对象。

Criteria接口

开发hibernate流程(手写版)

  • 建库建表
  • 引入hiberate的包
  • 配置hibernate.cfg.xml

①该文件主要用于指定各个参数,是hibernate核心文件
②默认放在src目录下,也可以放在别的目录下。
③指定连接数据库的驱动、用户名、密码、url、连接池..

④指定对象关系映射文件的位置.

⑤也可使用hibernate.properties文件来替代该文件.(推荐使用hibernate.cfg.xml)。

<hibernate-configuration>
    <session-factory>

        <property name="connection.driver_class">org.hsqldb.jdbcDriverproperty>
        <property name="connection.url">jdbc:hsqldb:hsql://localhostproperty>
        <property name="connection.username">saproperty>
        <property name="connection.password"/>

        <property name="connection.pool_size">2property>

        <property name="dialect">org.hibernate.dialect.HSQLDialectproperty>

        <property name="current_session_context_class">org.hibernate.context.ManagedSessionContextproperty>

        <property name="cache.provider_class">org.hibernate.cache.NoCacheProviderproperty>

        <property name="show_sql">trueproperty>

        <property name="hbm2ddl.auto">createproperty>
        <mapping resource="com/yuan/domain/User.hbm.xml"/>
    session-factory>
hibernate-configuration>
  • 编写POJO类(Users类)
  • 编写对象映射文件

①该文件主要作用是建立表和类的映射关系,是不可或缺的重要文件.

②一般放在其映射的类同一个目录下,但不是必须的。
③命名方式一般是 类名.hbm.xml,但不是必须的。

  • 编写测试类,并测试.

Hibernate产品

Hibernate基础入门

Hibernate Core即平时所说的Hibernate,它可为应用程序提供强大、高性能的对象-关系映射以及查询服务。Hibernate使用(HQL)检索方式进行查询,也可以使用本地SQL语言,还可以使用Query byCriteria(QBC)检索方式或者Query by Example(QBE)检索方式。Hibernate可以帮助开发者节省持久层编码时间,有助于面向对象应用程序的设计实现。

Hibernate标注(Hibernate Annotations)从Hebernate3.2开始,Hibernate Annotations提供了JDK 5.0 关于对象-关系映射的标注。通过使用Hibernate标注,可以减少XML描述符的使用,在编译期进行校验,以及减少配置和维护工作等。

Hibernate EntityManager 在Hibernate Core的强大功能基础上实现了符合JPA规范Java持久化提供者(Hibernate Java Persistence)。可以应用于任何Java EE5应用服务器中或EJB3.0容器中,也可以被使用在Java SE应用中。

Original: https://www.cnblogs.com/xrwdgj/p/16297141.html
Author: 小人物大格局
Title: Hibernate基础入门

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592856/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Array and Linkedlist区别与操作的时间复杂度(转载)

    转载自:http://blog.csdn.net/tm_wb/article/details/6319146 数组链表堆栈和队列 数组链表堆栈和队列是最基本的数据结构,任何程序都会…

    Java 2023年5月29日
    085
  • 报错:java.lang.NoClassDefFoundError: sun/misc/BASE64Decoder

    本人使用的jdk版本为jdk1.8.0_301,但是仍然报错。 报错如下: 解决办法:使用import org.apache.commons.codec.binary.Base64…

    Java 2023年5月29日
    0132
  • 软件工程-就几个方面谈谈做项目和做产品的区别

    从严谨的角度触发,应该基本按照同样的标准实现项目和产品。 很可惜,在实际工作中,这基本上是不太可能的,除非项目比较大,客户要求比较严格。 本文主要谈以下几点: 1、需求差异 2、实…

    Java 2023年6月9日
    0101
  • mysql安装提示start service失败

    由于之前安装过mysql(win7、64位),卸载时没有删除干净mysql相关的东西,导致下次安装时提示start service,安装失败。 解决办法: 1、先卸载mysql,然…

    Java 2023年6月5日
    085
  • 【步骤详解】Docker一键部署微服务详细教程

    Docker部署微服务 场景介绍 我们使用Docker完成一个微服务的搭建过程 整体架构如下 使用多个微服务进行项目部署测试 整体服务说明 我们总共涉及到三个微服务以及两个中间件 …

    Java 2023年6月15日
    077
  • 【校招VIP】[产品][一本][6分]简历原则上写一页

    关注 【校招VIP】公众号,回复 【简历】,添加校招顾问微信,即可获取简历指导! 简历背景:21届一本产品 简历评分: 6分 一、学员简历 ​ ​ ​ 二、 指导意见: 简历有两大…

    Java 2023年6月5日
    091
  • Jenkins持续集成入门到精通(进阶篇)

    视频参考:https://www.bilibili.com/video/BV1Vp4y1b7ZN?p=51 Jenkins+Docker+SpringCloud持续集成流程说明 大…

    Java 2023年6月8日
    096
  • 2、系统的硬件组成

    1 系统的硬件组成概览 1.1 总线 1.2 I/O设备 1.3 主存 1.4 处理器 1 系统的硬件组成概览 1.1 总线 总线是负责在各个 部件之间传递信息的,信息的单位是字节…

    Java 2023年6月7日
    0103
  • 最新MongoDB安装,学习笔记

    MongoDB 导读 作者还在陆续更新中,如果喜欢作者的笔记,觉得可以学习到有帮助,后面会不断学习新内容,就点个关注吧,如果觉得文章有关注可以点个赞,谢谢; 官网:https://…

    Java 2023年6月9日
    069
  • Welcome to here!

    你敢相信从早上6点40就起床了,跑去晨读赚了0.1学分。 一早上的软件测试 早八的正确打开方式就是进入了超星课堂,开启了软件测试的课堂,学习了等价类边界值综合(用户登录的测试),由…

    Java 2023年6月5日
    077
  • centos 7 下 rabbitmq 3.8.0 & erlang 22.1 源码编译安装

    1. erlang 22.1 源码编译安装 2. rabbitmq 3.8.0 binary安装 注意下载下来的文件是xz格式的,xz命令 XZ Utils 是为 POSIX 平台…

    Java 2023年5月29日
    070
  • 五、Java控制流程

    Java流程控制* 用户交互Scanner、Scanner进阶使用 用户交互Scanner ​ 之前我们学习的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一…

    Java 2023年6月7日
    065
  • SSM整合

    正常创建一个maven项目,环境是jDK1.8及以上,maven3.8及以上 无论SSM项目、SpringBoot项目还是SpringCloud项目第一件事就是添加相关的依赖。这里…

    Java 2023年6月13日
    084
  • MybatisPlus属性自动填充

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    061
  • 零基础半天做出物体检测

    零基础半天做出物体检测 声明:此项目是本人应对学校的课程设计(大四,学校突然开展此课设并且他不授课,就去实验室去做这个东西。重点是啥也不教,让10天做出来!吐槽一下,拜托,时间很宝…

    Java 2023年6月9日
    092
  • Bitmap 位图 Java实现

    以 bit 作为存储单位进行 0、1存取的数据结构。可用作布尔值存取,比如给定第i位,该bit为1则表示true,为0则表示false。 适用于对布尔或0、1值进行(大量)存取的场…

    Java 2023年6月6日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球