基本增删改查
每个Repository都需要实现JpaRepository<T, ID>,然后可根据标准化的操作方式以及实体字段来定义接口方法,优势在查询方面,支持多字段,多类型(大于、小于、等于、in、like、between and。。。)
@Repository
public interface UUserRepository extends JpaRepository<UUser,Integer> {
@Override
UUser save(UUser user);
@Override
List<UUser> findAll();
UUser findByUserName(String userName);
Optional<UUser> findById(Integer id);
void deleteById(Integer id);
//删除表中所有数据,谨慎使用
void deleteAll();
}
自定义查询与更新
@Repository
public interface UUserRepository extends JpaRepository<UUser,Integer> {
/本地查询 nativeQuery=true 表示使用原生sql,表名、字段名跟数据库一致
@Query(value="select * from u_user where nickname like %?1 and status =?2" ,nativeQuery=true)
List<UUser> findByUserNameAAndStatus(String name, Integer status);
//@Query执行delete和update语句一样,需要添加@Modifying注解,使用时在Repository或者更上层需要@Transactional注解。
/**
* 支持更新类的Query语句
* 使用 @Modifying 修改标识
* 返回值应该是int,表示更新语句所影响的行数
* @param id
* @param newName
* @return
*/
@Modifying
@Transactional(rollbackFor = Exception.class)
@Query(value="update UUser u set u.email=:newEmail where u.id =:nn")
int updateUserEmail(@Param("nn") Integer id, @Param("newEmail") String newName);
}
jpa实现分页
分页还需实现JpaSpecificationExecutor接口,只需在serviceImpl中传入所需参数即可
service层具体实现代码如下:一个是无查询条件分页返回,一个是有限制条件的分页返回。其中*jpa的页面数量是从0开始的*,这里需要注意一下,或者写个工具类统一处理
@Service
public class UUserServiceImpl implements UUserService{
@Autowired
UUserRepository userRepository;
@Override
public Page<UUser> findUserNoCriteria(Integer page, Integer size) {
//springboot 2.0之前的写法设置排序字段为ID 降序
// Pageable pageable = new PageRequest(page, size, Sort.Direction.DESC, "id");
//springboot 2.0之后的推荐写法
Sort sort = new Sort(Sort.Direction.ASC, "id");
Pageable pageable = PageRequest.of(page-1, size, sort);
return userRepository.findAll(pageable);
}
@Override
public Page<UUser> findUserCriteria(Integer page, Integer size, UUser userQuery) {
// Specification<UUser> specification1 = (Specification<UUser>) (root, query, criteriaBuilder) -> {
// List<Predicate> list = new ArrayList<>();
// // 第一个userId为CloudServerDao中的字段,第二个userId为参数
// Predicate p1 = criteriaBuilder.equal(root.get("userId"),userId);
// list.add(p1);
// if (!key.equals(null)) {
// // 此处为查询serverName中含有key的数据
// Predicate p2 = criteriaBuilder.like(root.get("serverName"),"%"+key+"%" );
// list.add(p2);
// }
// return criteriaBuilder.and(list.toArray(new Predicate[0]));
// };
Specification specification = new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList();
if(!StringUtils.isEmpty(userQuery.getUserName())) {
predicates.add(criteriaBuilder.like(root.get("nickName"), "%" + userQuery.getUserName() + "%"));
}
if(null != userQuery.getStatus()){
predicates.add(criteriaBuilder.equal(root.get("status"), userQuery.getStatus()));
}
if(null != userQuery.getId()){
predicates.add(criteriaBuilder.greaterThan(root.get("id"), userQuery.getId()));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
//设置排序字段为ID 升序 页码从0开始
Pageable pageable = PageRequest.of(page-1, size, Sort.Direction.ASC, "id");
return userRepository.findAll(specification,pageable);
}
批量操作
批量保存跟删除
批量保存和删除可直接传参调用,传入集合对象
也可在repository中自己实现批量删除
//批量删除
void deleteInBatch(Iterable<UUser> userList);
//sql实现批量删除
@Modifying
@Transactional
@Query(value="delete from UUser u where u.id in (:ids) ")
int deleteByIds(@Param("ids")List<Integer> ids);
@Service
public class UUserServiceImpl implements UUserService{
@Autowired
UUserReposito