我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用Spring Data repository进行数据层的访问

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用Spring Data repository进行数据层的访问

本篇内容主要讲解“如何使用Spring Data repository进行数据层的访问”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Spring Data repository进行数据层的访问”吧!

使用Spring Data repository进行数据层的访问

抽象出Spring Data repository是因为在开发过程中,常常会为了实现不同持久化存储的数据访问层而写大量的大同小异的代码。

Spring Data repository的目的就是要大幅减少这些重复的代码。 Spring Data Elasticsearch为文档的存储,查询,排序和统计提供了一个高度抽象的模板。

核心概念

Spring Data repository抽象中最核心的接口就是Repository。该接口使用了泛型,需要提供两个类型参数,

  • 第一个是接口处理的域对象类型

  • 第二个是域对象的主键类型。

这个接口常被看做是一个标记型接口,用来获取要操作的域对象类型和帮助开发者识别继承这个类的接口。在Repository的基础上,CrudRepository接口提供了针对实体类的复杂的CRUD(增删改查)操作。

public interface CrudRepository<T, ID extends Serializable>    extends Repository<T, ID> {    <S extends T> S save(S entity);     T findOne(ID primaryKey);           Iterable<T> findAll();              Long count();                       void delete(T entity);              boolean exists(ID primaryKey);      // … more functionality omitted.}

PagingAndSortingRepository接口在CrudRepository的基础上增加了一些方法,使开发者可以方便的对实体类进行分页和排序。

public interface PagingAndSortingRepository<T, ID extends Serializable>  extends CrudRepository<T, ID> {  Iterable<T> findAll(Sort sort);  Page<T> findAll(Pageable pageable);}

在分页长度为20的基础上,想要获取第二页的User数据,代码如下

PagingAndSortingRepository<User, Long> repository = // … get access to a beanPage<User> users = repository.findAll(new PageRequest(1, 20));

查询方法

标准的CRUD(增删改查)功能都要使用查询语句来查询数据库。但通过使用Spring Data,只要五个步骤就可以实现。

  • 创建一个Domain类

@Entity@Documentpublic class Person {  …}
  • 声明一个继承Repository接口或其子接口的持久层接口。并标明要处理的域对象类型及其主键的类型(在下面的例子中,要处理的域对象是Person,其主键类型是Long)

interface PersonRepository extends Repository<Person, Long> { … }
  • 在接口中声明查询方法(spring会为其生成实现代码)

interface PersonRepository extends Repository<Person, Long> {  List<Person> findByLastname(String lastname);}
  • 让Spring创建对这些接口的代理实例。

使用JavaConfig的方式

import org.springframework.data.jpa.repository.config.EnableJpaRepositories;@EnableJpaRepositoriesclass Config {}

使用xml配置的方式

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:jpa="http://www.springframework.org/schema/data/jpa"   xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans.xsd     http://www.springframework.org/schema/data/jpa     http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">   <jpa:repositories base-package="com.acme.repositories"/></beans>

注入repository实例,并使用

public class SomeClient {  @Autowired  private PersonRepository repository;  public void doSomething() {    List<Person> persons = repository.findByLastname("Matthews");  }}

定义查询方法

CREATE

Spring Data repository自带了一个非常有用的查询构造器。它会从方法名中去掉类似find..By,read...By,query...By,count...By之类的前缀,然后解析剩余的名字。我们也可以在方法名中加入更多的表达式,比如查询时需要distinct约束,那么在方法名中加入Distinct即可。方法名中的第一个By是一个分解符,代表着查询语句的开始,我们可以用And或Or来将多个查询条件关联起来。

public 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);}

除此之外,我们还可以为方法添加某些特定类型的参数(如:Pageable和Sort)来动态的在查询中添加分页和排序。

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);

USE_DECLARED_QUERY

如果方法通过 @Query 指定了查询语句,则使用该语句创建Query;如果没有,则查找是否定义了符合条件的Named Query,如果找到,则使用该命名查询;如果两者都没有找到,则抛出异常。使用@Query声明查询语句的例子如下:

//使用Query注解@Query("select a from AccountInfo a where a.accountId = ?1")public AccountInfo findByAccountId(Long accountId);

CREATE_IF_NOT_FOUND

结合了CREATE和USE_DECLARED_QUERY 两种策略,会先尝试查找声明好的查询,如果没有找到,就按照解析方法名的方式构建查询。这是默认的查询策略,如果不更改配置,会一直使用这种策略构建查询。这种策略支持通过方法名快速定义一个查询,也允许引入声明好的查询。

WEB支持

DomainClassConverter 允许开发者在SpringMVC控制层的方法中直接使用域对象类型(Domain types),而无需通过repository手动查找这个实例。

@Controller@RequestMapping("/users")public class UserController {  @RequestMapping("/{id}")  public String showUserForm(@PathVariable("id") User user, Model model) {    model.addAttribute("user", user);    return "userForm";  }}

上面的方法直接接收了一个User对象,开发者不需要做任何的搜索操作,转换器会自动将路径变量id转为User对象的id,并且调用了findOne()方法查询出User实体。 注意:当前的Repository 必须实现CrudRepository

HandlerMethodArgumentResolver使开发者可以在controller的方法中使用Pageable和Sort作为参数。

@Controller@RequestMapping("/users")public class UserController {  @Autowired UserRepository repository;  @RequestMapping  public String showUsers(Model model, Pageable pageable) {    model.addAttribute("users", repository.findAll(pageable));    return "users";  }}

通过上面的方法定义,Spring MVC会使用下面的默认配置尝试从请求参数中得到一个Pageable的实例。

参数名作用
page想要获取的页数,默认为0
size获取页的大小,默认为20
page需要排序的属性,格式为property,property(,ASC/DESC),默认升序排序。支持多个字段排序,比如?sort=firstname&sort=lastname,asc

开发者也可以针对多个表定义多个Pageable或Sort实例,需要使用Spring的@Qualifier注解来区分它们。并且请求参数名要带有${qualifier}_的前缀。例子如下:

public String showUsers(Model model,      @Qualifier("foo") Pageable first,      @Qualifier("bar") Pageable second) { … }

请求中需要带有foo_page和bar_page等参数。

到此,相信大家对“如何使用Spring Data repository进行数据层的访问”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用Spring Data repository进行数据层的访问

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用Spring Data repository进行数据层的访问

本篇内容主要讲解“如何使用Spring Data repository进行数据层的访问”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Spring Data repository进行数据层
2023-07-02

Spring Boot使用MyBatis如何实现访问数据库

今天就跟大家聊聊有关Spring Boot使用MyBatis如何实现访问数据库,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。基于spring boot开发的微服务应用,与MyBati
2023-05-31

PHP开发中如何使用Memcache进行高效的数据缓存和访问?

随着Web应用程序日益增加的访问量,数据的缓存和访问成为了一个很重要的问题。在PHP开发中,使用Memcache可以有效地缓存和访问数据,在提高Web应用程序性能和用户体验方面发挥着不可替代的作用。本文将介绍什么是Memcache,为什么使
PHP开发中如何使用Memcache进行高效的数据缓存和访问?
2023-11-07

C++ 友元函数详解:如何使用友元函数进行跨类访问?

c++++ 中的友元函数允许非成员函数访问类的私有和受保护成员,在实现跨类操作、adt 和单元测试中十分有用:声明友元函数:使用 friend 关键字声明一个类外的函数。使用友元函数:直接访问类的私有成员,就像它是一个成员函数一样。实战案例
C++ 友元函数详解:如何使用友元函数进行跨类访问?
2024-04-29

如何使用MySQL进行跨数据库的数据同步?

如何使用MySQL进行跨数据库的数据同步?在现代的软件开发中,数据库的使用无处不在。而随着软件项目的增长,数据的同步和备份变得越来越重要。MySQL是一个强大的关系型数据库管理系统,同时也提供了一些可靠的方法来实现跨数据库的数据同步。本文将
2023-10-22

使用Spring MVC与Mybatis如何对Mysql数据库进行分页查询

使用Spring MVC与Mybatis如何对Mysql数据库进行分页查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。第一步,搭建这个小案例,引入spring和mybtis的
2023-05-31

与列表的数据竞争。使用互斥锁进行列表并发访问

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《与列表的数据竞争。使用互斥锁进行列表并发访问》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,
与列表的数据竞争。使用互斥锁进行列表并发访问
2024-04-05

如何使用Spring解决ibatis多数据源的问题

本篇内容介绍了“如何使用Spring解决ibatis多数据源的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!iBatis多数据源的苦恼在
2023-06-18

ADO.NET中如何使用连接模式访问数据库中的数据

本篇内容介绍了“ADO.NET中如何使用连接模式访问数据库中的数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ADO.NET框架支持两种模
2023-06-17

如何使用MySQL进行高效的数据查询?

如何使用MySQL进行高效的数据查询?MySQL是一种常用的关系型数据库管理系统,广泛应用于网站开发、数据分析等领域。在实际应用中,进行高效的数据查询对于提升系统性能和用户体验至关重要。本文将介绍如何使用MySQL进行高效的数据查询,并给出
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录