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是怎么自动实现的的主要内容,如果未能解决你的问题,请参考以下文章

使用Spring Data JPA的Spring Boot

如何使用 JPA 实现测试 DAO?

spring Data jpa 一对多关联 动态查询怎么写

Spring+JPA EntityManager 注入 service 和 dao

springelasticsearchdata 性能

自动生成 Daos 的工具