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