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

news2024/12/23 13:22:44

文章目录

    • 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

在这里插入图片描述

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

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

相关文章

混合云案例:利用 Databend Cloud 高效加速私有 Databend 的策略与实施

背景 Databend 是一款基于对象存储的存算分离湖仓产品&#xff0c;已成为云上大数据分析中高效且低成本的首选解决方案。目前&#xff0c;Databend 在多个用户场景中得到广泛应用&#xff0c;包括&#xff1a; 新媒体行业数据分析及大屏数据展示云上 CDH 替代以减少本地磁盘和…

DDD 系统间的七种关系梳理与实践

系统间的七种关系 本节将根据耦合度从高到低逐一探讨这些关系。耦合度高有时并不是坏事&#xff0c;它能够让团队内部的系统更加内聚&#xff0c;而不是无法整合的碎块。我们应该根据具体情况进行选择。 因为系统间关系往往也是组织架构的反映&#xff0c;此处每种关系除了描…

9.Spring 整合 Redis

引入依赖&#xff1a;spring-boot-starter-data-redis配置 Redis&#xff1a;配置数据库参数、编写配置类&#xff0c;构造 RedisTemplate访问 Redis&#xff1a; redisTemplate.opsForValue() redisTemplate.opsForHash() redisTemplate.opsForList() redisTemplate.opsForSe…

vue3默认插槽、具名插槽以及作用域插槽实现父子组件通信

默认插槽与具名插槽 父组件 <template><div><h1>我是父组件</h1><child><div style"color: red">我是从父元素插入的值(默认插槽)</div><template #juming><div style"color: green">我是从父元素…

2023亚马逊云科技re:Invent,在开发者板块探究如何利用技术重塑业务

美国当地时间11月27日&#xff0c;一年一度的亚马逊云科技re:Invent大会在美国拉斯维加斯盛大开幕。这场全球云计算领域的前沿盛会&#xff0c;已连续12年成为引领行业的风向标。那么本次2023亚马逊云科技re:Invent大会又有哪些可玩、可看的新项目&#xff0c;下面就一起来瞧一…

评价体系如何构建?

本文将针对权重计算的一些常见问题进行说明&#xff1a;如组合赋权法的综合权重值如何计算&#xff1f;多层级权重如何计算&#xff1f;用多种方法计算得到的权重如何合并为综合权重用于之后的分析&#xff1f;常见的不同权重计算方法的搭配方式&#xff1f; 一、九种权重计算…

(2)(2.1) Lightware SF40/C(360度)

文章目录 前言 1 安装SF40c 2 连接自动驾驶仪 3 通过地面站进行配置 4 参数说明 前言 Lightware SF40/C 360 度激光雷达(Lightware SF40/C 360degree lidar)可在 Copter-3.4 及更高版本的 Loiter 模式下用于物体回避。 &#xff01;Warning 该功能尚未在各种情况下进行过…

网络运维与网络安全 学习笔记2023.11.28

网络运维与网络安全 学习笔记 第二十九天 今日目标 OSPF汇总之域间路由、OSPF汇总之外部路由、OSPF链路认证 OSPF安全认证之区域认证、OSPF虚链路 OSPF汇总指域间路由 项目背景 企业内网运行多区域的OSPF网络&#xff0c;在R1 上存在多个不稳定的链路 R1上的不稳定链路&a…

如何与LEONI建立EDI连接?

莱尼LEONI是一家为汽车及其他行业提供能源数据管理产品、解决方案及服务的全球供应商。供应链范围从研发生产标准化电缆、特种电缆和数据电缆到高度复杂的布线系统和相关组件。本文将介绍如何与莱尼LEONI建立EDI连接。 什么是EDI&#xff1f; EDI全称Electronic Data Interch…

linux(2)之buildroot使用手册

Linux(2)之buildroot配置toolchain Author&#xff1a;Onceday Date&#xff1a;2023年11月27日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; Buildroot - Making Embedded Linux Easy 文章目录 Linux(2)之buildroot配置toolchain1. 构建配置1.1 配置config生成…

Spring之AOP理解与应用(更新中)

1. AOP的认识 面向切面编程&#xff1a;基于OOP基础之上新的编程思想&#xff0c;OOP面向的主要对象是类&#xff0c;而AOP面向的主要对象是切面&#xff0c;在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点&#xff0c;AOP提供了非常强…

【Python小游戏】推荐8款自由的Python游戏项目

推荐8款自由的Python游戏项目 今天给大家推荐8款不错的Python小游戏&#xff0c;这些小游戏所有项目文件&#xff08;包括所需的所有代码、图像和音频文件&#xff09;&#xff0c;给大家已经放到平台的下载频道&#xff0c;需要的可以注意一下文末的链接地址。 下面给大家简单…

Matlab进阶绘图第34期—双三角热图

在《Matlab进阶绘图第29期—三角热图》中&#xff0c;我分享过三角热图的绘制模板。 然而&#xff0c;有的时候&#xff0c;为了节省版面或者方便对比等&#xff0c;需要在一张图上绘制两个三角热图的组合形式&#xff0c;且每个三角热图使用不同的配色方案&#xff0c; 由于…

C++ 红黑树的封装

一.map/set的封装 在实现了红黑树的部分功能后&#xff0c;我们可以便可以将红黑树作为底层结构来封装map 和 set &#xff0c;但是问题也随之而来。我们都知道map是k-v的数据模型&#xff0c;而set是k的数据模型&#xff0c;我们难道要去使用两棵红黑树来封装吗&#xff1f;显…

2023年汉字小达人市级比赛最后一天的整体复习建议和5个提醒

今天是2023年11月29日&#xff0c;明天&#xff08;11月30日&#xff0c;星期四&#xff09;就是2023年汉字小达人市级活动&#xff08;市级比赛&#xff09;比赛的日子了。从孩子今天16点30放学&#xff0c;到明天16点开始比赛&#xff0c;除去生活时间、写学校作业&#xff0…

echarts图表滚动条带动页面窗口滚动条的问题

网上搜了很多方法不管用&#xff0c;后来发现每次滚动echarts或者左右滑动echarts下方都会报错&#xff0c;报错提示如下&#xff0c;看看你们的图表是否这样报错&#xff1a; 报错信息如下&#xff1a;Unable to preventDefault inside passive event listener invocation 原…

什么是Geo Trust OV证书

一、GeoTrust OV证书的介绍 GeoTrust OV证书是由GeoTrust公司提供的SSL证书&#xff0c;它是一种支持OpenSSL的数字证书&#xff0c;具有更高的安全性和可信度。GeoTrust是全球领先的网络安全解决方案提供商&#xff0c;为各类用户提供SSL证书和信任管理服务。GeoTrust OV证书…

在Springboot中操作Redis——五大数据类型

在Java中操作Redis Redis的Java客户端 前面我们讲解了Redis的常用命令&#xff0c;这些命令是我们操作Redis的基础&#xff0c;那么我们在java程序中应该如何操作Redis呢&#xff1f;这就需要使用Redis的Java客户端&#xff0c;就如同我们使用JDBC操作MySQL数据库一样。 Red…

pgsql 更新A表的x字段通过查询b表的z字段

查询表t_local_warning_hit_source的send_time 更新到表t_local_warning_source WITH t2 AS ( SELECT ID, send_time FROM t_local_warning_hit_source WHERE send_time > 2023-09-27 00:00:00 AND send_time < 2023-11-28 00:00:00 ) UPDATE t_local_warning_source t…