Spring Data JPA简单使用

时间:2021-03-17 16:09:50

Spring Data JPA操作数据库

这份教程教你用Spring Data JPA从关系数据库mysql中存储和提取数据。总结来自https://spring.io/guides/gs/accessing-data-jpa/

1.用Maven构建工程

添加依赖

<!-- spring boot data jpa -->

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

2.Application properties参数设置

spring.datasource.url=jdbc:mysql://localhost:3306/spp?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=liuwb123
#spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#JPA Configuration:
spring.jpa.database=MySQL
spring.jpa.show-sql=true  
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = update

3.定义一个简单的实体

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

@Entity

public class Customer {

@Id

@GeneratedValue(strategy=GenerationType.AUTO)

private Long id;

private String firstName;

private String lastName;

protected Customer() {}

public Customer(String firstName, String lastName) {

this.firstName = firstName;

this.lastName = lastName;

}

@Override

public String toString() {

return String.format(

"Customer[id=%d, firstName='%s', lastName='%s']",

id, firstName, lastName);

}

}

这样定义了一个有三个属性的类,id,firstName和lastName,还包含了两个构造器。其中默认构造器只为JPA使用,你不会直接用它,所以被protecred给修饰了。另外一个构造器你需要用它来创造实例,再将数据保存到数据库中。

这个类被@Entity注解,表明这是一个JPA实体。虽然缺少了@Tabel注解,但是这个实体依旧会被映射成一张名字为Customer数据库的表。

Customer的id属性被@Id给注解,JPA会把这个属性识别为一个主键,除了被@Id注解,还被@GeneratedValue注解,表明这个属性会以自增的方式生成值。

其他的两个属性firstName和lastName没有被注解,这两个属性将会以同名的方式,映射成数据库表中的字段。

toString方法只是为了方便查看customer类的属性。

4.创建简单的查询接口

Spring Data JPA 聚焦于用JPA在关系型数据库中存储数据。Spring Data Jpa最具有特色的地方就是能够自动地在运行时创建一张数据库的表。

现在我们来看看它是怎样的一个流程,创建一个接口引用Customer实体。

import java.util.List;

import org.springframework.data.repository.CrudRepository;

public interface CustomerRepository extends CrudRepository<Customer, Long> {

List<Customer> findByLastName(String lastName);}

CustomerRepository继承CrudRespository接口,父接口的参数设置为实体的类和实体主键的数据类型。通过扩展CrudRespository,CustomerRepository继承了少数的方法,包括存数据,删除数据和查找Customer的实体。

Spring Data JPA 也允许你定义其他的查询方法。例如,findByLastName方法。 参数需要以类名和类属性命名。

在Java应用程序中,你需要写一个类去实现CustomerRepository接口。但是真正让Spring Data JPA强大的,根本不需要实现这个接口,这件事情Spring Data JPA自动帮你实现了。

5.查询数据

@RunWith(SpringRunner.class)
@SpringBootTest
public class LearnApplicationTests {
    // spring data jpa
    @Autowired
    CustomerRepository customerRepository;

@Test
    public void contextLoads() {
        // 存数据
        customerRepository.save(new Customer("jack","baur"));
        // 查数据
        List<Customer> customers = customerRepository.findByLastName("baur");
        System.out.println(customers.get(0).toString());
    }

}

6.总结

接口除了继承CrudRepository还可以继承JpaRepository,PagingAndSortingRepository

CrudRepository主要提供CRUD操作,PagingAndSortingRepository 提供翻页和对数据进行排序,而JpaRepository提供批量操作的方法,除此之外JpaRepository拥有其他两个的所有方法,所以继承JpaRepository准没错。不过本次例子中继承的是CrudRepository,项目地址,https://github.com/drinkTeaT/springboot。好了,bye~。