JPA CrudRepository方法详解
CrudRepository方法详解
通过类关系图可以看到CrudRepository提供了公共的通用的CRUD方法。
CrudRepository interface内容
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S var1);
<S extends T> Iterable<S> saveAll(Iterable<S> var1);
Optional<T> findById(ID var1);
boolean existsById(ID var1);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> var1);
long count();
void deleteById(ID var1);
void delete(T var1);
void deleteAll(Iterable<? extends T> var1);
void deleteAll();
}
(1)保存实体方法。我们通过IntelliJ IDEA打开类QueryDslJpaRepository,右击,选择show diagrams,用图表的方式查看类的关系层次。
查看SimpleJpaRepository实现类里面的实现方法:
@Transactional
public <S extends T> S save(S entity) {
if (this.entityInformation.isNew(entity)) {
this.em.persist(entity);
return entity;
} else {
return this.em.merge(entity);
}
}
我们发现它是先检查传进去的实体是不是存在,然后判断是新增还是更新;是不是存在
有两种根据机制,一种是根据主键来判断,另一种是根据Version来判断(后面讲解Version的时候详解)。如果我们去看JPA控制台打印出来的SQL,最少会有两条,一条是查询,一条是insert或者update。
(2)批量保存。原理和步骤(1)相同。实现方法就是for循环调用上面的save方法。
(3)根据主键查询实体。
(4)根据主键判断实体是否存在。
(5)查询实体的所有列表。
(6)根据主键列表查询实体列表。
(7)查询总数。
(8)根据主键删除。
SimpleJpaRepository里面的实现方法:
@Transactional
public void deleteById(ID id) {
Assert.notNull(id, "The given id must not be null!");
this.delete(this.findById(id).orElseThrow(() -> {
return new EmptyResultDataAccessException(String.format("No %s entity with id %s exists!", this.entityInformation.getJavaType(), id), 1);
}));
}
我们看到JPA会先去查询一下,再做保存,不存在抛出异常。这里特别强调一下delete和save方法,因为在实际工作中有的人会画蛇添足,自己先去查询再做判断处理,其实Spring JPA底层都已经考虑到了。
CrudRepository interface的使用示例
使用也很简单,只需要自己的Repository继承CrudRepository即可。
User.class
@Entity
public class User {
@Id
@Generatedvalue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String email;
public Long getId (){
return id;
}
public void setId(Long id){
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email = email;
}
}
UserCrudRepository.class
import com.example.example2.User;
import org.springframework.data.repository.CrudRepository;
public interface UserCrudRepository extends CrudRepository<User,Long>{
}
UserController.class
@controller
@RequestMapping(path = "/demo")
public class UserController {
@Autowired
private UserCrudRepository userRepository;
@GetMapping(path = "/add")
public void addNewUser(@RequestParam String name,@RequestParam String email) {
User n = new User ();
n.setName(name);
n.setEmail(email);
userRepository.save(n);
}
@GetMapping(path = "/all")
@ResponseBody
public Iterable<User> getAllUsers () {
return userRepository.findAll();
}
@GetMapping(path = "/info")
@ResponseBody
public User findOne(@RequestParam Long id){
return userRepository.findOne(id);
}
@GetMapping (path = "/delete")
public void delete (@RequestParam Long id){
userRepository.deleteById(id);
)