Spring Data Jpa

  JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR 338,这些接口所在包为 javax.persistence,详细内容可参考https://github.com/javaee/jpa-spec

JPA的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强。总的来说,JPA包括以下3方面的技术:

  • ORM映射元数据: 支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系
  • API: 操作实体对象来执行CRUD操作
  • 查询语言: 通过面向对象而非面向数据库的查询语言( JPQL)查询数据,避免程序的SQL语句紧密耦合

Spring Data Jpa官方解释

连接:https://spring.io/projects/spring-data-jpa#overview

Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库。 此模块处理对基于JPA的数据访问层的增强支持。 它使构建使用数据访问技术的Spring驱动应用程序变得更加容易。

在相当长的一段时间内,实现应用程序的数据访问层一直很麻烦。 必须编写太多样板代码来执行简单查询以及执行分页和审计。 Spring Data JPA旨在通过减少实际需要的工作量来显著改善数据访问层的实现。 作为开发人员,您编写repository接口,包括自定义查找器方法,Spring将自动提供实现。

Spring Data Jpa

Hibernate、Jpa、Spring Data Jpa三者之间的关系

Hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

JPA

JPA全称是Java Persistence API,即java持久化API,是sun公司推出的一套基于ORM的规范,内部由一系列的接口和抽象类构成

JPA与Hibetnate的关系

JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。

Spring Data jpa

Spring Data JPA 让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使数据库层操作更加简单,方便解耦

总结:

JPA是一种规范,Hibernate实现了JPA规范,即Hibernate为JPA的一种实现;而Spring Data JPA是对JPA进行更高级的封装,让其dao编码变得更简单。

Spring Boot整合Spring Data Jpa

导入依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <scope>runtimescope>
dependency>
<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
    <optional>trueoptional>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-devtoolsartifactId>
    <optional>trueoptional>
dependency>
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-testartifactId>
    <scope>testscope>
dependency>

相关配置

server:
  port: 9001
spring:
  application:
    name: service-product
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/practice?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456
  jpa:
    database: mysql
    show-sql: true
    open-in-view: true
    hibernate:
      ddl-auto: update

ddl-auto

  • create:每次运行程序时,都会重新创建表,故而数据会丢失
  • create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表
  • upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
  • validate:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
  • none: 禁用DDL处理

Spring Data Jpa的使用

Spring Data Jpa UML类图

Spring Data Jpa

简单的REST CRUD示例

实体类

package com.jpa.product.entity;

        import lombok.Data;

        import javax.persistence.*;
        import java.math.BigDecimal;

/**
 * @author: MR.LIU
 * @description:
 * @date: 2020/5/29
 * @time: 22:17
 */
@Data
@Entity
@Table(name = "product")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "product_name")
    private String productName;

    @Column(name = "price")
    private BigDecimal price;

    @Column(name = "description")
    private String description;

    @Column(name = "status")
    private Integer status;

    @Column(name = "caption")
    private String caption;

    @Column(name = "stock")
    private Integer stock;
}

一般简单的Demo示例中只会使用@GeneratedValue(strategy = GenerationType.IDENTITY)这种主键自增的策略,而实际数据库中表字段主键类型很少是int型的

JPA自带的几种主键生成策略

  • TABLE: 使用一个特定的数据库表格来保存主键
  • SEQUENCE: 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)
  • IDENTITY: 主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
  • AUTO: 主键由程序控制,也是GenerationType的默认值

dao层

package com.jpa.product.dao;

import com.jpa.product.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

/**
 * @author: MR.LIU
 * @description: 数据层
 * @date: 2020/5/29
 * @time: 22:34
 */
public interface ProductDao extends JpaRepository, JpaSpecificationExecutor {
}

service层

package com.jpa.product.service;

import com.jpa.product.entity.Product;

/**
 * @author: MR.LIU
 * @description: 接口层
 * @date: 2020/5/29
 * @time: 22:37
 */
public interface ProductService {
    /**
     * 根据id查询
     * @param id
     * @return
     */
    Product findById(Long id);

    /**
     * 保存
     * @param product
     * @return
     */
    void save(Product product);

    /***
     * 修改
     * @param product
     * @return
     */
    void update(Product product);

    /**
     * 删除
     * @param id
     * @return
     */
    void delete(Long id);
}

impl层

package com.jpa.product.service.impl;

import com.jpa.product.dao.ProductDao;
import com.jpa.product.entity.Product;
import com.jpa.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author: MR.LIU
 * @description:
 * @date: 2020/5/29
 * @time: 22:41
 */
@Service
public class ProductServiceImpl implements ProductService {
    @Autowired
    private ProductDao productDao;

    @Override
    public Product findById(Long id) {
        return productDao.findById(id).get();
    }

    @Override
    public void save(Product product) {
         productDao.save(product);
    }

    @Override
    public void update(Product product) {
        productDao.save(product);
    }

    @Override
    public void delete(Long id) {
        productDao.deleteById(id);
    }
}

controller层

package com.jpa.product.controller;

import com.jpa.product.entity.Product;
import com.jpa.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author: MR.LIU
 * @description:
 * @date: 2020/5/29
 * @time: 22:47
 */
@RestController
@RequestMapping(value = "/product")
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping(value = "/{id}")
    public Product getProduct(@PathVariable Long id) {
        return productService.findById(id);
    }

    @PostMapping(value = "/save")
    public String saveProduct(@RequestBody Product product){
        productService.save(product);
        return "保存成功";
    }

}

测试

http://localhost:9001/product/1

成功查询

Spring Data Jpa

模糊查询

自定义DAO接口

@Query(value = "select * from product where product_name like concat('%',:name,'%')",nativeQuery = true)
    List findByNameMatch(@Param("name") String name);

上的SQL语句一定要按照Query的格式来。以上都是写在DAO层(respository层里面)

@Query注解的用法(Spring Data JPA) 这里参考:http://www.cnblogs.com/zj0208/p/6008627.html

Original: https://www.cnblogs.com/jixia/p/12989623.html
Author: 稷下
Title: Spring Data Jpa

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588568/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 深入理解super关键字

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    071
  • 注解@DependsOn解析

    @DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中。 在哪里被解析 代码为 AnnotationC…

    Java 2023年6月15日
    060
  • (转发)Debian GNU/Linux 11.1 安装

    Debian GNU/Linux 是 Linux 发行版之一,也是众多 Linux 发行版的上游系统,下游Linux 发行版,比如 Ubuntu,可视为 Debian 的改动款。当…

    Java 2023年6月9日
    0103
  • nginx环境安装配置fail2ban屏蔽攻击ip

    这个是设置 fail2ban 封禁的关键因素 攻击日志的信息: CC 攻击的 IP 会经过 Nginx和 lua 处理后,访问状态变为 403,根据 Nginx的访问日志格式,设置…

    Java 2023年5月30日
    090
  • RabbitMQ:大白话讲解RabbitMQ架构原理

    MQ是什么? MQ全称Message Queue,中文名称消息队列。顾名思义,它就是一个队列,简单来说就是一个应用程序A将数据丢到一个队列中,由另一个应用程序B从队列中拿到这个数据…

    Java 2023年5月30日
    066
  • JavaFx制作简易的mp4播放器

    在制作视频播放器时,用JAVA语言编写是个很方便的选择。虽然JavaFX从JDK11开始就分离,但是在网上稍微搜索下就可以找到解决方法(在命令行下运行的命令是最清楚的)。原谅我不太…

    Java 2023年6月9日
    086
  • SpringBoot集成onlyoffice实现word文档编辑保存

    onlyoffice为一款开源的office在线编辑组件,提供word/excel/ppt编辑保存操作 以下操作均基于centos8系统,officeonly镜像版本7.1.2.2…

    Java 2023年6月15日
    088
  • IDEA 启动报错 java.nio.charset.MalformedInputException: Input length=2

    idea 启动提示 other.xml 无法解析 …… cannot parse file other.xml: java.nio.charset.Malf…

    Java 2023年5月29日
    060
  • java 驼峰字符和下划线字符相互转换工具类

    public static final char UNDERLINE=’_’; public static String camelToUnderline(String param…

    Java 2023年5月29日
    063
  • 并发编程 1

    jmm java 内存模型,这个东西目前先不跟jvm模型对应起来。 存在一个工作内存、驻内存的概念 线程间通信 cas 原子性 有序性 可见性 结合一个两个线程之间交互的例子 pu…

    Java 2023年6月9日
    085
  • yum安装软件报错Error: Nothing to do

    今天在一台新服务器上装一些常用软件,一开始安装ncdu(一个很好用的磁盘分析工具,用来查找大文件),报错如下: 在网上找了各种办法,什么更新yum啊,清理yum缓存啊的,统统没用 …

    Java 2023年6月9日
    061
  • Linux常用的命令

    1 常用的系统工作命令 man 命令用来查看man命令自身的帮助信息 MAN(1) Manual pager utils MAN(1) NAME man – an interfac…

    Java 2023年6月8日
    080
  • scrapy框架之item与pipelines

    继续以起点小说为例子,我们要做的就是把对象存储到item(类似于一个字典)中,在通过pipelines持久化到txt文件中。之前我们在运行爬虫的后面加”-o 爬虫名称&…

    Java 2023年6月5日
    093
  • Activemq消息类型

    Activemq消息类型JMS规范中的消息类型包括TextMessage、MapMessage、ObjectMessage、BytesMessage、和StreamMessage等…

    Java 2023年5月29日
    050
  • Redis安装(CentOS 8.5 64位)

    Redis安装 1. 准备工作 1.1 下载安装包 官网下载地址:https://redis.io/ 1.2 传输文件到服务器 使用ssh工具连接到服务器,把下载好的文件上传到服务…

    Java 2023年6月5日
    090
  • Day14 note1

    package com.oop.demo06;public class Person { public void run(){ System.out.println("r…

    Java 2023年6月5日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球