java:jpa、Hibernate、Spring Data JPA、ORM以及和mybatis的区别

文章目录

    • Java连接数据库几种方式
    • JPA
    • Hibernate和Spring Data JPA
    • ORM框架
    • jpa和mybatis区别
    • Spring Boot JPA使用例子
      • 1、创建库和表
      • 2、添加依赖
      • 3、配置数据源和Hibernate属性
      • 4、配置实体类
      • 5、创建一个继承JpaRepository的接口:
      • 6、创建一个控制器(Controller)
      • 7、测试

Java连接数据库几种方式

  • JDBC: java原生提供
  • MyBatis: MyBatis 是一种优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和原始类型、接口和 Java POJOs(Plain Old Java Objects) 为映射,包括集成的复杂类型。
  • Hibernate: Hibernate 是一个开源的、用于把数据库中的表映射成对象的技术。Hibernate 可以把对象/关系映射的实现细节封装起来,让开发者专注于业务逻辑而不必顾及繁琐的数据持久化操作。Hibernate 是一个独立于应用程序的框架,它可以在应用中轻松集成数据库映射特性。
  • Spring Data JPA: Spring Data JPA 是 Spring 框架的一部分,它提供了一种更高级别的抽象,以简化数据库访问。Spring Data JPA 可以帮助开发者编写更少的代码,并且其设计的目的是为了简化数据访问层的代码,从而使业务逻辑与数据访问层分离。
  • Spring Boot JPA: Spring Boot JPA 是 Spring Boot 的一部分,它提供了一种方便的方式来连接和操作数据库。Spring Boot JPA 集成了 Hibernate 和 Spring Data JPA,使得连接和操作数据库变得非常简单。
  • Spring Boot MyBatis: Spring Boot MyBatis 是 Spring Boot 和 MyBatis 的结合,它提供了一种方便的方式来连接和操作数据库。Spring Boot MyBatis 集成了 MyBatis 和 Spring Boot,使得连接和操作数据库变得非常简单。
  • Spring Boot JdbcTemplate: Spring Boot 还提供了 JdbcTemplate 类,可以直接使用 JDBC 来连接和操作数据库。虽然不如其他一些框架那么方便,但对于一些简单的数据库操作来说,使用 JdbcTemplate 也是一个不错的选择。

JPA

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA是Java EE标准的一部分,它提供了一种标准的ORM框架,使得Java程序员可以方便地将数据持久化到关系数据库中。

JPA的功能包括:

  1. 通过注解或XML描述对象-关系映射关系;
  2. 将实体对象持久化到关系数据库中;
  3. 提供查询API,使得Java程序员可以以面向对象的方式操作数据库;
  4. 支持事务管理,确保数据的一致性和完整性。

JPA的提供商包括Hibernate、Spring Data JPA等。Hibernate是JPA的一个实现,提供了强大的ORM功能。Spring Data JPA是Spring框架的一部分,提供了方便的数据访问层抽象,支持自定义查询、数据访问自动化等功能。

Hibernate和Spring Data JPA

Hibernate和Spring Data JPA是两个不同的但相互关联的技术。

Hibernate是一个持久性框架,它提供了一种将对象模型映射到关系型数据库的方式。Hibernate通过使用映射元数据,将Java对象的状态与数据库表中的数据进行关联。这样,当对象状态发生改变时,Hibernate可以自动将更改应用到数据库中。

Spring Data JPA是Spring框架的一个扩展模块,它基于Spring的面向切面编程(AOP)和依赖注入(DI)特性,为数据访问层提供了一种更高级别的抽象。Spring Data JPA简化了与数据库的交互,通过使用Repository模式,将数据访问逻辑从业务模型中分离出来,并提供了更方便的查询API。

Spring Data JPA与Hibernate紧密集成,利用了Hibernate的映射和持久化机制来实现数据访问层的自动化。通过使用Spring Data JPA,您可以更专注于业务逻辑的实现,而无需过多关注底层的数据库访问细节。

因此,Hibernate和Spring Data JPA之间的关系是,Hibernate提供了对象关系映射的基础设施,而Spring Data JPA则在此基础上提供了更高级别的抽象和便利性。两者可以一起使用,以简化Java Web应用程序的开发过程。

ORM框架

上面提到了 ORM 框架简单说明一下:
ORM,全称为Object-Relational Mapping,即对象关系映射。它是一种将数据库中的记录映射为对象的技术。通过ORM,我们可以使用面向对象的方式来操作数据库,而不需要手动编写SQL语句。ORM框架会自动将我们的操作转换为SQL语句,并执行它们以完成数据的存取操作。这种技术大大简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层的数据库操作。

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
  
public class ORMExample {  
    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name";  
    private static final String DATABASE_USER = "username";  
    private static final String DATABASE_PASSWORD = "password";  
  
    public static void main(String[] args) {  
        User user = null;  
        try {  
            // 连接到数据库  
            Connection connection = DriverManager.getConnection(DATABASE_URL, DATABASE_USER, DATABASE_PASSWORD);  
  
            // 创建一个模型类,对应数据库中的表  
            class User {  
                private int id;  
                private String name;  
                private String email;  
  
                public User(int id, String name, String email) {  
                    this.id = id;  
                    this.name = name;  
                    this.email = email;  
                }  
  
                public int getId() {  
                    return id;  
                }  
  
                public String getName() {  
                    return name;  
                }  
  
                public String getEmail() {  
                    return email;  
                }  
            }  
  
            // 创建一个新的User对象并保存到数据库中  
            user = new User(1, "John", "john@example.com");  
            saveUser(connection, user);  
  
            // 根据ID查询User对象  
            user = getUserById(connection, 1);  
            System.out.println(user.getName());  // 输出:John  
  
            // 更新User对象的属性并保存到数据库中  
            user.setName("New Name");  
            saveUser(connection, user);  
        } catch (SQLException e) {  
            e.printStackTrace();  
        } finally {  
            // 关闭数据库连接(可选)  
            try {  
                if (user != null) {  
                    connection.close();  
                }  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
  
    private static void saveUser(Connection connection, User user) throws SQLException {  
        String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";  
        PreparedStatement statement = connection.prepareStatement(sql);  
        statement.setInt(1, user.getId());  
        statement.setString(2, user.getName());  
        statement.setString(3, user.getEmail());  
        statement.executeUpdate();  
    }  
  
    private static User getUserById(Connection connection, int id) throws SQLException {  
        String sql = "SELECT * FROM users WHERE id = ?";  
        PreparedStatement statement = connection.prepareStatement(sql);  
        statement.setInt(1, id);  
        ResultSet resultSet = statement.executeQuery();  
        if (resultSet.next()) {  
            User user = new User(resultSet.getInt("id"), resultSet.getString("name"), resultSet.getString("email"));  
            return user;  
        } else {  
            return null;  
        }  
    }  
}

这个代码示例中,ORM库提供了一个连接数据库并操作数据的方法。通过定义一个模型类,我们可以将数据库中的表映射为Java类,并使用Java对象来操作数据。

例如,我们可以创建一个User对象,设置它的属性,然后使用saveUser()方法将其保存到数据库中。在这个例子中,ORM库提供了一个简单而直观的方式来操作数据库。

jpa和mybatis区别

JPA和MyBatis是两种广泛使用的Java持久化框架,它们有以下区别:

  • 对象映射方式:JPA将Java对象映射到数据库表,开发者可以使用面向对象的方式进行数据库操作;而MyBatis则将SQL语句与Java对象进行映射,开发者可以编写SQL语句,并对其进行更精细的控制。
  • 移植性:JPA的移植性较好,因为其具体实现可以由不同的厂商提供,如Hibernate、EclipseLink等;而MyBatis则更灵活,可以自由编写SQL语句,但当项目移植时,可能需要进行相应的调整。
  • 修改字段:当需要修改字段时,JPA相对简单,而MyBatis可能需要修改多个地方。
  • 应用场景:通常小项目适合使用JPA,大型项目则更适合使用MyBatis。此外,JPA的saveAll方法批量新增速度会很慢,而MyBatis则可以更方便地进行批量新增。

Spring Boot JPA使用例子

1、创建库和表

1.1 创建库 spring-test
1.2 创建表

CREATE TABLE `users` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `age` int DEFAULT NULL,
  `email` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

1.3 添加一条数据
在这里插入图片描述

2、添加依赖

<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-data-jpa</artifactId>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        // 不指定版本可能有问题
        <version>8.0.23</version>
    </dependency>  
</dependencies>
  • spring-boot-starter-data-jpa 中包含 Hibernate
  • mysql-connector-java 这个依赖项包含了MySQL的JDBC驱动程序,它使得应用程序能够建立与MySQL数据库的连接并执行SQL查询。

3、配置数据源和Hibernate属性

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/spring-test?useSSL=false&characterEncoding=utf-8&useLegacyDatetimeCode=false
spring.datasource.username=root
spring.datasource.password=865091
  • 在Spring Boot中,可以在properties文件中直接配置数据库连接信息。代码中并没有直接使用这些信息,但Spring Boot会自动读取并解析这些配置,然后使用它们来创建数据源和Hibernate的会话工厂。
  • 当Spring Boot启动时,它会扫描指定的配置文件(默认为application.properties或application.yml),并加载这些配置。在上面的例子中,Spring Boot会读取properties文件中的数据库连接信息,然后使用它们来创建一个数据源和一个事务管理器。

4、配置实体类

在Hibernate中,实体类使用@Entity注解来表示,并使用@Table注解来指定表名。每个实体类都有一个主键,可以使用@Id注解来指定主键,并使用@GeneratedValue注解来指定主键的生成策略。例如,下面的代码定义了一个名为User的实体类,该类对应数据库中的users表,主键为自增的整数类型:
model/User.java

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;

@Entity  
@Table(name = "users")  
public class User {  
    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO)  
    private Integer id;  
      
    @Column(name = "name")  
    private String name;  
      
    @Column(name = "email")  
    private String email;  
      
    // getter and setter methods  
}

5、创建一个继承JpaRepository的接口:

repository/UserRepository.java

package com.zhangyu.repository;

import com.zhangyu.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {  
}

在Spring Data JPA中,创建Repository接口并继承JpaRepository接口是为了简化数据访问层的开发。JpaRepository是Spring Data JPA提供的一个接口,它扩展了Spring框架的CrudRepository接口,并提供了许多用于访问数据库的方法。

通过继承JpaRepository接口,您可以定义自定义的查询方法和数据访问逻辑,而无需编写底层的SQL查询代码。JpaRepository提供了一些常用的方法,例如findAll()、findById()、save()等,可以轻松地进行数据的查询和保存操作。

通过这一步,您可以利用Spring Data JPA的便利性,快速地构建数据访问层,而无需手动编写与数据库交互的代码。这有助于减少开发工作量,提高开发效率,并确保数据访问层的代码符合Spring框架的最佳实践。

6、创建一个控制器(Controller)

package com.zhangyu.controller;

import com.zhangyu.model.User;
import com.zhangyu.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("getAll")
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

7、测试

GET http://127.0.0.1:9090/users/getAll

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车电子 -- 车载ADAS之FCTA/FCTB(前方横向来车碰撞预警/制动)

参看&#xff1a;功能定义-前方交通穿行提示&制动 1、前方横向来车碰撞预警/制动 FCTA/FCTB&#xff08; Front Cross Traffic Alert /Brake&#xff09; 前方横向来车碰撞预警FCTA&#xff08; Front Cross Traffic Alert &#xff09; 其功能表现为在车辆低速前进时&am…

解锁 ElasticJob 云原生实践的难题

发生了什么 最近在逛 ElasticJob 官方社区时发现很多小伙伴都在头疼这个 ElasticJob 上云的问题&#xff0c;ElasticJob 本就号称分布式弹性任务调度框架&#xff0c;怎么在云原生环境就有了问题了呢&#xff0c;这就要从 Kubenertes 和 ElasticJob 的一些状态化说起。 有意思的…

Java SE

目录 编程编的其实就是启动之后的内存⭐配置环境Java环境Windows配置Java环境变量Linux配置Java环境变量前言&#xff1a;常见Linux系统 Java基础类型八大基本数据类型数值型非数值型 void引用数据类型 运算符位运算符其他 基本结构表达式方法类实例&#xff08;对象&#xff0…

战略制定|竞争战略管理分析六大常用工具

企业战略可从多个角度理解&#xff0c;体现为著名的5P模型。首先&#xff0c;从未来发展视角看&#xff0c;战略是一种计划(Plan)&#xff0c;指导企业朝向既定目标前进。而从过去的发展历程看&#xff0c;它呈现为一种模式(Pattern)&#xff0c;反映了企业的历史行为趋势。在产…

【Apifox】测试工具自动编写接口文档

在开发过程中&#xff0c;我们总是避免不了进行接口的测试&#xff0c; 而相比手动敲测试代码&#xff0c;使用测试工具进行测试更为便捷&#xff0c;高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman&#xff0c;他还拥有一个非常nb的功能&#xff0c; 在接…

解决git action发布失败报错:Error: Resource not accessible by integration

现象&#xff1a; 网上说的解决方法都是什么到github个人中心setting里面的action设置里面去找。 可这玩意根本就没有&#xff01; 正确解决办法&#xff1a; 在你的仓库页面&#xff0c;注意是仓库页面的setting里面&#xff1a; Actions> General>Workflow permisss…

dart多线程双向通信的案例----【小学4年级课程】

下面是运行后的打印顺序 I/flutter (20170): 上班 I/flutter (20170): 这里是校长室:main I/flutter (20170): 这里是饭堂:fantang1 I/flutter (20170): 这里是收发室--检查小孩发回去给他妈妈的信息是&#xff1a;我是秘书的儿子&#xff0c;我来到在校长室了。校长今晚想吃羊…

Docker 概述与安装

文章目录 1. Docker简介2. 传统虚拟机和容器3. Docker运行速度快的原因4. Docker软件4.1 Docker镜像4.2 Docker容器4.3 Docker仓库 5. Docker架构6. CentOS安装Docker6.1 卸载旧版本6.2 配置yum资源库6.3 安装Docker引擎6.4 启动docker引擎6.5 设置开机自启 7. 卸载Docker8. 运…

DM8误删除操作恢复方案

达梦数据库三种在误删除操作后的回退方案 一、闪回表 当用户操作不慎导致错误的删改数据时&#xff0c;闪回方式可以恢复数据。闪回技术&#xff0c;就是为了用户可以迅速处理这种 数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原…

Java大型电商项目——品优购(一)

视频教程&#xff1a;【黑马程序员】Java大型电商项目—品优购【配套源码笔记】_哔哩哔哩_bilibili源码下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1fECz5In_XCB-aW6ed6ZTbA 提取码&#xff1a;27xa 技术选型&#xff1a; 后端框架&#xff1a;SpringSprin…

使用 watch+$nextTick 解决Vue引入组件无法使用问题

问题描述&#xff1a; 很多时候我们都需要使用第三方组件库&#xff0c;比如Element-UI&#xff0c;Swiper 等等。 如果我们想要在这些结构中传入自己从服务器请求中获取的数据就会出现无法显示的问题。 比如我们在下面的Swiper例子中&#xff0c;我们需要new Swiper 才能让…

福州大学《嵌入式系统综合设计》 实验八:FFMPEG视频编码

一、实验目的 掌握使用算能平台进行视频编码的流程&#xff0c;包括开发主机环境与云平台的配置&#xff0c;视频编码程序的编写与理解&#xff0c;代码的编译、运行以及学习使用码流分析工具分析视频压缩码流等。 二、实验内容 搭建实验开发环境&#xff0c;编译并运行编码…

软著项目推荐 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

图数据库HugeGraph:HugeGraph-Hubble基于Web的可视化图管理初体验

原创/朱季谦 一、HugeGraph-Hubble简介 关于HugeGraph&#xff0c;官方资料是这样介绍的&#xff0c;它是一款易用、高效、通用的开源图数据库系统&#xff08;Graph Database&#xff09;&#xff0c; 实现了 Apache TinkerPop3 框架及完全兼容 Gremlin 查询语言&#xff0c…

Pod控制器简介,ReplicaSet、Deployment、HPA三种处理无状态pod应用的控制器介绍

目录 一.Pod控制器简介 二.ReplicaSet&#xff08;简写rs&#xff09; 1.简介 &#xff08;1&#xff09;主要功能 &#xff08;2&#xff09;rs较完整参数解释 2.创建和删除 &#xff08;1&#xff09;创建 &#xff08;2&#xff09;删除 3.扩容和缩容 &#xff08…

【Python】torch.exp()和 torch.sigmoid()函数详解和示例

本文对torch.exp&#xff08;&#xff09;和 torch.sigmoid&#xff08;&#xff09;函数进行原理和示例讲解&#xff0c;以帮助大家理解和使用。 目录 torch.exp函数原理运行示例 torch.sigmoid&#xff08;&#xff09;函数原理运行示例torch.sigmoid相关知识 结合运行 torc…

Leetcode 380. O(1) 时间插入、删除和获取随机元素

文章目录 题目代码&#xff08;11.28 首刷看解析&#xff09; 题目 Leetcode 380. O(1) 时间插入、删除和获取随机元素 代码&#xff08;11.28 首刷看解析&#xff09; 1.length:表示的是数组的长度 数组 2.length():表示的是字符串的长度 字符串 3.size():表示的是集合中有多…

Re55:读论文 Entities as Experts: Sparse Memory Access with Entity Supervision

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;Entities as Experts: Sparse Memory Access with Entity Supervision 模型名称&#xff1a;Entities as Experts (EaE) ArXiv网址&#xff1a;https://arxiv.org/abs/2004.07202 本文…

看懂YOLOv7混淆矩阵的含义,正确计算召回率、精确率、误检率、漏检率

文章目录 1、准确率、精确率、召回率、误报率、漏报率概念及公式1.1 准确率 Accuracy1.2 精确率 Precision1.3 召回率 Recall1.4 F1-Score1.5 误检率 false rate1.6 漏检率 miss rate 2、YOLOv7混淆矩阵分析 1、准确率、精确率、召回率、误报率、漏报率概念及公式 重点参考博文…

基于Eclipse+Mysql+Tomcat开发的挖掘机配件营销系统

基于EclipseMysqlTomcat开发的挖掘机配件营销系统 项目介绍&#x1f481;&#x1f3fb; 大家都有目共睹&#xff0c;现在的科学技术发展很迅速。而如今&#xff0c;计算机应用已经完全融入到人们的生产和生活当中&#xff0c;特别是企业&#xff0c;现在的企业几乎都是离不开计…