spring jpa dao是怎么自动实现的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring jpa dao是怎么自动实现的相关的知识,希望对你有一定的参考价值。
参考技术A 如果我们想拓展spring data jpa的CrudRepository或PagingAndSortingRepository,加入我们自己的database操作。分3个级别的拓展:1、继承CrudRepository或PagingAndSortingRepository,在继承的就扣定义findBy**类似的方法。这种方式只能做到最简单的拓展,毕竟一个方法名能表达的意思有限,(就好比我们说一句话能表达的意思也很有限)。
2、使用@Query注解继承接口里面的方法,定义方法要执行的sql,注意方法的每个参数对应sql里的“1?”、“2?”、……参数。这种方法比上一种方法能完成更多的拓展,可以连表,定义子查询等,但是还是只能执行一个sql语句。
3、使用@NoRepositoryBean,定义非仓库bean:
[java] view plain copy
@NoRepositoryBean
interface BaseRepository<T> extends CrudRepository<T, Long>
long customMethod();
实现上面的接口里定义的方法
[java] view plain copy
/**
* @author Oliver Gierke
* @soundtrack Elen - Nobody Else (Elen)
*/
class ExtendedJpaRepository<T> extends SimpleJpaRepository<T, Long> implements BaseRepository<T>
/**
* Creates a new @link ExtendedJpaRepository for the given @link JpaEntityInformation and @link EntityManager.
*
* @param entityInformation must not be @literal null.
* @param entityManager must not be @literal null.
*/
public ExtendedJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager)
super(entityInformation, entityManager);
/*
* (non-Javadoc)
* @see example.springdata.jpa.customall.BaseRepository#customMethod()
*/
@Override
public long customMethod()
//do some database operation
return 0;
最后定义我们的仓库bean接口,让这个接口继承我们新的仓库接口而不是CrudRepository或PagingAndSortingRepository
[java] view plain copy
public interface UserRepository extends BaseRepository<User>
第三种方式的拓展就非常强大了,在一个方法里面可以想干什么就干什么了,执行多个语句,执行存储过程等。另外上述三种方式是可以结合在一起使用的,并不冲突。
spring-data-jpa初步认识
什么是spring data jpa?
spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。
Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。如图:
接口约定命名规则:
实例:
springboot集成spring data jpa只需两步:
第一步:导入maven坐标
第二步:yml配置文件中配置jpa信息
jpa的分页实现
/** * 分页查询敏感词列表 * @param paramsDataLog * @param pageable * @return */ public Page<SensitiveWords> findSensitiveWordsListByPage(SensitiveWordsParams sensitiveWordsParams, Pageable pageable) { return sensitiveWordsRepository.findAll(new Specification<SensitiveWords>() { @Override public Predicate toPredicate(Root<SensitiveWords> root, CriteriaQuery<?> query, CriteriaBuilder cb) { List<Predicate> predicates = new ArrayList<Predicate>(); /* 敏感词查询条件 */ if (StringUtils.isNotEmpty(sensitiveWordsParams.getSensitiveWord())) { String s = sensitiveWordsParams.getSensitiveWord().replace(" ",""); predicates.add(cb.like(root.get("sensitiveWord"), "%"+s+"%")); } /* 创建人查询条件 */ if (StringUtils.isNotEmpty(sensitiveWordsParams.getCreateUserName())) { predicates.add(cb.like(root.get("createUserName"), "%"+sensitiveWordsParams.getCreateUserName()+"%")); } /* 创建时间查询条件 */ if (StringUtils.isNotEmpty(sensitiveWordsParams.getBeginCreateTimeStr())) { //大于或等于开始时间 predicates.add(cb.greaterThanOrEqualTo(root.get("createTime").as(String.class), sensitiveWordsParams.getBeginCreateTimeStr())); } if (StringUtils.isNotEmpty(sensitiveWordsParams.getEndCreateTimeStr())) { //小于或等于结束时间 predicates.add(cb.lessThanOrEqualTo(root.get("createTime").as(String.class), sensitiveWordsParams.getEndCreateTimeStr()+" 23:59:59")); } return cb.and(predicates.toArray(new Predicate[predicates.size()])); } }, pageable); }
jpa分页分两种。
第一种简单的 ,可以用简单的类字段属性来分页,但是太鸡肋,比如不为空,时间间隔这些就无能为力了。
//分页 @Test public void contextLoads() { BS_460 bs_460 = new BS_460(); bs_460.setCI16("47e5"); Example<BS_460> example = Example.of(bs_460); Page<BS_460> all = bs_460Dao.findAll(example,PageRequest.of(0, 4)); List<BS_460> content = all.getContent(); content.forEach(e-> System.out.println(e)); }
参考博客:https://www.cnblogs.com/smiler/p/9210255.html
以上是关于spring jpa dao是怎么自动实现的的主要内容,如果未能解决你的问题,请参考以下文章