集成Spring Data JPA
来自于《Spring Boot微服务项目实战》该书所记录的笔记。
JPA(Java Persistence API)意即Java持久化API,通过在Spring Boot中集成Spring Data JPA来实现基本增删改查功能,以及自定义查询方法等。
一、引入依赖
在pom文件中引入如下代码:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
二、继承JpaRepository
接着在目录src\main\java\com\example\demo\repository\开发一个AyUserRepository类,代码如下:
public interface AyUserRepository extends JpaRepository<AyUser,String> {
}
在AyUser实体中添加@Entity
和@Id
注解,需要注意的是将Hibernate更新到4.3以上的时候,不再使用@Table(name = "ay_user")
注解,只需要在@Entity
变为@Entity(name = "ay_user")
即可,代码如下:
- @Entity:每个持久化POJO类都是一个实体Bean,通过@Entity来声明。
- @Id:指定表的主键。
三、服务层类实现
服务层接口类:src\main\java\com\example\demo\service\AyUserService.java
具体代码如下:
package com.example.demo.service;
import com.example.demo.AyUser;
import java.util.List;
public interface AyUserService {
AyUser findById(String id);
List<AyUser> findAll();
AyUser save(AyUser ayUser);
void delete(String id);
}
实现类:src\main\java\com\example\demo\service\impl\AyUserServiceImpl.java
具体代码如下:
package com.example.demo.service.impl;
import com.example.demo.AyUser;
import com.example.demo.service.AyUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class AyUserServiceImpl implements AyUserService {
@Resource
private AyUserRepository ayUserRepository;
@Override
public AyUser findById(String id) {
return ayUserRepository.findById(id).get();;
}
@Override
public List<AyUser> findAll() {
return ayUserRepository.findAll();
}
@Override
public AyUser save(AyUser ayUser) {
return ayUserRepository.save(ayUser);
}
@Override
public void deleteById(String id) {
ayUserRepository.deleteById(id);
}
}
四、增删改查分页简单实现
在AyUserService.java添加分页代码如下:
Page<AyUser> findAll(Pageable pageable);
- Pageable:查询时只要传入一个Pageable接口的实现类,指定pageNumber和PageSize即可,分别为第几页和该页大小
- Page:分页查询结果会封装在该类中,Page接口实现Slice接口,通过调用getTotalPages和getContent等方法,可获得总页数和查询记录。
接着我们在类AyUserServiceImpl中实现该方法,代码如下:
@Override
public Page<AyUser> findAll(Pageable pageable) {
return ayUserRepository.findAll(pageable);
}
五、自定义查询方法
在AyUserRepository类中添加自定义查询方法,代码如下:
/*
* 描述:通过名字相等查询,参数为name
* 相当于:select u from ay_user where u.name = ?1
* */
List<AyUser> findByName(String name);
/*
* 描述:通过名字like查询,参数为name
* 相当于:select u from ay_user where u.name like ?1
* */
List<AyUser> findByNameLike(String name);
/*
* 描述:通过主键ID集合查询,参数为ID集合
* 相当于:select u from ay_user u where id in (?,?,?)
* @param ids
* */
List<AyUser> findByIdIn(Collection<String> ids);
实际上,Spring Data JPA会根据代码翻译成相关的SQL语句进行数据库查询,接着我们在AyUserService.java和AyUserServiceImpl.java调用它们,代码如下:
AyUserService.java:

//自定义查询方法
List<AyUser> findByName(String name);
List<AyUser> findByNameLike(String name);
List<AyUser> findByIdIn(Collection<String> ids);
AyUserServiceImpl.java:
@Override
public List<AyUser> findByName(String name) {
return ayUserRepository.findByName(name);
}
@Override
public List<AyUser> findByNameLike(String name) {
return ayUserRepository.findByNameLike(name;
}
@Override
public List<AyUser> findByIdIn(Collection<String> ids) {
return ayUserRepository.findByIdIn(ids);
}
六、测试开发用例
在DemoApplicationTests类中添加如下代码:
package com.example.demo;
import com.example.demo.service.AyUserService;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
class DemoApplicationTests {
@Resource
private AyUserService ayUserService;
@Test
public void testRepository() {
//查询所有数据
List<AyUser> userList = ayUserService.findAll();
System.out.println("findAll()查询所有数据:"+userList.size());
//通过name查询数据
List<AyUser> userList2 = ayUserService.findByName("Jadore");
System.out.println("findByName()通过name查询数据:"+userList2.size());
Assert.assertTrue("data error!",userList2.get(0).getName().equals("Jadore"));
//通过name模糊查询数据
List<AyUser> userList3 = ayUserService.findByName("%ad%");
System.out.println("findByNameLike()通过name模糊查询数据:"+userList3.size());
Assert.assertTrue("data error!",userList3.get(0).getName().equals("Jadore"));
//通过ID列表查询数据
List<String> ids = new ArrayList<String>();
ids.add("1");
ids.add("2");
List<AyUser> userList4 = ayUserService.findByIdIn(ids);
System.out.println("findByNameLike()通过name模糊查询数据:"+userList4.size());
//分页查询数据
Pageable pageable = PageRequest.of(0,10);
Page<AyUser> userList5 = ayUserService.findAll(pageable);
System.out.println("page findAll()分页查询数据:"+userList5.getTotalPages()+"/"+userList5.getSize());
AyUser ayUser = new AyUser();
ayUser.setId("3");
ayUser.setName("分页添加的name");
ayUser.setPassword("123456");
ayUserService.save(ayUser);
ayUserService.deleteById("3");
}
}