Spring Data JPA学习一:整体认识JPA
1. 整体认识JPA
市面上的ORM(Object Relational Mapping 对象映射关系)框架对比
MyBatis:着力于POJO与SQL之间的映射关系,可以进行更为细致的SQL,使用起来十分灵活方便,上手简单,容易掌握,所以深受开发者喜欢,目前市场占有率很高,比较适合互联网应用公司的API场景。
Hibernate :对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲地使用对象编程思维来操作数据库,着力于对象与对象之间的关系,比较适合企业级地应用系统开发。
Spring Data JPA:可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL查询语言,属于Spring整个生态系统的一部分。JPA上手简单,开发效率高,对对象的支持比较好,又有很大的灵活性,市场的认可度越来越高。
JPA是 Java Persistence API的简称,中文名称为Java持久层API,是JDK5.0注解或XML描述对象—关系表的映射关系,并将运行期的尸体对象持久化到数据库中。
Spring Data操作的主要特性
提供模板操作,如Spring Data Redis和 Spting Data Riak。
强大的Repository和定制的数据存储对象的抽象映射。
对数据访问对象的支持。
2.JPA基础查询方法
Spring Data Common 的 Repository,是Spring Data里面做数据库操作的最底层的抽象接口、最顶级的父类,源码里面其实什么方法都没有,仅仅起到一个标识的作用。此接口主要作为标记接口捕获要使用的类型,并帮助你发现扩展此接口的接口。
Repository的源码如下:
package org.springframework.data.repository;
import org.springframework.stereotype.Indexed;
@Indexed
public interface Repository<T, ID> {
}
这个接口定义了所有Repository操作的实体和ID两个泛型参数。我们不需要继承任何接口,只要继承这个接口,就可以使用Spring JPA里面提供的很多约定的方法查询和注解查询。
CrudRepository方法详解
package org.springframework.data.repository;
import java.util.Optional;
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S var1);//(1)
<S extends T> Iterable<S> saveAll(Iterable<S> var1);//(2)
Optional<T> findById(ID var1);//(3)
boolean existsById(ID var1);//(4)
Iterable<T> findAll();//(5)
Iterable<T> findAllById(Iterable<ID> var1);//(6)
long count();//(7)
void deleteById(ID var1);//(8)
void delete(T var1);//(9)
void deleteAll(Iterable<? extends T> var1);//(10)
void deleteAll();//(11)
}
(1)保存实体方法。
(2)批量保存。实现方法就是for循环调用(1)的save方法。
(3)根据主键查询实体。
(4)根据主键判断实体是否存在。
(5)查询实体的所有列表。
(6)分局主键列表查询实体列表。
(7)查询总数。
(8)根据主键删除
这里特别强调一下delete和save方法,因为在实际工作中有的人会画蛇添足,自己先去查询再做判断处理,其实Spring JPA底层都已经考虑到了。
CrudRepository interface的使用示例
public interface UserRepository extends CrudRepository<User,Integer> {
}
@Autowired
private UserRepository userRepository;
@GetMapping("add")
public void addUser(){
User user = new User();
user.setUsername("2");
user.setPassword("2");
userRepository.save(user);
}
@GetMapping("addAll")
public void addAll(){
List<User> list = new ArrayList<>();
for (int i=0 ; i<10 ; i++){
User user = new User();
user.setUsername(String.valueOf(i));
user.setPassword(String.valueOf(i));
list.add(user);
}
System.out.println(list.toString());
for (int i = 0 ; i<list.size() ; i++) {
userRepository.save(list.get(i));
}
}
@GetMapping("findOne")
public void findOne(){
Optional<User> user = userRepository.findById(1);
System.out.println(user.toString());
}
@GetMapping("findAll")
public void findAll(){
List<User> users = userRepository.findAll();
for (User user:users) {
System.out.println(user.toString());
}
}
@GetMapping("count")
public void count(){
long l = userRepository.count();
System.out.println(l);
}