SpringDataJpa直接调用增删改查、分页以及批量操作

本文介绍了如何使用SpringDataJpa进行基本的CRUD操作,自定义查询与更新,以及实现分页功能。在分页方面,需要实现JpaSpecificationExecutor接口。此外,还探讨了批量保存、删除和更新的方法,包括使用JdbcTemplate和EntityManager进行批处理。最后,提供了服务层、实现层、repository和entity类的代码示例,以及相关参考资料链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本增删改查

每个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中传入所需参数即可JpaSpecificationExecutor源码
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值