Spring data JPA功能简介

时间:2020-06-30 22:18:44 类型:JAVA
字号:    

  一、Spring data JPA简介

  Spring data JPA是Spring在ORM框架,以及JPA规范的基础上,封装的一套JPA应用框架,并提供了一整套的数据访问层解决方案。

  二、Spring data JPA的功能

  Spring data JPA的功能非常的强大,这里我们先跳过环境搭建这一步,来一睹Spring data JPA的“芳容”。

  Spring data JPA提供给用户使用的,主要有以下几个接口:

  Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别

  CrudRepository:继承Repository,实现了一组CRUD相关的方法

  PagingAndSortingRepository:继承CrudRepository,实现了一组分页排序相关的方法

  JpaRepository:继承PagingAndSortingRepository,实现一组JPA规范相关的方法

  JpaSpecificationExecutor:比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法

  三、Spring data JPA的接口

  1、CrudRepository接口

  建立一个Entity类:

  

@Entity
@Table(name="USER") 
public class User { 
  @Id
  @GeneratedValue
  private Integer id;    
  //账号 
  private String account; 
  //姓名 
  private String name;    
  //密码 
  private String password;    
  // 邮箱 
  private String email; 
}


  编写接口,并继承CrudRepository接口:

public interface UserRepository extends CrudRepository<User, Integer> {    
}

编写测试类

public class UserRepositoryTest { 
  @Autowired
  private UserRepository dao; 
    
  @Test//保存 
  public void testSave(){ 
    User user = new User(); 
    user.setName("chhliu"); 
    user.setAccount("10000"); 
    user.setEmail("chhliu@.com"); 
    user.setPassword("123456"); 
    dao.save(user); 
  } 
    
  @Test//批量保存 
  public void testSave1(){ 
    List<User> users = new ArrayList<User>(); 
    User user = new User(); 
    user.setName("tanjie"); 
    user.setAccount("10000"); 
    user.setEmail("tanjie@.com"); 
    user.setPassword("123456"); 
    users.add(user); 
    user = new User(); 
    user.setName("esdong"); 
    user.setAccount("10000"); 
    user.setEmail("esdong@.com"); 
    user.setPassword("123456"); 
    users.add(user); 
    user = new User(); 
    user.setName("qinhongfei"); 
    user.setAccount("10000"); 
    user.setEmail("qinhongfei@.com"); 
    user.setPassword("123456"); 
    users.add(user); 
    user = new User(); 
    user.setName("huizhang"); 
    user.setAccount("10000"); 
    user.setEmail("huizhang@.com"); 
    user.setPassword("123456"); 
    users.add(user); 
    user = new User(); 
    user.setName("caican"); 
    user.setAccount("10000"); 
    user.setEmail("caican@.com"); 
    user.setPassword("123456"); 
    users.add(user); 
    dao.save(users); 
  } 
    
  @Test//更新 
  public void testUpdate(){ 
    User user = dao.findOne(1); 
    user.setPassword("123890");// 要想这样实现更新的功能,需要在service层加上@Transaction事物注解 
  } 
    
  @Test//删除 
  public void testDelete(){ 
    dao.delete(2); 
  } 
    
  @Test//查询所有 
  public void testFindAll(){ 
    List<User> users = (List<User>) dao.findAll(); 
    System.out.println(JSON.toJSONString(users)); 
  } 
    
  @Test//判断指定的id对象是否存在 
  public void testIsExist(){ 
    boolean isExist = dao.exists(8); 
    System.out.println(isExist); 
  } 
    
  @Test//通过id列表来查询 
  public void testFindUserByIds(){ 
    List<Integer> listIds = new ArrayList<Integer>(); 
    listIds.add(2); 
    listIds.add(4); 
    listIds.add(7); 
    List<User> users = (List<User>) dao.findAll(listIds); 
    System.out.println(JSON.toJSONString(users)); 
  } 
}

  大家可以看出,到这里,我就只写了一个接口类,并没有实现这个接口类,就可以完成基本的CRUD操作。因为这个接口会自动为域对象创建增删改查方法,供业务层直接使用。

  该接口的定义如下,总共提供了11个方法,基本上可以满足简单的CRUD操作以及批量操作:

@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { 
  <S extends T> S save(S entity);//保存 
  <S extends T> Iterable<S> save(Iterable<S> entities);//批量保存 
  T findOne(ID id);//根据id查询一个对象 
  boolean exists(ID id);//判断对象是否存在 
  Iterable<T> findAll();//查询所有的对象 
  Iterable<T> findAll(Iterable<ID> ids);//根据id列表查询所有的对象 
  long count();//计算对象的总个数 
  void delete(ID id);//根据id删除 
  void delete(T entity);//删除对象 
  void delete(Iterable<? extends T> entities);//批量删除 
  void deleteAll();//删除所有 
}


<