携手创作,共同成长!这是我参与「掘金日新计划 · 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);
}
}
结果
至此,一个Spring Data JPA的简单demo就搭建好了,之后我们会基于这个简单的demo不断深入。