一 .  Core concepts(核心概念)

1.springdata中的中心接口是——Repository。这个接口没有什么重要的功能(原句称没什么惊喜的一个接口)。主要的作用就是标记和管理。其他的接口都是此接口的子类。

Example 1:

public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
2 <S extends T> S save(S var1);//保存给定的实体
3
4 <S extends T> Iterable<S> save(Iterable<S> var1);//保存指定的实体集合
5
6 T findOne(ID var1);查询指定id的实体
7
8 boolean exists(ID var1);//判断一个实体是否与给定的ID存在
9
10 Iterable<T> findAll();//返回所有实体
11
12 Iterable<T> findAll(Iterable<ID> var1);//查询指定的实体集合
13
14 long count();//该实体的总数
15
16 void delete(ID var1);//根据id删除指定实体
17
18 void delete(T var1);//删除指定实体
19
20 void delete(Iterable<? extends T> var1);//删除指定的实体集合
21
22 void deleteAll();//删除全部
23 }

除此还提供了一些技术相关的接口,比如 JpaRepository,MongoRepository这两个接口继承了CrudRepository。

2.CrudRepository

1)CrudRepository有个子类PagingAndSortingRepository,增加了一些方法来实现分页。

public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
2 Iterable<T> findAll(Sort var1);
3
4 Page<T> findAll(Pageable var1);
5 }

2)除了普通查询,计数和删除查询都可以使用

Example 4:计数查询

dao:

controller:

Example 5:派生删除查询

dao:

controller:

3.查询数据

4.定义dao层的继承接口

通常,dao层接口将会继承Repository,CrudRepository 或者PagingAndSortingRepository 。

或者不想继承Springdata的接口,你也可以定义个自己的接口@RepositoryDefinition,继承CrudRepository 。可以定义一套完整的自己的方法。

Example 6:

 1 @NoRepositoryBean
2 interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
3
4 Optional<T> findById(ID id);
5
6 <S extends T> S save(S entity);
7 }
8
9 interface UserRepository extends MyBaseRepository<User, Long> {
10 User findByEmailAddress(EmailAddress emailAddress);
11 }

5.空库

spring提供了一些注解,用来对付这种空值请情况。

@NonNullApi(默认,不接受零)
@NonNull(可用来约束参数或返回值必须不能为零)
@Nullable(可用来约束参数或返回值可以为零)

Example 7:

interface UserRepository : Repository<User, String> {

  fun findByUsername(username: String): User //该方法当传入一个空的参数时,将会抛出一个 EmptyResultDataAccessException  

  fun findByFirstname(firstname: String?): User? //该方法接受作为参数 firstname 并返回 零 在查询执行不会产生结果。
}

6.查询方法

Spring中的基础架构中,有一种查询构建机制的约束。这种约束会忽略像find…Byread…Byquery…Bycount…By,和

get…By这种前缀,而开始分析其余部分。当然还可以引入进一步的表达式,可以定义实体中的一些条件,用and或者or对他们进行连接。

Example 8:

interface PersonRepository extends Repository<User, Long> {

  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname); // Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);
// Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname); // Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

IgnoreCase属性表示忽略大小写

OrderBy表示引用属性进行查找时附加子句并提供排序方向(Asc或Desc)

7.关于特殊参数的处理(比如Pageable和Sort in查询方法)

Example 9:

Page<User> findByLastname(String lastname, Pageable pageable);

Slice<User> findByLastname(String lastname, Pageable pageable);

List<User> findByLastname(String lastname, Sort sort);

List<User> findByLastname(String lastname, Pageable pageable);

8.关于限制查询的结果

查询方法的结果可以通过关键字来限制,first或者top都可以互换使用。且后面可以直接加数字指定需要的前几位结果。

Example 10:

User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable)

9.方法中支持的关键字

8.关于限制查询的结果

查询方法的结果可以通过关键字来限制,first或者top都可以互换使用。且后面可以直接加数字指定需要的前几位结果。

Example 10:

User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable)

9.方法中支持的关键字,详情见慕课网springData,Reposotory查询方法命名规则

10.使用注解 @Query

Example 11:

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
}

Example 12:使用命名参数

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
User findByLastnameOrFirstname(@Param("lastname") String lastname,
@Param("firstname") String firstname);
}

Example 13:声明操作查询

@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);
 
 
 

springDataJpa的官方API的更多相关文章

  1. SpringdataJpa的官方API学习

    (将对Springdata JPA的API  第三章之后进行解释) 一 .  Core concepts(核心概念) 1.springdata中的中心接口是——Repository.这个接口没有什么重 ...

  2. 关于基本类型值和引用类型值以及Vue官方API的array.$remove(reference)

    今天又是孟哥解惑. 数组里的元素也是指向内存地址么? 这个要分情况的. 无论a[0],a[2]在什么地方,只要其值是基本类型值,就是值的比较,只要其值是引用类型(对象),就是内存地址的比较. Vue官 ...

  3. 国内值得关注的官方API集合

    项目地址:https://github.com/marktony/Awesome_API 本页仅收集国内部分官方API,如需查看其他版本,请点击这里. 目录 笔记 出行 词典 电商 地图 电影 后端云 ...

  4. 通过官方API结合源码,如何分析程序流程

    通过官方API结合源码,如何分析程序流程通过官方API找到我们关注的API的某个方法,然后把整个流程执行起来,然后在idea中,把我们关注的方法打上断点,然后通过Step Out,从内向外一层一层分析 ...

  5. Springboot整合elasticSearch的官方API实例

    前言:在上一篇博客中,我介绍了从零开始安装ElasticSearch,es是可以理解为一个操作数据的中间件,可以把它作为数据的存储仓库来对待,它具备强大的吞吐能力和计算能力,其基于Lucene服务器开 ...

  6. mongodb数据库下载链接,相关配置(转载),官方api

    下载链接:http://dl.mongodb.org/dl/win32/x86_64 配置:http://blog.sina.com.cn/s/blog_685213e70101g81t.html 官 ...

  7. Ext js-02 -官方API文档使用

    官方API文档地址: http://docs.sencha.com/extjs/6.5.3/classic/Ext.html 打开网页如下: 1.选择所使用的Ext js版本,后面offline do ...

  8. 图解DevExpress RichEditControl富文本的使用,附源码及官方API

    9点半了,刚写到1.2.   该回家了,明天继续写完. 大家还需要什么操作,留言说一下,没有的我明天继续加. 好久没有玩DevExpress了,今天下载了一个玩玩,发现竟然更新到14.2.5了..我去 ...

  9. 【完全开源】知乎日报UWP版(上篇):界面设计、官方API分析

    目录 说明 使用Fiddler分析android版API 部分效果图 关于源码 说明 在做博客园UWP版的时候其实就有做知乎日报的打算了,前段时间一直出差,在酒店里用Fiddler简单的分析了一下An ...

随机推荐

  1. error LNK2001: 无法解析的外部符号 __imp__MessageBoxA@16

    错误: error LNK2001: 无法解析的外部符号 __imp__MessageBoxA@16 原因: 本来程序的编译选项选择的是:使用标准windows库,当改为在静态库中使用MFC后就出现了 ...

  2. DOS和DDOS攻击

    1.什么是DOS攻击 首先注意这里是DOS(Denial Of Service)攻击,并非DoS.DoS是微软早期的系统版本. DoS即Denial Of Service,拒绝服务的缩写.DoS是指故 ...

  3. CSS:CSS 背景

    ylbtech-CSS:CSS 背景 1.返回顶部 1. CSS 背景 CSS 背景属性用于定义HTML元素的背景. CSS 属性定义背景效果: background-color background ...

  4. 编码(RZ NRZ NRZI)

    Frm: https://jingyan.baidu.com/album/39810a23addccbb637fda66a.html?picindex=1 RZ 编码(Return-to-zero C ...

  5. hbase之setCaching 和 setBatch 和setMaxResultSize

    scan的setBatch()用法 val conf = HBaseConfiguration.create() val table: Table = ConnectionFactory.create ...

  6. 剑指offer——59二叉搜索树的第k大节点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4.   题解: 考察的就是中序遍历 不过注意进行剪枝 cl ...

  7. 3-vim-打开和新建文件-02-删除交换文件

    vim的异常处理 如果vim异常退出,在磁盘上可能会保存有交换文件. 若使用vi编辑该文件时看到如下图信息,按下字母d就可以删除交换文件. 注意:输入命令操作的时候关闭输入法.

  8. 树上倍增 hdu 2586

    参考博客: 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<mat ...

  9. JS 将对象转换成字符 字符串转换成json对象

    //js对象 var user = { "name": "张学友", "address": "中国香港" }; //将对 ...

  10. Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例

    前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后 ...