Spring Data JPA渐进式学习--简介与demo

252 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

今天终于开启了我心心念念的Spring Data JPA专栏,以前工作一直用的MyBatis。其实用起来也蛮不错,换了新项目之后,用的Spring Data JPA,开始不是很熟练,直到一段时间之后,觉得这玩意用起来很棒啊。本着用到了新技术就要从简入难学一遍的态度,在此开一个Spring Data JPA专栏把学习经过和心路历程详细记录。

今天第一天,简单讲一下概念,搭一个demo

简介

Spring Data [JPA]是Spring基于ORM框架,JPA规范的基础上封装的一套JPA应用框架,可使开发者能够用极简的代码实现对数据库的访问操作。它提供包括增删查改等在内的常用功能,而且易于扩展。

Spring Data JPA通过持久层的相关注解,来描述对象和关系型数据库中的表映射关系。并将Java项目运行期的实体对象通过一种session持久化到数据库中。

JPA的内容分类

定义了一套标准化的接口

在javax.persistence包下边,有一套标准化的接口,用来操作实体对象,执行CRUD操作。

定义了一套基于对象的sql

我们可以写面向对象而非面向数据库的查询语言查询数据,避免了成熟与数据库耦合严重。

ORM对象注解映射关系

JPA直接通过注解的方式来表示Java的实对象及元数据对象和数据表之间的映射关系。

Demo以及遇到的坑

依赖

不管是写啥demo,第一步都是依赖

这里引入了lombok的,mysql的,JPA的依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

配置文件

这里的配置文件就主要是mysql的配置了

spring.jpa.generate-ddl=true这个配置会当映射的表不存在的时候,建一张表。

spring.datasource.url=jdbc:mysql://139.155.78.11:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#自动建表
spring.jpa.generate-ddl=true
#连接池中的连接的最长生命周期(毫秒)。数值 0 表示不限制 默认1800000(30分钟)
spring.datasource.hikari.max-lifetime=500000

UserInfo类

@Table(name = "userinfo")是指对应的表。注意这里UserInfo类上的注解@Table(name = "userinfo"),当不加这个注解的时候并且开启了spring.jpa.generate-ddl=true,JPA会新建一个名为user_info的表,对应的列就是属性名。

import lombok.Data;
import javax.persistence.*;

@Entity
@Data
@Table(name = "userinfo")
public class UserInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String address;
    private String name;
    private Integer age;
}

UserRepository类

import com.luke.springdatajpa.user.entity.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<UserInfo,Integer> {
}

UserController类

这里的@WebLog(printResult = true)是用来输出日志的。当开启的时候,会输出如下日志,之前写过一篇文章介绍这个注解添加日志。一个注解实现接口日志的输出

2022-08-25 22:17:38.522  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : -------------------------------请求开始-------------------------------
2022-08-25 22:17:38.523  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : 请求IP: 127.0.0.1
2022-08-25 22:17:38.523  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : User-Agent: ApiPOST Runtime +https://www.apipost.cn
2022-08-25 22:17:38.524  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : 请求URI: /api/users
2022-08-25 22:17:38.524  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : 请求方式: GET
2022-08-25 22:17:38.524  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : 请求方法: com.luke.springdatajpa.user.controller.UserController.getAllUsers
2022-08-25 22:17:38.524  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : 方法入参: [Page request [number: 0, size 20, sort: UNSORTED]]
2022-08-25 22:17:38.876  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : 请求响应:{"content":[{"address":"??","age":18,"id":2,"name":"luke"},{"address":"??","age":18,"id":3,"name":"luke"},{"address":"??","age":18,"id":4,"name":"luke"},{"address":"??","age":18,"id":5,"name":"luke"},{"address":"陕西","age":18,"id":6,"name":"luke"},{"address":"陕西","age":18,"id":999,"name":"小明"}],"empty":false,"first":true,"last":true,"number":0,"numberOfElements":6,"pageable":{"offset":0,"pageNumber":0,"pageSize":20,"paged":true,"sort":{"empty":true,"sorted":false,"unsorted":true},"unpaged":false},"size":20,"sort":{"$ref":"$.pageable.sort"},"totalElements":6,"totalPages":1}
2022-08-25 22:17:38.876  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : 请求耗时: 355 ms
2022-08-25 22:17:38.876  INFO 17560 --- [nio-8080-exec-1] c.l.s.webLog.config.WebLogAspect         : -------------------------------请求结束-------------------------------
import com.luke.springdatajpa.user.entity.UserInfo;
import com.luke.springdatajpa.user.repository.UserRepository;
import com.luke.springdatajpa.webLog.annotation.WebLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(path = "/api")
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @PostMapping(path = "save",consumes = {MediaType.APPLICATION_JSON_VALUE})
    @WebLog(printResult = true)
    public UserInfo addNewUser(@RequestBody UserInfo userInfo){
        return userRepository.save(userInfo);
    }

    @GetMapping(path = "users")
    @ResponseBody
    @WebLog(printResult = true)
    public Page<UserInfo> getAllUsers(Pageable request){
        return userRepository.findAll(request);
    }
}

结果

image.png

至此,一个Spring Data JPA的简单demo就搭建好了,之后我们会基于这个简单的demo不断深入。