SpringBoot2.x系列教程——整合使用JPA

一. JPA简介## **一. JPA简介**一. JPA简介

1. JPA概念

JPA是Sun官方提出的Java持久化规范,是Java Persistence API的简称,中文名‘Java持久层API’,它本质上是一种ORM规范。

JPA通过 JDK 5.0 的 注解或XML 两种形式来描述 ‘对象--关系表’ 的映射关系,并将运行期的实体对象持久化到数据库中。

2. JPA出现的原因

Sun引入 JPA 规范是出于两个原因:

1. 简化现有Java EE和Java SE的开发工作;

2. Sun希望整合ORM技术,实现天下归一。

也就是说,Sun提出JPA规范的目的就是想以官方身份来统一各种ORM框架的规范,包括著名的Hibernate、TopLink等。这样就可以避免开发者为了使用Hibernate,要学习一套ORM框架;为了使用TopLink框架,又要再学习一套ORM框架,免去了重复学习的过程!

3. JPA涵盖的技术

JPA的总体思想和现有的Hibernate、TopLink、JDO、Mybatis等ORM框架大体一致。

总的来说,JPA包括以下3方面的技术:

(1).ORM映射元数据

JPA支持XML和JDK 5.0中的注解两种形式,通过元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

(2).JPA的API

用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

(3).查询语言

通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

4. JPA与其他ORM框架的关系

JPA的本质是一种ORM规范(不是ORM框架,因为JPA并未提供ORM实现,只是制定了规范),而非实现。

它只提供了一些相关的接口,但是这些接口并不能直接使用,JPA的底层需要某种JPA实现,而Hibernate等框架则是对JPA的一种具体实现。

也就是说JPA仅仅是一套规范,不是一套产品, Hibernate, TopLink等都是实现了JPA规范的一套产品。

Hibernate 从3.2开始,就开始兼容JPA。Hibernate3.2获得了Sun TCK的 JPA(Java Persistence API)兼容认证。

所以JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现,他们之间并不是对标的关系,下图可以表明他们之间的关系。


Hibernate属于遵循JPA规范的一种实现,但是Hibernate还有其他要实现的规范。所以它们的关系更类似于是:JPA是一种做面条的标准规范,而Hibernate是一种遵循做面条规范的具体的汤面;它不仅遵循了做面条的规范,同时也会遵循做汤和调料的其他规范。

5. JPA中的注解


二. Spring Boot整合JPA实现过程

1. 创建web程序

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。


2. 添加依赖包

org.springframework.boot

spring-boot-starter-data-jpa

mysql

mysql-connector-java

com.alibaba

druid

1.1.10

3. 添加配置文件

创建application.yml配置文件

spring:

datasource:

url: jdbc:mysql://localhost:3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true

type: com.alibaba.druid.pool.DruidDataSource

username: root

password: syc

driver-class-name: com.mysql.jdbc.Driver #驱动

jpa:

hibernate:

ddl-auto: update #自动更新

show-sql: true  #日志中显示sql语句

jpa.hibernate.ddl-auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。

该参数的几种配置如下:

·create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。

·create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。

·update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。

·validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

4. 创建实体类

package com.yyg.boot.domain;import lombok.Data;import lombok.ToString;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;/**

* @Author 一一哥Sun

* @Date Created in 2020/3/30

* @Description Description

*/@Data@ToString@Entitypublic class User {    @Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;    @Column

private String username;    @Column

private String birthday;    @Column

private String sex;    @Column

private String address;

}

5. 创建DataSource配置类

package com.yyg.boot.config;import com.alibaba.druid.pool.DruidDataSource;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/**

* @Author 一一哥Sun

* @Date Created in 2020/3/30

* @Description 第二种配置数据源的方式

*/@Data@ComponentScan@Configuration@ConfigurationProperties(prefix="spring.datasource")public class DbConfig {    private String url;    private String username;    private String password;    @Bean

public DataSource getDataSource() {

DruidDataSource dataSource = new DruidDataSource();

dataSource.setUrl(url);

dataSource.setUsername(username);

dataSource.setPassword(password);        return dataSource;

}

}

6. 创建JPA实体仓库

package com.yyg.boot.repository;import com.yyg.boot.domain.User;import org.springframework.data.jpa.repository.JpaRepository;/**

* @Author 一一哥Sun

* @Date Created in 2020/3/31

* @Description Description

*/public interface UserRepository extends JpaRepository {

}

7. 创建Controller测试接口

package com.yyg.boot.web;import com.yyg.boot.domain.User;import com.yyg.boot.repository.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.util.List;/**

* @Author 一一哥Sun

* @Date Created in 2020/3/31

* @Description Description

*/@RestController@RequestMapping("/user")public class UserController {    @Autowired

private UserRepository userRepository;    @GetMapping("")

public List findUsers() {        return userRepository.findAll();

}   /**

* 注意:记得添加@RequestBody注解,否则前端传递来的json数据无法被封装到User中!

*/

@PostMapping("")

public User addUser(@RequestBody User user) {        return  userRepository.save(user);

}    @DeleteMapping(path = "/{id}")

public String deleteById(@PathVariable("id") Long id) {

userRepository.deleteById(id);        return "success";

}

}

8. 创建Application启动类

package com.yyg.boot;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/**

* @Author 一一哥Sun

* @Date Created in 2020/3/31

* @Description Description

*/@SpringBootApplicationpublic class JpaApplication {    public static void main(String[] args) {

SpringApplication.run(JpaApplication.class, args);

}

}

完整项目结构:


9. 测试接口

在浏览器中进行get查询:


在postman中执行添加操作:


在postman中执行删除操作:


10. JPA实现原理

JPA会根据方法名来生成sql查询语句,它遵循的是Convention over configuration(约定大约配置)的原则,遵循Spring 以及JPQL定义的方法命名。Spring提供了一套可以通过命名规则进行查询构建的机制,这套机制会把方法名首先过滤一些关键字,比如 find…By, read…By, query…By, count…By 和 get…By...

然后系统会根据关键字将命名解析成2个子语句,第一个 By 是区分这两个子语句的关键词。这个 By 之前的子语句是查询子语句(指明返回要查询的对象),后面的部分是条件子语句。

如果直接就是 findBy… 返回的就是定义Respository时指定的领域对象集合,同时JPQL中也定义了丰富的关键字:and、or、Between等等,下面我们来看一下JPQL中有哪些关键字:


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容