[spring] spring jpa - hibernate 名词解释配置

news2024/11/19 13:23:41

[spring] spring jpa - hibernate 名词解释&配置

之前过了一遍依赖注入的内容,这次过一下数据相关的部分,完成了这部分内容,下篇就涉及到 API 实现了

操作的部分放到下一篇,本篇主要是概念+配置

整体课程上来说,已经完成了将近 1/3,年底之前应该说可以把 spring boot 相关的内容滚完

名词解释

在开始用 jpa/hibernate 之前,先开始解释一些名词

  • MVC

    MVC 和 spring 没有直接的关联,这是一个更加广泛的,关于 Model-View-Controller 设计模式,其中:

    • Model

      代表数据和业务逻辑相关内容,简单的说就是负责和数据库交流,并且进行数据更新的部分

    • View

      渲染层,直接和用户进行互动的部分,包括从后台获取数据,在前台和用户互动,并且获取用户输入,传输到后台

    • Controller

      负责沟通 model 和 view 的桥梁,将从 view 接收到的数据传给 model 进行数据更新,将从 model 获取的数据传给前台进行渲染

    一些比较流行的 MVC 框架有 Ruby,Django(python),Spring MVC(java)express(js),ASP .NET MVC(C#)

  • SSH

    Struts-Spring-Hibernate 框架的缩写,其中 Struts 代表着 View 结构,Spring 是负责 Controller+Model,而 Hibernate 则负责协助和数据库沟通,也是 Model 的一部分

  • SSM

    即 Spring+Spring MVC+Mybatis

    这里 Spring 也是负责 Controller+Model 部分,Spring MVC 负责渲染,而 Mybatis 代替了 Hibernate,负责协助数据库的沟通

  • ORM

    Object-Relationship Mapping

    使用该框架可以通过映射对象(Object)与关系型数据库(Relational DB),让开发者免于写 SQL,而是直接对对象进行操作即可

    比较流行的 ORM 有:Hibernate(Java),ActiveRecord(Ruby),Django’s ORM(Python),Entity Framework(.Net),Sequelize(JS,Node)

  • Mybatis

    Mybatis 是 SQL 映射框架,学习门槛较低,上手较快,因此在 SSM 框架中占据一席之地

    基本上说 Mybatis 可以缩短写开发要写的 SQL,并且 MyBatis 负责与数据库进行沟通,提供比较高的灵活性

    使用 MyBatis,开发者还是需要写自己的 SQL 的,它并不是一个 ORM 框架

  • Hibernate

    Hibernate 是一个 ORM 框架,因此可以让开发者只操作 Java 对象,而 Hibernate 负责和数据库进行沟通

    简而言之就是,Hibernate 借将对应的 java 对象与数据库进行映射,并实现 SQL 操作

    Hibernate 是 Spring Boot 的默认 JPA Provider,它本质上还是调用 JDBC 去实现具体的数据库操作

  • JPA

    Java Persistence API 的缩写,这是 API 规范,Hibernate 就是实现了 JPA 的 ORM 框架

    换言之,除了 Hibernate 之外,还有其他的框架也实现了 JPA,如 EclipseLink

    ⚠️:JPA 好像已经改名成了 Jakarta Persistence API

  • Spring JPA

    提供了 boilerplate code 用来加速 JDBC 的操作

    使用 Spring JPA 必须要有一个 JPA provider,比较流行的 provider 就是 Hibernate

    没有 Provider,Spring JPA 无法实现和数据库的沟通

这样大概就能解释一点 JPA、Spring JPA 和 Hibernate 之间的关系了……?

配置

配置 spring initializr

主要就是额外加了两个 dependencies:

在这里插入图片描述

配置数据库

配置数据库这块主要是从 application.properties 里面配置,我配置的内容如下:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/student_tracker
spring.datasource.username=springstudent
spring.datasource.password=springstudent
# deprecated
#spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
# use org.hibernate.dialect.MySQLDialect instead
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

这个配置还是比较简单的,运行结果如下:

在这里插入图片描述

补充一下: 我创建了对应的用户和密码,没有创建的话,使用默认的用户名和密码 root 也可以

配置中可能遇到的问题

虽然这个步骤很快,但是实际上我在这一步卡了半天,主要碰到下面几个问题:

  1. 缺少 dialect

    教程里给的配置没有 spring.jpa.database,后面 Google 了一下加了 MySQL8Dialect

  2. typo

    应该是 org.hibernate.dialect.MySQL8Dialect,我漏了个 org

  3. 数据库不 match

    教程里用的是 MySQL,我本地的数据库是 MariaDB v11

    后面我试着切换 MariaDB 106 的 Dialect,然后发现 POM 又要更新,折腾若干次未果,后面还是重新下载了一个 MySQL 才跑通

    所以说,数据库的版本还是要和 Hibernate 提供的 Dialect 符合,我怀疑 MariaDB11 和 106 不兼容(因为有个大版本的差别)

  4. 本地重装数据库冲突

    MariaDB 曾经是 MySQL 的套壳,不过现在两个差别越来越大了……

    brew 卸载 maria 的话还是删的比较干净的,不过删 MySQL 的时候有个残存的文件夹,这样我重新下载其他的 DB(Maria/MySQL)就会启动失败,解决方案是彻底删除残留的文件夹,再重新安装就好了

    我用的脚本为:

    ❯ brew uninstall mysql
    ❯ rm -Rf /usr/local/var/mysql
    ❯ brew install mysql
    ❯ mysql.server start
    

配置完成了后,spring boot 就会根据配置自动创建对应的 DataSource, EntityManager 等数据库相关的 bean

项目配置

因为 CRUD 的操作比较麻烦,所以教程里面使用的是 CLI,具体内容如下:

package com.example.hibernatejpa;

import com.example.hibernatejpa.dao.StudentDAO;
import com.example.hibernatejpa.entity.Student;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class HibernateJpaApplication {

	public static void main(String[] args) {
		SpringApplication.run(HibernateJpaApplication.class, args);
	}

	@Bean
	public CommandLineRunner commandLineRunner(StudentDAO studentDAO) {

		return runner -> System.out.println("Hello World");
	}
}

commandLineRunner 主要是在 Spring 启动后会执行一些命令行输出语句,比如说这里就 log 了一下 Hello World:

在这里插入图片描述

这里也可以修改一下 properties 文件,减少一点 log 的输出:

spring.main.banner-mode=off
logging.level.root=warn

修改了之后,info 相关的内容和 Spring 的 banner 就不会被输出了:

在这里插入图片描述

JPA 注解

一些本篇笔记会用到的注解如下:

  • Entity Mapping

    @Entity, @Table

  • Primary Key

    @Id, @GeneratedValue

  • Columnh Mapping

    @Column

  • Relationship

    这个案例里暂时不会用到,不过是这种关系:@OneToOne

  • Query

    @NamedQuery

  • 来自 Spring

    @Transactional 代表这会对数据进行 mutation,这里面具体操作还挺复杂的,涉及到 rollback 等操作,之后看看课程里会不会讲,不会的话我抽空研究一下

这种很多,不过用到了再了解就是了

一些类,如 EntityManager, DataSource,Spring 会根据配置自动生成,后面直接拿来用就好了

操作流程如下:

  1. 定义 Entity Object

    JPA 会将这个类与数据库中的 entity 进行 mapping,这也是为什么会有 @Entity 这个注解的来源

    • Student
    package com.example.hibernatejpa.entity;
    
    import jakarta.persistence.*;
    
    @Entity
    @Table(name = "student")
    public class Student {
    }
    
    

    @Table 指代的则是数据库里 student 这个表

  2. 进行数据映射

      @Entity
      @Table(name = "student")
      public class Student {
            // defined fields
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "Id")
        private int id;
    
        @Column(name = "first_name")
        private String firstName;
    
        @Column(name = "last_name")
        private String lastName;
    
        @Column(name = "email")
        private String email;
    
         public Student() {
         }
    
         public Student(String firstName, String lastName, String email) {
             this.firstName = firstName;
             this.lastName = lastName;
             this.email = email;
         }
      }
    

    这里需要一个无参构造函数让 hibernate 去使用反射创建对应的实例

    这里将表格里有的数据和对象里的属性进行映射,毕竟数据库的结构如下:

    在这里插入图片描述

    @Column 是可选的,如果不提供的话数据库中的名字与 Java 中属性名相同。不过数 DB 的属性名称一般用的是 snake,java 用的是 camel,所以也不太推荐这么做

    另外就是,如果代码要更新(比如说换名称之类的),如果不注意这里没修改的话,有可能项目就跑不了了

    同样,@Table 这个注解也是可选的

    这里从数据库 map 的主键就是 id,@GeneratedValue 也就是主键的生成方式为数据库管理,所以在创建新对象的时候不需要将主键传过去

    GenerationType 是可以 override 的,通过实现 IdentifierGenerator 重写对应的方法即可

到这一步,ORM 的 mapping 这里就实现了

接下来就是重写 setter/getter/toString 方法,这里就跳过了

除了手动操作之外,也可以使用 lombok 去除重复的 setter/getter/无参构造函数

Reference

  • 比较流行的一些 DB 的 Dialect

    RDBMSDialects
    DB2org.hibernate.dialect.DB2Dialect
    DB2 AS/400org.hibernate.dialect.DB2400Dialect
    DB2 OS390org.hibernate.dialect.DB2390Dialect
    PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
    MySQL5org.hibernate.dialect.MySQL5Dialect
    MySQL5 with InnoDBorg.hibernate.dialect.MySQL5InnoDBDialect
    MySQL with MyISAMorg.hibernate.dialect.MySQLMyISAMDialect
    Oracle (any version)org.hibernate.dialect.OracleDialect
    Oracle 9iorg.hibernate.dialect.Oracle9iDialect
    Sybaseorg.hibernate.dialect.SybaseASE15Dialect
    Microsoft SQL Server 2000org.hibernate.dialect.SQLServerDialect
    Microsoft SQL Server 2008org.hibernate.dialect.SQLServer2008Dialect
    SAP DBorg.hibernate.dialect.SAPDBDialect
    Informixorg.hibernate.dialect.InformixDialect
    HypersonicSQLorg.hibernate.dialect.HSQLDialect
    H2 Databaseorg.hibernate.dialect.H2Dialect
    Ingresorg.hibernate.dialect.IngresDialect
    Progressorg.hibernate.dialect.ProgressDialect
    Mckoi SQLorg.hibernate.dialect.MckoiDialect
    Interbaseorg.hibernate.dialect.InterbaseDialect
    Pointbaseorg.hibernate.dialect.PointbaseDialect
    FrontBaseorg.hibernate.dialect.FrontbaseDialect
    Firebirdorg.hibernate.dialect.FirebirdDialect

    不是非常 up-to-date,MySQL8Dialect 都 deprecated 了,我现在用的 MySQL 版本是 8,不过做一个参考还行

  • Mysql start up issues | ERROR! The server quit without updating PID file

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

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

相关文章

c++ pthread库使用

c pthread库使用 1. pthread库安装2. 测试demo3. 配置include/lib路径3.1 添加include路径3.2 配置lib文件路径 4.显示结果5. 遇到的bug参考文献 1. pthread库安装 打开ftp://sourceware.org/pub/pthreads-win32,下载一个安装包,如pthreads-w32-2-8-0-r…

STM32 CubeMX PWM三种模式(HAL库)

STM32 CubeMX PWM两种模式(HAL库) STM32 CubeMX STM32 CubeMX PWM两种模式(HAL库)一、互补对称输出STM32 CubeMX设置代码部分 二、带死区互补模式STM32 CubeMX设置代码 三、普通模式STM32 CubeMX设置代码部分 总结 一、互补对称输…

实现Java基于类的代理方式 - CGLIB动态代理(动态代理篇 三)

CGLIB(Code Generation Library)是一个基于类的动态代理库,它可以在运行时生成字节码来创建代理类。相比于JDK动态代理,CGLIB动态代理不需要接口,可以代理任意类。 CGLIB动态代理的实现原理是通过继承目标类来创建代理…

什么是网络流量监控

随着许多服务迁移到云,网络基础架构的维护变得复杂。虽然云采用在生产力方面是有利的,但它也可能让位于未经授权的访问,使 IT 系统容易受到安全攻击。 为了确保其网络的安全性和平稳的性能,IT 管理员需要监控用户访问的每个链接以…

【C++杂货铺】一文带你走进RBTree

文章目录 一、红黑树的概念二、红黑树的性质三、红黑树结点的定义四、红黑树的插入操作4.1 情况一:uncle 存在且为红4.2 情况二:uncle 不存在4.3 情况三:uncle 存在且为黑4.4 插入完整源码 五、红黑树的验证六、红黑树与 AVL 树的比较七、结语…

可替代allegroA3909的国产芯片GC3909的数据分析

GLOBALCHIP的 GC3909 是一款双通道 12V 直流电机驱动芯片,为摄像机、消费类产品、玩具和其他低压或 者电池供电的运动控制类应用提供了集成的电机驱动解决方案。芯片一般用来驱动两个直流电机 或者驱动一个步进电机。 而GC3909 可以工作在 3.8~12V 的电源电压上&…

Ant Design+react 路由跳转

今天我们来继续探讨react的路由跳转 首先,创建router文件夹中的index import { lazy } from "react"; import { Outlet,useRoutes } from react-router-dom; //引入页面,引用了路由懒加载 const One lazy(() > import(../pages/one)); c…

QT作业二

1、思维导图 https://www.zhixi.com/view/9e899ee0 2、作业 #include <iostream>using namespace std;class Rect {int width;int height; public:void init(int w,int h);//初始化函数void set_w(int w);//更改宽度void set_h(int h);//更改高度void show();//输出矩形…

DEDECMS织梦保存当前栏目更改时失败的解决方法

织梦编辑栏目时提示“保存当前栏目更改时失败&#xff0c;请检查你的输入资料是否存在问题&#xff01;” 那是因为你的后台栏目编辑文件php里有做过二次开发&#xff0c;添加了栏目数据表里不存在的字段。 跟着下面的步骤&#xff0c;让程序告诉你缺少什么引起的保存失败吧。 …

轻松玩转直播带货,铭顺科技揭秘数字人跳舞直播软件亮点

直播带货在商业领域越来越受追捧&#xff0c;而数字人直播作为一种创新推广方式&#xff0c;正逐渐引起关注。在这个竞争激烈的直播行业中&#xff0c;数字人私有化部署解决方案以其独特的优势和亮点&#xff0c;为用户提供了一个轻松玩转直播带货的利器。 数字人私有化部署解决…

leetCode 167.两数之和 || - 输入有序数组 双指针解法

167. 两数之和 II - 输入有序数组 - 力扣&#xff08;LeetCode&#xff09; 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] …

无人化微波产品智能测试系统

无人化微波产品智能测试系统是面向射频微波产品领域客户数字化转型需求&#xff0c;推出的一款新形态自动测试系统。该系统实现了微波产品测试由单工位串行测试向多工位并行测试转变&#xff0c;具有测试容量大、测试效能高、测试管理信息化等特点。该系统可数倍提升客户的测试…

C# redis通过stream实现消息队列以及ack机制

redis实现 查看redis版本 redis需要>5.0 Stream 是 Redis 5.0 引入的一种专门为消息队列设计的数据类型&#xff0c;Stream 是一个包含 0 个或者多个元素的有序队列&#xff0c;这些元素根据 ID 的大小进行有序排列。 它实现了大部分消息队列的功能&#xff1a; 消息 ID…

Vue路由进阶--VueRouter声明式导航

Vue路由进阶–VueRouter声明式导航 文章目录 Vue路由进阶--VueRouter声明式导航1、声明式导航1.1、导航链接1.2、高亮类名1.3、跳转传参1.4、动态路由参数可选符 1、声明式导航 1.1、导航链接 需求&#xff1a;实现导航高亮效果 vue-router提供了一个全局组件router-link(取…

【数据库——MySQL(实战项目1)】(1)图书借阅系统

目录 1. 简述2. 功能3. 数据库结构设计3.1 绘制 E-R 图3.2 创建数据库3.3 创建表3.4 插入表数据 1. 简述 经过前期的学习&#xff0c;我们已经掌握数据库基础操作&#xff0c;因此是时候来做一个实战项目了——图书借阅系统。对于图书借阅系统&#xff0c;相信大家不难想到至少…

Git Stash:临时保存和切换工作状态的利器

Git是我们日常工作中不可或缺的版本控制系统。它提供了许多强大的功能&#xff0c;其中之一是Git Stash&#xff08;暂存&#xff09;。Git Stash可以帮助我们在切换分支或保存未完成的工作时&#xff0c;临时保存当前的修改&#xff0c;以便稍后重新应用。本文将介绍Git Stash…

零信任沙盒,加密沙盒,防泄密沙盒

场景描述 随着云计算、移动互联、物联网等新技术的发展&#xff0c;传统的安全边界变得越来越模糊&#xff0c;访问控制模式局限性也越来越明显。企业需满足员工在任意时间、地点对企业内部进行访问的需求&#xff1b;服务器之间各自为界、相互独立&#xff0c;缺乏统一的安全…

Docker-consul容器服务更新与发现

目录 一、consul简介 1、什么是服务注册与发现 2、什么是consul 3、consul的关键特性 二、consul部署 1、consul服务器部署 1.1 建立consul服务 2、查看集群信息 3、通过http api 获取集群信息 三、registrator部署 1、安装Gliderlabs/Registrator 2、测试服务发现…

QT项目打包脚本

QT项目打包脚本 项目修改频繁&#xff0c;肯定不能手动在开始&#xff0c;菜单&#xff0c;找到相关环境&#xff0c;再输入windeployqt 打包。这里提供一个脚本用于打包。 按Wins&#xff0c;输入CMD D:# 创建打包用的目录 md MyProjectcd D:\MyProject# 拷贝文件 copy D:…

Redis(四)多级缓存

文章目录 一、传统缓存存在的问题二、多级缓存方案三、JVM进程缓存案例演示&#xff1a; 四、Lua语法入门Lua语言入门 五、多级缓存&#xff08;一&#xff09;安装OpenResty&#xff08;二&#xff09;OpenResty入门&#xff08;三&#xff09;请求参数处理&#xff08;四&…