Hibernate(一)——入门

news2024/12/23 17:52:15

在之前经常用到操作数据库的框架是Mybatis或者Mybatis-plus。
Hibernate在項目中用过,但没有深入的了解过,所以这次趁着假期把这个框架了解一下。

目录

  • 概念
  • Hibernate和Mybatis的区别
  • Hibernate使用
    • 依赖引入
    • Hibernate配置文件
      • XML配置文件详解
      • properties文件详解
    • 实体类
    • 映射文件
    • 测试
  • HibernateApi
    • Configuration
    • SessionFactory
    • Session 会话
      • session api
    • Transaction 事务
    • Query对象
    • Criteria 对象

概念

Hibernate就是一个持久层ORM框架

什么是ORM框架?

利用描述对象和数据库表之间映射的元数据,自动把Java应用程序中的对象,持久化到关系型数据库的表中。通过操作Java对象,就可以完成对数据库表的操作。

Hibernate和Mybatis的区别

HibrenateMybatis
开发难度复杂简单
实体映射采用数据库与entity映射采用SQL与entity映射
sql优化自动生成sql,存在有些语句较为繁琐,会多消耗一些性能手动编写sql,可以避免不需要的查询,提高系统性能
缓存机制二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是哪种缓存二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现

Hibernate使用

基于mysql8.0.12的使用

依赖引入

映入hibernate和MySQL驱动

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.4.10.Final</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.12</version>
</dependency>

同时需要设置对应的资源地址,用于读取配置文件

<build>
 <resources>
   <resource>
     <directory>src/main/java</directory>
     <includes>
       <include>**/*.xml</include>
     </includes>
     <filtering>true</filtering>
   </resource>
   <resource>
     <directory>src/main/resources</directory>
     <includes>
       <include>**/*.xml</include>
     </includes>
     <filtering>true</filtering>
   </resource>
 </resources>
</build>

Hibernate配置文件

实现Hibernate基础配置,是Hibernate能够友好的与DB进行交互基础。(开发时放置src/main/resource目录下)

配置文件有两件形式:

  1. properties文件,如hibernate.properties
  2. XML文件,如hibernate.cfg.xml

个人建议使用XML,因为properties中不能配置关联的映射文件,在后续的实现中会带来一些没必要的编码

XML配置文件详解

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Hibernate配置文件的DTD信息 -->
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- hibernate- configuration是连接配置文件的根元素 -->
<hibernate-configuration>
    <session-factory>
        <!-- 指定连接数据库所用的驱动 -->
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <!-- 指定连接数据库的url,hibernate连接的数据库名 -->
        <property name="connection.url">jdbc:mysql://local/数据库名?serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=UTF-8</property>
        <!-- 指定连接数据库的用户名 -->
        <property name="connection.username">root</property>
        <!-- 指定连接数据库的密码 -->
        <property name="connection.password">123456</property>
        <!-- 指定连接池里最大连接数 -->
        <property name="hibernate.c3p0.max_size">20</property>
        <!-- 指定连接池里最小连接数 -->
        <property name="hibernate.c3p0.min_size">1</property>
        <!-- 指定连接池里连接的超时时长 -->
        <property name="hibernate.c3p0.timeout">5000</property>
        <!-- 指定连接池里最大缓存多少个Statement对象 -->
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="hibernate.c3p0.validate">true</property>
        <!-- 配置数据库方言,让hibernate框架识别不同数据库的自己特有的语句  -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 根据需要自动创建数据表
            create:启动时删数据库中的表,而后建立,退出时不删除数据表数据库;
            create-drop:启动时删数据库中的表,而后建立,退出时自动删除全部表;
            update:自动修改,若是表结构与实体类不一致,那么就修改表使它们一致,数据会保留;
            validate:自动校验,若是表结构与实体类不一致,那么不作任何操做,报错 -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 显示Hibernate持久化操作所生成的SQL -->
        <property name="show_sql">true</property>
        <!-- 将SQL脚本进行格式化后再输出 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 罗列所有的映射文件 -->
        <mapping resource="映射文件路径/dept.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

properties文件详解

## MySQL
#方言
hibernate.dialect org.hibernate.dialect.MySQL5Dialect
#驱动
hibernate.connection.driver_class com.mysql.cj.jdbc.Driver
#数据库地址
hibernate.connection.url jdbc:mysql://localhost/数据库名
#用户名
hibernate.connection.username root
#密码
hibernate.connection.password 123456
#是否在控制台输出sql语句
hibernate.show_sql true/false
#设置当创建sessionfactory时,是否根据映射文件自动建立数据库表。 create-drop:表示关闭sessionFactory时,将drop刚建的数据库表。该属性可以是update/create-drop/create
hibernate.hbm2ddl.auto update

###########################
### C3P0 Connection Pool C3P0连接池###
###########################
#连接池最大链接数
hibernate.c3p0.max_size 2
#连接池最小连接数
hibernate.c3p0.min_size 2
#连接池连接的超时时长
hibernate.c3p0.timeout 5000
#缓存statements 的数量
hibernate.c3p0.max_statements 100
hibernate.c3p0.idle_test_period 3000
hibernate.c3p0.acquire_increment 2
hibernate.c3p0.validate true


############
### JNDI (java naming directory interface)Java命名目录接口###
###当无需hibernate自己管理数据源而是直接访问容器管理数据源 使用JNDI
############
#指定数据源JNDI名字
hibernate.connection.datasource dddd
#文件系统下
hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
hibernate.jndi.url file:/

#网络
#指定JND InitialContextFactory 的实现类,该属性也是可选的。如果JNDI与Hibernate持久化访问的代码处于同一个应用,无需指定该属性
hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
#指定JNDI提供者的URL,该属性可选 如果JNDI与Hibernate持久化访问的代码处于同一个应用,无需指定该属性
hibernate.jndi.url iiop://localhost:900/

#指定链接数据库用户名
hibernate.connection.username  root
#指定密码
hibernate.connection.password  1111
#指定方言
hibernate.dialect org.hibernate.dialect.MySQLDialect

#######################
### Transaction API   事务属性说明###
#######################

#指定是否在事务结束后自动关闭session
hibernate.transaction.auto_close_session true
#指定session是否在事务完成后自动将数据刷新到底层数据库
hibernate.transaction.flush_before_completion true/false

## 指定hibernate所有的事务工厂的类型,该属性必须是TransactionFactory的直接或间接子类

hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory

## 该属性值是一个JNDI名,hibernate将使用JTATTransactionFactory从应用服务器中取出JTAYserTransaction

jta.UserTransaction jta/usertransaction
jta.UserTransaction javax.transaction.UserTransaction
jta.UserTransaction UserTransaction

## 该属性值为一个transactionManagerLookup类名,当使用JVM级别的缓存时,或在JTA环境中使用hilo生成器策略时,需要该类

hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup

实体类

public class Dept implements Serializable {
    private Integer id;
    private String deptno;
    private String dname;
    private String loc;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDeptno() {
        return deptno;
    }

    public void setDeptno(String deptno) {
        this.deptno = deptno;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }
}

映射文件

实现POJO与DB表格的映射配置(为了维护方便一般将其放置和相对应的POJO同一目录下,取名为POJOName.hbm.xml)

虽然一个映射文件中可以配置多个POJO与数据库表的映射关系但是还是建议一个映射文件中只配置一个POJO与数据库表的映射关系

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <!--指定映射的类和对应的表名-->
    <class name="com.tung.entity.Dept" table="dept">
        <id name="id" column="id">
            <!-- <generator>:指定主键由什么生成,推荐使用uuid,assigned指用户手工填入。设定标识符生成器
			适应代理主键的有:
			    increment:有Hibernat自动以递增的方式生成标识符,每次增量1;
				identity:由底层数据库生成标识符,前提条件是底层数据库支持自动增长字段类型。(DB2,MYSQL)
                uuid:用128位的UUID算法生成字符串类型标识符。
			适应自然主键:
		        assigned:由java程序负责生成标识符,为了能让java应用程序设置OID,不能把setId()方法设置成private类型。
				让应用程序在save()之前为对象分配一个标识符。相当于不指定<generator.../>元素时所采用的默认策略。
				应当尽量避免自然主键
			-->
            <generator class="increment"/>
        </id>
        <property name="deptno" column="deptno"/>
        <property name="dname" column="dname"/>
        <property name="loc" column="loc"/>
    </class>
</hibernate-mapping>

测试

向数据库里添加一个dept对象数据

@Test
public void testAdd(){
    //加载hibernate核心配置文件
    Configuration cfg = new Configuration();
    cfg.configure();
    //创建SessionFactory对象
    SessionFactory sessionFactory = cfg.buildSessionFactory();
    //创建session对象
    Session session = sessionFactory.openSession();
    //开启事务
    Transaction tx = session.beginTransaction();
    //具体crud操作
    Dept dept = new Dept();
    dept.setDeptno("154");
    dept.setDname("测试部门");
    dept.setLoc("测试地址");

    //调用session的方法实现添加
    session.save(dept);
    //提交事务
    tx.commit();
    //关闭资源
    session.close();
    sessionFactory.close();

}

因为表不存在,hibernate自动创建表,之后插入数据
在这里插入图片描述

HibernateApi

Configuration

用于读取配置文件和orm映射文件

初始化描述
new Configuration().configure()加载src/main/resource下的hibernate.cfg.xml
new Configuration()加载的src/main/resource下的hibernate.properties
new Configuration().configure(String resourceFile)加载指定的名称的配置文件resourceFile

SessionFactory

相当于java web连接池,用于管理所有session

Session 会话

负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。

Session对象是非线程安全的。

获取Session方法描述
openSession()创建一个新的Session,使用完成后要手动调用close来关闭
getCurrentSession()获取一个与线程绑定的Session,当我们提交或事务回滚后会自动关闭

session api

方法名描述
save保存
update更新
delete删除
get通过id查询,如果没有 null
load通过id查询,如果没有抛异常(延迟加载,提高Hibernate的执行效率)
createQuery(“hql”)获得Query对象
createCriteria(Class)获得Criteria对象

Transaction 事务

方法名描述
beginTransaction()开启事务
getTransaction()获得事务
commit()提交事务
rollback()回滚事务

Query对象

获得方法

createQuery();
方法名描述
list()查询所有
uniqueResult()获得一个结果。如果没有查询到返回null,如果查询多条抛异常
setFirstResult(int)分页,开始索引数startIndex
setMaxResults(int)分页,每页显示个数 pageSize

Criteria 对象

获得方法

createCriteria();

这个对象用的不多,因为它有局限性,所以稍作了解即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/483659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023 年 五一杯 B 题过程 + 代码(第一问)

文章目录 第一题问题分析PageRank 算法&#xff08;可跳过&#xff09;PageRank 算法修正权重系数 结果各城市链出与链入链出 权重链入 权重 PageRank 算法结果代码 第一题 问题分析 从收货量、发货量、快递数量增长/减少趋势、相关性等多角度考虑&#xff0c;建立数学模型&…

如何使用git更新别人的代码

文章目录 如何使用git更新别人的代码问题说明省流问题示例操作步骤总结总结 如何使用git更新别人的代码 问题说明 当自己git clone别人的代码之后&#xff0c;代码一直停留到本地电脑上&#xff0c;而你就跑了一次程序就搁置了。 后来有一天你想再次运行该代码&#xff0c;但…

可观测性:你的应用健康吗?

一、需求来源 首先来看一下&#xff0c;整个需求的来源&#xff1a;当把应用迁移到 Kubernetes 之后&#xff0c;要如何去保障应用的健康与稳定呢&#xff1f;其实很简单&#xff0c;可以从两个方面来进行增强&#xff1a; 首先是提高应用的可观测性&#xff1b;第二是提高应…

Matplotlib 安装介绍

文章目录 安装步骤 Matplotlib 不止是一个数学绘图库&#xff0c;它也是可视化和分析工具中最流行之一。我们可用其制作简单的图表&#xff0c;如折线图和散点图。 安装步骤 先进入&#xff1a;python官网 跳转到界面&#xff1a; 录入并搜索 下载之前&#xff0c;看一下自…

嵌入式linux学习笔记--虚拟局域网组网方案分享,基于自组zerotier -planet 网络的方案

0. 前言 五一假期期间重新考虑了目前的组网环境&#xff0c;准备对目前的组网进行一个重新的划分。 目前有的资源 ① 两台 服务器&#xff0c;阿里云-深圳&#xff08;5M上行&#xff09;和腾讯云 广州&#xff08;3M上行&#xff09; ② 带动态公网IP的家庭宽带 &#xff08;…

伽马校正的前世今生

关于伽马校正的前因后果&#xff0c;在网上有不同版本的说法&#xff0c;由于年代久远的因素&#xff0c;导致原本很简单的事情越说越复杂。今天我们的目标就是抓住伽马的头&#xff0c;而不是摸一下伽马的尾巴。 一&#xff0c;鱼龙混杂的论调 1&#xff0c;CRT 显示器的物理…

系统集成项目管理工程师下午真题 计算题 及考点 汇总(更新中。。。)

文章目录 2022下半年广东卷 2022下半年广东卷 1、质量保证、质量控制。质量管理方面存在的问题&#xff0c;并给出正确的做法。判断下列选项的正误。 2、下表是一个软件项目在编码阶段各活动的计划和实际完成情况&#xff08;工作量&#xff0c;单位&#xff1a;人天&#xf…

Linux环境下的redis

一&#xff1a;安装与启动 1.下载redis安装包 2.解压&#xff1a;tar –xvf 文件名.tar.gz 3.安装 进入redis目录&#xff08;cd redis-x.x.x/)后&#xff0c;执行make install 命令 4.启动 进入src目录&#xff0c;执行redis-server 此时该界面无法再使用&#xff0c;需要…

Eureka 服务注册源码探秘——图解、源码级解析

&#x1f34a; Java学习&#xff1a;社区快速通道 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年5月2日 &#x1f34a; 点…

NPOI导出word文档中插入公式总结

1. XWPFOMath类 XWPFDocument doc new XWPFDocument(); //创建新行 XWPFParagraph p doc.CreateParagraph(); //创建空的公式 XWPFOMath math p.CreateOMath();通过XWPFParagraph的扩展方法创建 方法名备注CreateAcc();创建XWPFAcc类&#xff0c;实现字符在文字上面的类Cr…

【前端】2.HTML基础知识

文章目录 1. 基本概念1.1 HTML是什么1.2 HTML的作用1.3. 学习导引1.4 开发工具 2. HTML 基础语法2.1 demo2.1.1 HTML 详述2.1.2 HTML标签2.1.3 HTML网页结构2.1.4HTML版本 2.2 常用元素2.3 属性2.4 文本相关语法2.5 链接相关语法2.6 头部相关语法 3. 总结3.1 HTML 基础语法总结…

什么是VLAN?为什么要划分VLAN?

VLAN(Virtual Local Area Network)即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。每个VLAN是一个广播域&#xff0c;VLAN内的主机间可以直接通信&#xff0c;而VLAN间则不能直接互通。这样&#xff0c;广播报文就被限制在一个VLAN内。 一、为…

如何简单快速搭建自己的云对象存储服务(OSS)

简单来说&#xff0c;其实我们只需要有一台服务器&#xff0c;利用服务器的各种资源&#xff0c;搭配其它厂商开发的软件&#xff0c;就能很轻易拥有自己的云对象存储服务。不需要在阿里云上花钱买什么服务&#xff0c;甚至还能自己给别人提供服务&#xff0c;真的是太爽了。 云…

五一创作【Android构建篇】MakeFile语法

前言 对于一个看不懂Makefile构建文件规则的人来说&#xff0c;这个Makefile语法和shell语法是真不一样&#xff0c;但是又引用了部分shell语法&#xff0c;可以说是shell语法的子类&#xff0c;Makefile语法继承了它。 和shell语法不一样&#xff0c;这个更难一点&#xff0…

云原生架构的发展历史

目录 1 单机小型机时代2 垂直拆分3 集群化负载均衡架构4 服务化改造架构5 服务治理6 微服务时代7 服务网格新时期 &#xff08;service mesh&#xff09;7.1 背景7.2 SideCar7.3 Linkerd7.4 istio7.5 什么是服务网格7.6 什么是Service Mesh7.7 CNCF云原生组织发展和介绍7.8 国内…

C++11--线程库的认识

目录 thread 线程的构造方式 相关成员函数 join与detach 线程传参 互斥量mutex mutex Locks 原子性操作库 条件变量 thread 线程的构造方式 它是不支持拷贝构造&#xff0c;赋值的&#xff0c;但是可以支持移动构造&#xff0c;移动赋值。还可以直接创建无参的对象。 …

存储器(一)

目录 一、存储器的分类 1.按介质分类 1.1半导体存储器 1.2磁表面存储器 1.3光盘存储器 2.按存取方式分类 2.1随机存储器(RAM) 2.2只读存储器(ROM) 2.3串行访问存储器 3.按在计算机中的作用分类 ​编辑 二、存储器的层次结构 1.存储器的主要性能指标: 2.存储系统体系…

模式识别是什么意思

模式识别是一种通过分析数据特征、模型、算法等手段&#xff0c;从数据中寻找规律、发现隐藏的模式或结构的技术。通常是从某些对象、场景、过程等方面入手&#xff0c;对数据进行处理&#xff0c;以便于对这些对象、场景、过程进行分类、检测、识别、分割、分析等目的。 模式…

HJ20 密码验证合格程序

写在前面&#xff1a; 题目链接&#xff1a;牛客网 华为机试题 HJ20 密码验证合格程序 题目难度&#xff1a;中等 编程语言&#xff1a;C 一、题目描述 描述 密码要求: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 &#xff08;注&#xff1a;其他符号不…

死信队列

死信队列 死信的概念 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到queue 里了&#xff0c;consumer 从 queue 取出消息…