一、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();//删除所有 }