SpringBoot教程(十二) | SpringBoot集成JPA

这篇具有很好参考价值的文章主要介绍了SpringBoot教程(十二) | SpringBoot集成JPA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot教程(十二) | SpringBoot集成JPA

1. JPA简介

概念:

JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

优势:

  • 标准化 JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
  • 容器级特性的支持 JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
  • 简单方便 JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
  • 查询能力 JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
  • 高级特性 JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。

2. spring-data-jpa

JPA本身就是一套标准,就和jdbc一样,不同的上场都是可以来进行实现。目前使用的比较多的都是hibernate的实现。 然而在SpringBoot中我们可以无缝的集成Spring-data-jpa, 简答介绍一个Spring-data. 他也是属于Spring家族的一个产品,主要就是用来封装各种中间件的操作,比如Spring-data-jdbc,就是我们浅浅讲到的jdbcTemplate, 还有spring-data-jpa用来实现JPA, Spring-data-redis封装操作redis的api, 还有spring-data-mongodb, spring-data-elasticsearch,等等。

SpringData所包含的项目如下:

SpringBoot教程(十二) | SpringBoot集成JPA,spring boot,后端,java 由于产品本身都是spring的,所以和spring的集成有着得天独厚的优势。并且也直接为springBoot提供了相应的starter,我们引入后就可以直接操作,非常方便。

3. JPA、hibernate、SpringDataJpa关系

JPA仅仅是一种规范,也就是说它仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。

SpringDataJpa是Spring提供的一套简化JPA开发的框架,按照约定好的方法命名规则来创建DAO层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。并且提供了一些常用的增删改查等方法的直接操作。 SpringDataJpa可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的Jpa技术实现。

4. 集成步骤

我们还是先拉取一个feature/jpa的分支,防止和前面的mybatis冲突。这个分支里只负责集成JPA的操作。

4.1 引入SpringDataJpa所需依赖

xml复制代码<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

 <!-- MySQL连接 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

通过观察依赖包,我们也能够发现其实他还是使用了hibernate:

SpringBoot教程(十二) | SpringBoot集成JPA,spring boot,后端,java

4.2 配置数据库连接

在spring的配置文件application.yml中配置数据库相关信息:

yml复制代码spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot_learning?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
    username: root
    password: root
  jpa:
    show-sql: true # 默认false,在日志里显示执行的sql语句
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      ddl-auto: update #指定为update,每次启动项目检测表结构有变化的时候会新增字段,表不存在时会 新建,如果指定create,则每次启动项目都会清空数据并删除表,再新建
      naming:
        #指定jpa的自动表生成策略,驼峰自动映射为下划线格式7
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
        #physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

4.3 实体的编写

在Jpa中,有自己独立风格的实体,一般来讲就是有一些独特的注解来定义实体。 Jpa是一个比较完全式的ORM框架,就是可以完全通过实体映射数据库,甚至我们可以根据实体去生成数据库。

我们先来看实体的案例,还是以User为例。

java复制代码/**
 * @className: User
 * @description:
 * @author: sh.Liu
 * @date: 2022-01-14 16:35
 */
@Data
@Entity
@Table(name = "t_user")
public class User {

    /**
     * 主键生成策略: 自增
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private Integer age;

    private String address;

    private Date createTime;

    private Date updateTime;

}

这里有这么几个特殊的注解。

@Entity: 标识这是一个实体类

@Table: 标识与之映射的表名

@Id: 标识数据库主键

@GeneratedValue: 标识主键生成策略,这里是自增。

4.4 Dao层开发

Dao层主要处理和数据库的交互,这里我们可以使用JPA为我们提供的基类:JpaRepository,里面包含了大部分常用操作。只需集成即可。

java复制代码package com.lsqingfeng.springboot.dao;

import com.lsqingfeng.springboot.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.io.Serializable;

public interface UserDao extends JpaRepository<User,Integer>, Serializable {
}

接下来就可以在Service中直接调用Dao层,完成常用功能的开发,然后在Controller层中调用Service,将整个流程串起来。

java复制代码package com.lsqingfeng.springboot.service.impl;

import com.lsqingfeng.springboot.dao.UserDao;
import com.lsqingfeng.springboot.entity.User;
import com.lsqingfeng.springboot.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @className: UserServiceImpl
 * @description:
 * @author: sh.Liu
 * @date: 2022-01-17 13:56
 */
@Service
public class UserServiceImpl implements UserService {

    private final UserDao userDao;

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public User getUserById(Integer id) {
        return userDao.getById(id);
    }

    @Override
    public List<User> listUser() {
        return userDao.findAll();
    }

    @Override
    public int save(User user) {
        userDao.save(user);
        return user.getId();
    }

    @Override
    public int update(Integer id, User user) {
        // 有id则更新,无id则新增
        user.setId(id);
        userDao.save(user);
        return id;
    }

    @Override
    public int delete(Integer id) {
        User user = new User();
        user.setId(id);
        userDao.delete(user);
        return id;
    }
}

4.5 测试

通过postman调用相关接口进行测试。

SpringBoot教程(十二) | SpringBoot集成JPA,spring boot,后端,java

查看数据库:

SpringBoot教程(十二) | SpringBoot集成JPA,spring boot,后端,java

时间值没有,因为我们没有在新增的时候设置当前时间。

再试试修改和查询

SpringBoot教程(十二) | SpringBoot集成JPA,spring boot,后端,java

新增。

SpringBoot教程(十二) | SpringBoot集成JPA,spring boot,后端,java

4.6 自定义SQL的执行

现在我们的DAO层用的是JPA自带的通过继承一个基类的常用操作来实现的。那如果说我们有一个需求需要我们自己写一些sql应该如何实现呢。我们来实现一个根据名字查询的接口。

首先在DAO层定义一个接口。

java复制代码public interface UserDao extends JpaRepository<User,Integer>, Serializable {

    /**
     *
     * @param name
     * @return
     */
    @Query("select u from User u where u.name = ?1")
    User getByName(String name);

}

然后在Service层和Controller层调用这个方法。查看效果。

java复制代码    @GetMapping("getByName")
    public Result getByName(String name){
        return Result.success(userService.getByName(name));
    }

修改下数据库数据。

SpringBoot教程(十二) | SpringBoot集成JPA,spring boot,后端,java

查询结果:

SpringBoot教程(十二) | SpringBoot集成JPA,spring boot,后端,java

这里要注意的是: 我们在Query注解上写的是HQL语句,也就是默认操作的是对象。所以是from User, 也就是用对象去操作数据库,如果我们想要写原生sql,那么写法如下:

java复制代码@Query("select u from t_user u where u.name = ?1",nativeQuery = true)
User getByName(String name);

5. 总结

关于JPA的简单集成大概就介绍这么多,JPA的思想主要是通过对象操作数据库,相比于mybatis更加ORM, 所以相比之下,也有人把mybatis比作是一个半ORM的框架,主要原因就是sql和HQL的区别,这个如果使用的hibernate的同学应该更有感触。

关于JPA和Mybatis的选择问题,这个之一在网络上争论不断,这个其实也没有什么好坏之分,是要能实现我们的目的,选择那种框架只不过是其中的一种手段罢了。而像我确实还是用mybatis-Plus比较多。可能用的多了,也就感觉它更方便一些,下一篇文章咱们讲讲mybatis的升级版,mybatisPlus的用法。

另: 配套项目代码已托管中gitCode: gitcode.net/lsqingfeng/…文章来源地址https://www.toymoban.com/news/detail-800193.html

到了这里,关于SpringBoot教程(十二) | SpringBoot集成JPA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringBoot3】Spring Boot 3.0 集成 Redis 缓存

    Redis缓存是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它主要用于作为数据库、缓存和消息中间件,以快速读写和丰富的数据结构支持而著称。 在应用程序和数据库之间,Redis缓存作为一个中间层起着关键

    2024年02月21日
    浏览(40)
  • spring boot学习第六篇:SpringBoot 集成WebSocket详解

    1、WebSocket简介 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。 2、为什么需要WebSocket HTTP 是基于请求响应式的,即通信只能由客户端发起,服务端做出响应,无状态,无连接。 无状态:每次连

    2024年01月21日
    浏览(40)
  • Spring Boot 3项目集成Swagger3教程

    欢迎来到我的小天地,这里是我记录技术点滴、分享学习心得的地方。📚 🛠️ 技能清单 编程语言 :Java、C、C++、Python、Go、 前端技术 :Jquery、Vue.js、React、uni-app、Echarts UI设计 : Element-ui、Antd、Color-ui 后端技术 :Spring Boot、Mybatis-plus、Swagger 移动开发 :Android 操作系统 :

    2024年04月17日
    浏览(46)
  • Jpa与Druid线程池及Spring Boot整合(一): spring-boot-starter-data-jpa 搭建持久层

                          Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二):几个坑 附录官网文档:core.domain-events域事件 docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五

    2024年02月13日
    浏览(40)
  • Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

                         docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六):docker 网络及数据卷设置 docker实战(七):docker 性质及版本选择 认知升维: 道、法、

    2024年02月13日
    浏览(47)
  • Spring Boot 实战 | Spring Boot整合JPA常见问题解决方案

    专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏: Python 专栏: Redis 专栏: TensorFlow 专栏: Logback 专栏: 量子计算: 量子计算 | 解密著名量子算法Shor算法和Grover算法 AI机器学习实战: AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析 AI机器学习 | 基于lib

    2024年02月04日
    浏览(47)
  • Spring Boot整合Spring Data Jpa + QueryDSL

    Spring Data JPA是一个Spring项目中常用的持久化框架,它简化了与数据库进行交互的过程。而QueryDSL是一个查询构建框架,可以让我们以面向对象的方式来编写数据库查询。 在本文中,我们将讨论如何使用Spring Boot整合Spring Data JPA和QueryDSL,并提供一个使用案例来演示它们的用法。

    2024年02月09日
    浏览(50)
  • 在Spring Boot项目中使用JPA

    Spring Boot提供了启动器spring-boot-starter-data-jpa,只需要添加启动器(Starters)就能实现在项目中使用JPA。下面一步一步演示集成Spring Data JPA所需的配置。 步骤01 添加JPA依赖。 首先创建新的Spring Boot项目,在项目的pom.xml中增加JPA相关依赖,具体代码如下:

    2024年02月09日
    浏览(44)
  • spring boot +springboot集成es7.9.1+canal同步到es

    未经许可,请勿转载。 其实大部分的代码是来源于 参考资料来源 的 主要代码实现 ,我只是在他的基础上增加自定义注解,自定义分词器等。需要看详细源码的可以去看 主要代码实现 ,结合我的来使用。 有人会问为什么需要自定义注解,因为elasticsearch7.6 索引将去除type 没

    2023年04月11日
    浏览(74)
  • Spring Boot进阶(55):SpringBoot之集成MongoDB及实战使用 | 超级详细,建议收藏

            随着大数据时代的到来,数据存储和处理变得越来越重要。而MongoDB作为一种非关系型数据库,具有高效的数据存储和处理能力,被越来越多地应用于各种领域。尤其在Web应用开发中,SpringBoot框架已经成为了主流选择之一。在这篇文章中,我们将探讨如何将MongoD

    2024年02月17日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包