Spring框架系列(四)-Spring Data JPA简介

附上示例程序的github地址:https://github.com/bjtudujunlin/SpringDataExample



一、 概述

SpringData是一个数据访问框架,基于Spring实现,旨在提供一致的数据库访问模型,同时仍然保留不同数据库底层数据存储的特点。Spring Data由一些列的组件组成,分别对应不同数据库具体实现。Spring Data为你实现了访问关系型数据库、非关系型数据库的统一的接口,对于常见的企业级CURD、排序操作不需要手动添加任何sql语句,同时也支持手动扩展功能。下面是Spring Data的组件,比如Spring Data JPA支持关系型数据库操作,Spring Data Elasticsearch支持对Elasticsearch的操作,对于用户来说,使用的是同一套接口,这就很方便了。

同时由于Spring Data采用了“领域驱动模型”的设计思想,用户不需要与数据库直接打交道,只需要定义好领域模型(对象类),后续的创建表、CURD等操作,Spring Data统统帮你做完。下面是spring data框架中的组件。

·       Spring Data Commons

·       Spring Data JPA

·       Spring Data KeyValue

·       Spring Data LDAP

·       Spring Data MongoDB

·       Spring Data Gemfire

·       Spring Data REST

·       Spring Data Redis

·       Spring Data for Apache Cassandra

·       Spring Data for Apache Solr

·       Spring Data Couchbase (community module)

·       Spring Data Elasticsearch (communitymodule)

·       Spring Data Neo4j (community module)

二、 Repository

SpringData中最核心的概念就是RepositoryRepository是一个抽象的接口,用户通过该接口来实现数据的访问。这次的内容基于Spring Data JPA进行介绍,Spring Data JPA提供了关系型数据库访问的一致性,在该组件中,Repository包括CrudRepositoryPagingAndSortingRepository两类。

1、CurdRepository

public interface CrudRepository<T, ID extends Serializable>extends Repository<T, ID> {

    <S extends T> S save(Sentity);

    <S extends T> Iterable<S> save(Iterable<S>entities);

    T findOne(ID id);

    boolean exists(IDid);

    Iterable<T> findAll();

    Iterable<T> findAll(Iterable<ID> ids);

    long count();

    void delete(IDid);

    void delete(Tentity);

    void delete(Iterable<?extends T> entities);

    void deleteAll();

}

 

CrudRepository接口实现了savedeletecountexistsfindOne等方法,方法的意思从名字上很容易理解,继承这个接口时需要两个模板参数TIDT就是你的实体类(对应数据库表),ID就是主键。

在使用中,用户需要继承这个接口,Customer就是定义的实体,Long是主键类型

public interface CustomerRepository extends CrudRepository<Customer, Long>

 

2PagingAndSortingRepository

public interface PagingAndSortingRepository<T, IDextends Serializable> extends CrudRepository<T, ID> {

    Iterable<T> findAll(Sort sort);

    Page<T> findAll(Pageable pageable);

}

PagingAndSortingRepository除了CrudRepository提供的方法外还提供了分页和排序两种方法,TID的意思与CrudRepository相同。

 

3、扩展查询

如果觉得curdrepository提供的查询不符合要求,可以继承该接口进行扩展,Spring Data JPA为此提供了一些表达条件查询的关键字,大致如下:

And--- 等价于SQL中的and 关键字,比如findByUsernameAndPassword(String user, Striang pwd)

Or--- 等价于SQL中的or 关键字,比如findByUsernameOrAddress(String user, String addr)

Between--- 等价于SQL中的between 关键字,比如 findBySalaryBetween(int max,int min)

LessThan--- 等价于SQL中的"<",比如 findBySalaryLessThan(int max)

GreaterThan--- 等价于SQL中的">",比如 findBySalaryGreaterThan(intmin)

IsNull--- 等价于SQL中的"is null",比如 findByUsernameIsNull()

IsNotNull--- 等价于SQL中的"is not null",比如 findByUsernameIsNotNull()

NotNull--- IsNotNull等价;

Like--- 等价于SQL中的"like",比如 findByUsernameLike(String user)

NotLike--- 等价于SQL中的"not like",比如 findByUsernameNotLike(Stringuser)

OrderBy--- 等价于SQL中的"order by",比如findByUsernameOrderBySalaryAsc(String user)

Not--- 等价于SQL中的" =",比如 findByUsernameNot(String user)

In--- 等价于SQL中的"in",比如findByUsernameIn(Collection<String> userList),方法的参数可以是 Collection类型,也可以是数组或者不定长参数;

NotIn--- 等价于SQL中的"not in",比如findByUsernameNotIn(Collection<String> userList),方法的参数可以是 Collection类型,也可以是数组或者不定长参数;

举个例子,例子中增加了根据lastNamefirsstName查询的方法。

public interface CustomerRepository extends CrudRepository<Customer, Long> {

   

    List<Customer> findByLastName(StringlastName);

   

    List<Customer> findByFirstName(String firstName);  

}

4、基于@query注解的扩展

Springdata支持JPQL 语句对查询进行扩展,例子如下:

public interface CustomerRepository extends CrudRepository<Customer, Long> {

    @Query("select a from Customer a WHERE a.firstName = ?1")

    List<Customer> findByQuery(StringfirstName);

}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值