1 springdatajpa
什么是springdatajpa:
springdata 这个项目 对于jpa进行封装,而形成一个springdatajpa的框架。封装之后,使用更加简单
1.1 SpringdataJpa 的crud(掌握)
用法:
(1)定义一个接口 继承 JpaRepository这个接口
public interface EmployeeRepository extends JpaRepository<Employee,Long>
JpaRepository这个接口有实现类来实现crud方法以及分页和排序等方法
新增/修改 save
新增和修改用的是同一个不过修改是要设置id
employeeRepository.save(employee)
查询 findOne
employeeRepository.findOne(id)
查询所有 findAll
employeeRepository.findAll()
删除 delete /deleteInBatch
employeeRepository.delete(id)
1.2 Springdatajpa的分页和排序
分页
//Pageable实现类的子类findAll中本来要求的数据类型是Pageable
PageRequest pageRequest = new PageRequest(0, 10);
//分页查询
Page<Employee> all = employeeRepository.findAll(pageRequest);
//总条数
long totalElements = all.getTotalElements();
//总页数
int totalPages = all.getTotalPages();
//当前页的所有数据
List<Employee> content = all.getContent();
//当前页数
int number = all.getNumber();
//每页条数
int numberOfElements = all.getNumberOfElements();
排序
//前面是排序类型,后面是根据列来排序
Sort orders = new Sort(Sort.Direction.DESC,"username");
List<Employee> all = employeeRepository.findAll(orders);
分页和排序可以和用
Sort orders = new Sort(Sort.Direction.DESC,"username");
PageRequest pageRequest = new PageRequest(0, 10, orders);
//这里查询出的是的Employee实例
Page<Employee> all = employeeRepository.findAll(pageRequest);
for (Employee employee : all) {
System.out.println(all);
}
1.3 按照条件规则查询–只适合简单的查询
在接口中添加方法不过方法名有规范会有实现类来自动实现写上字段名用like就会加like,不用就是等于GreaterThan是大于像like这些条件加在字段后面用And拼接
public interface EmployeeRepository extends JpaRepository<Employee,Long> {
//按照规则条件进行查询 模糊查询
public List<Employee> findByUsernameLike(String username);
public List<Employee> findByUsername(String username);
public List<Employee> findByAgeGreaterThan(Integer age);
}
1.4 写jpql语句–Query注解式jpql //Query注解查询
@Query("select o from Employee o where o.id =(select max(p.id) from Employee p)")
public Employee queryEmployee();
//根据用户名和邮件查询员工 参数名称 建议写来一致
@Query("select o from Employee o where o.username like ?1 and o.email like ?2")
public List<Employee> queryEmployee1(String name ,String email);
//@Param(username) 必须和 :username 一致 建议来都写来一致
@Query("select o from Employee o where o.username like :username and o.email like :email")
public List<Employee> queryEmployee2(@Param("username") String name , @Param("email") String email);
//原生SQL支持
@Query(value = "select count(*) from employee ",nativeQuery = true)
public Long queryCount();
1.5 JpaSpecificationExecutor 查询
JpaSpecificationExecutor:jpa提供的规范的执行者,作用可以用来动态的生成jpql语句来查询
dao层多继承一个
JpaSpecificationExecutor
@Test
public void testJpaSpecificationExecutorAndPage()throws Exception{
//Specification
Specification specification = new Specification<Employee>(){
//设置条件 给哪一列(username)设置条件
//root
public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Path path1 = root.get("username"); //root 拿到要操作的字段
//criteriaBuilder 用来构建的查询
Predicate predicate1 = criteriaBuilder.like(path1, "%1%");
Path path2 = root.get("age");
Predicate predicate2 = criteriaBuilder.greaterThan(path2, 30);
CriteriaQuery cq = criteriaQuery.where(predicate1, predicate2);
return cq.getRestriction();
}
};
// select o from Employee o where username like '%1%' and age > 30
Sort sort = new Sort(Sort.Direction.DESC,"age");
Pageable pageable = new PageRequest(0, 2, sort);
Page<Employee> page = employeeRepository1.findAll(specification,pageable);
List<Employee> employees = page.getContent();
for (Employee employee : employees) {
System.out.println(employee);
}
}
上面麻烦地方:组装条件比较麻烦,所以有人写一个简单的插件 完成内容
1.6 jpa-spe插件
jpa-spec这个插件 对应 JpaSpecificationExecutor 进行封装,封装出来之后,简化上面jpa规则查询的写法,更好用
使用:
(1)导入依赖包
(2)测试
@Test
public void testJpaSpe()throws Exception{
Specification<Employee> specification = Specifications.<Employee>and()
.like("username", "%1%")
.gt("age", 30)
.build();
List<Employee> employees = employeeRepository1.findAll(specification);
for (Employee employee : employees) {
System.out.println(employee);
}
}
1.7完成公共抽取
BaseQuery
//抽取查询条件 由于每一子类查询条件都不一样,所有必须子类来覆写
public abstract Specification createSpecification();
//根据公共BaseQuery排序字段 来组装排序
public Sort createSort() {
if (this.getOrderByName() != null) {
String orderByType = this.getOrderByType();
Sort.Direction type = "DESC".equals(orderByType) ? Sort.Direction.DESC : Sort.Direction.ASC;
return new Sort(type, this.getOrderByName());
}else{
return null;
}
}