JPA是java的一套持久层规范,它定义了一系列的orm接口,但是它本身是不能直接使用的。
因为这些接口需要实现才可以使用的。
Hibernate框架就是一个JPA的实现。
JPA是一个独立的概念,本身就是一套规范。
Spring Data JPA 不是对JPA规范的具体实现,本身是一个抽象层,底层还是通过Hiberate实现的。
而Hiberate又是一个全自动的orm映射。所以说Spring Data JPA也是一个全自动化的映射。(全自动化指的是我们不需要去定义sql语句了),同时它也会完成实体类和表的直接映射。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
参考文章:https://www.cnblogs.com/williamjie/p/9321868.html
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.southwind</groupId>
<artifactId>springbootmybatis22</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
注入的是接口但是绑定的是实现类
mybatis没有了实现类,所以我们这里没有绑定实现类(mybatis的底层是通过反射自己把结果集解析出来封装成一个java对象)
Spring Data JPA(直接实体类和表进行映射就可以了,相当于jdbc的实现类或者mybatis的sql语句都不用写了)
我们需要把表进行映射,把表中的字段进行映射。
package com.southwind.entity;
import lombok.Data;
import javax.persistence.*;
import java.util.Date;
@Data
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //表示的是主键自增
private Long id;
@Column
private String name;
@Column
private Double score;
@Column
private Date birthday;
}
实体类有了以后我们就去创建它的repository
3.创建StudentRepository接口
写接口的时候常用的CRUD操作Spring Data JPA已经帮我们提供好了。我们直接把模板拿过来用就可以了。(通过继承的方式把模板拿过来就可以了)
继承的接口中save和update整合到一起了(它就是通过判断主键是否存在来决定是save还是update)。
一些基本的CRUD我们就不需要写了,一些特殊的业务比如findByName等你就自己写到里面。
package com.southwind.repository;
import com.southwind.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
//传的数据类型分别是实体类的数据类型和主键的数据类型
public interface StudentRepository extends JpaRepository<Student,Long> {
}
4.创建StudentHandler,注入StudentRepository
DAO层就是持久层,就是操作数据库的部分(剩下的就是业务层和变现层)
SSM框架下各个层的解释说明:https://blog.csdn.net/lutianfeiml/article/details/51864160
@GetMapping("/findById/{id}")
public Student findById(@PathVariable("id") Long id){
return studentRepository.findById(id).get(); //加个get就好了
}
如果报错我们把Spring Data JPA版本调高就好了
jpa可以帮我们把自定义的方法进行实现(但是这个命名是有一定规范的)
package com.southwind.controller;
import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
//这里我们直接让它返json数据
public class StudentHandler {
@Autowired
private StudentRepository studentRepository;
@GetMapping("/findAll")
public List<Student> findAll(){
return studentRepository.findAll();
}
@GetMapping("/findById/{id}")
public Student findById(@PathVariable("id") Long id){
return studentRepository.findById(id).get();
}
@PostMapping("/save")
public void save(@RequestBody Student student){
studentRepository.save(student);
}
@PutMapping("/update")
public void update(@RequestBody Student student){
studentRepository.save(student);
}
@DeleteMapping("/deleteById/{id}")
public void deleteById(@PathVariable("id") Long id){
studentRepository.deleteById(id);
}
}
5.配置Application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mbtest?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
配置application.yml连接数据库
mysql是5版本的driver-class-name填写com.mysql.jdbc.Driver
8版本则是:com.mysql.cj.jdbc.Driver
spring:
thymeleaf:
mode: HTML5
datasource:
url: jdbc:mysql://localhost:3306/whlg01?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
username: admin
password: admin
jpa:
hibernate:
ddl-auto: update
show-sql: true
参考文章:https://blog.csdn.net/qq_43235578/article/details/107642095
6.最后创建springboot的启动类
package com.southwind;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
如果我们觉得写的没问题但是启动不了,可以把pom.xml和xml文件重写导入一遍