springboot中的接口实现调用

  • 定义接口:
  • 实现
  • 接口调用
  • 分析在类中定义方法也可以在其他类中声明使用,与使用接口的方法相比他们的差异是什么,哪个更合理

springboot中的接口实现调用:

定义接口:

通过创建一个interface的类型的类创建接口

示例:

package app.test4.OpportunityMatching;


import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface IUserRepository extends CrudRepository<User, Integer> {

    List<User> findByNameAndArea(String name, String area);
}

逐行解析:


public interface IUserRepository extends CrudRepository<UserInteger{

这是IUserRepository接口的声明,使用extends(继承属性与方法)它扩展了CrudRepository接口,并指定了实体类为User,ID类型为Integer。


List<User> findByNameAndArea(String name, String area);

这是自定义的查询方法findByNameAndArea,它接受两个参数 name 和 area,用于查询符合指定条件的用户列表。

虽然根据方法名,Spring Data JPA会自动生成查询语句

但是我们也可自己定义查询逻辑,实现接口功能

实现

下面对接口进行实现,定义 一个 实现的类UserRepositoryImpl


public abstract class UserRepositoryImpl implements IUserRepository {

    @Autowired
    private EntityManager entityManager;

    @Override
    public List<User> findByNameAndArea(String name, String area) {
        //此处实现方法逻辑
        String queryString = "SELECT u FROM User u WHERE u.name = :name AND u.area = :area";
        TypedQuery<User> query = entityManager.createQuery(queryString, User.class);
        query.setParameter("name", name);
        query.setParameter("area", area);
        return query.getResultList();
    }
}

public abstract class UserRepositoryImpl implements IUserRepository {

这是一个抽象类UserRepositoryImpl,使用implements(实现)实现了IUserRepository接口。


@Autowired
private EntityManager entityManager;

这里使用@Autowired注解将EntityManager自动注入到entityManager字段中。EntityManager用于与数据库进行交互,执行查询和持久化操作。


@Override
public List<User> findByNameAndArea(String name, String area) {
    //此处实现方法逻辑
    String queryString = "SELECT u FROM User u WHERE u.name = :name AND u.area = :area";
    TypedQuery<User> query = entityManager.createQuery(queryString, User.class);
    query.setParameter("name", name);
    query.setParameter("area", area);
    return query.getResultList();
}

这是对findByNameAndArea方法的实现。

在这个方法中,我们使用JPQL(Java Persistence Query Language)语法构建了查询字符串queryString。该查询语句从User实体中选择满足指定条件(name和area)的记录。

然后,我们创建了一个TypedQuery对象,并传递查询字符串和实体类User.class作为参数。接下来,我们使用query.setParameter方法设置查询参数的值,将name和area参数与查询字符串中的占位符进行绑定。

最后,我们调用query.getResultList方法执行查询,并返回查询结果的列表。

接口调用

下面对刚刚的接口实现功能进行简单的调用:


@RestController
@RequestMapping("/user")
public class OpportunityMatching {

    @Qualifier("IUserRepository")
    @Autowired
    private IUserRepository iUserRepository;
    @GetMapping("/users")
    public MessageResponse<List<User>> viewUsersByCriteria(@RequestParam("name") String name, @RequestParam("area") String area) {
        try {
            List<User> users = iUserRepository.findByNameAndArea(name, area);
            if (!users.isEmpty()) {
                return MessageResponse.success(users);
            } else {
                return MessageResponse.error(500"未找到匹配的用户");
            }
        } catch (Exception e) {
            return MessageResponse.error(500"查询用户信息失败: " + e.getMessage());
        }
    }

    @GetMapping("/view")
    public MessageResponse<Iterable<User>> viewUsers() {
        try {
            Iterable<User> users = iUserRepository.findAll();
            return MessageResponse.success(users);
        } catch (Exception e) {
            return MessageResponse.error(500"Failed to retrieve users: " + e.getMessage());
        }
    }

    @PostMapping("/insert")
    public MessageResponse<User> insertUser(@RequestBody User user) {
        try {
            User savedUser = iUserRepository.save(user);
            return MessageResponse.success(savedUser);
        } catch (Exception e) {
            return MessageResponse.error(500"Failed to insert user: " + e.getMessage());
        }
    }

    @PostMapping("/update/{id}")
    public MessageResponse<User> updateUser(@PathVariable int id, @RequestBody User user) {
        try {
            user.setId(id);
            User updatedUser = iUserRepository.save(user);
            return MessageResponse.success(updatedUser);
        } catch (Exception e) {
            return MessageResponse.error(500"Failed to update user: " + e.getMessage());
        }
    }
}

分析在类中定义方法也可以在其他类中声明使用,与使用接口的方法相比他们的差异是什么,哪个更合理

在类中定义方法与在接口中定义方法相比,有一些重要的差异和适用场景。

类中定义方法的差异:

类中定义的方法可以具有方法体,即提供实际的方法实现。 类中定义的方法可以被其他类直接调用和使用。 类中定义的方法可以访问类的成员变量和方法,以及通过this关键字引用当前类的实例。

接口中定义方法的特点:

接口中定义的方法没有方法体,只有方法签名,即方法的名称、参数列表和返回类型。 接口中定义的方法需要在实现该接口的类中进行具体的实现。 实现接口的类需要实现接口中定义的所有方法,提供方法的实际实现逻辑。 接口中定义的方法用于描述类应该具有的行为和能力,而不关注具体的实现细节。

相比

一个类可以实现多个接口,从而具备多个接口定义的方法。 哪个更合理取决于你的具体需求和设计目标:

如果你希望定义一个通用的契约或协议,描述类应该具备的行为,而不关注具体的实现细节,那么使用接口更合理。接口允许你定义一组方法签名,而具体的实现由实现接口的类提供。

如果你希望定义一个具体的类,并提供该类的实际方法实现,那么在类中定义方法更合适。类中定义的方法允许你提供方法体,实现具体的逻辑,并可以直接被其他类调用和使用。

在实际项目中,通常会同时使用接口和类来实现不同的需求。接口用于定义抽象的行为和契约,提供一致的编程接口;而类则用于提供具体的实现和功能。

总结起来,接口更适合定义抽象的行为和规范,而类更适合提供具体的实现和功能。根据你的具体需求,你可以选择使用接口、类或两者结合来实现最合理的设计。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】命名空间 ( namespace )

目录搁这 什么是命名空间命名空间的作用如何定义命名空间命名空间的种类如何使用命名空间内的成员作用域限定符命名空间展开命名空间全部展开命名空间部分展开 总结 什么是命名空间 命名空间是一种用来避免命名冲突的机制&#xff0c;它可以将一段代码的名称隔离开&#xff0c…

对学习方法的一些思考

只看基金的招募书和合同的只言片语是没办法彻底的了解这只基金的策略的&#xff0c;必须有一个机会看看基金经理是怎么聊这个策略的&#xff01; 基金这个壳子的【股票/债券】究竟应该如何配比才能达到理想且优秀的效果呢&#xff1f; 【债券配得多从长期&#xff08;5年&#…

纯CSS实现的卡片切换效果

纯CSS实现的卡片切换效果 无需JS就可以实现限于纯静态页面产品展示不需要轮播,自动切换 示例代码 <template><div class"example-css-tab"><div class"container dwo"><div class"card"><input type"radio"…

【实战总结】SpringMVC架构升级SpringCloudAlibaba

升级目标 SpringMVCDubboZookeeper分布式架构改为Spring Cloud Alibaba微服务 技术框架:Spring Boot 2.7.2、Spring Cloud 2021.0.3 & Alibaba 2021.0.1.0 容器:Tomcat 9.0.65 JDK:1.8 配置中心:Nacos 2.0.4 消息队列:RocetMQ 4.9.3 配置中心:Apollo 11.0 缓存: Redis 4.0…

Elasticsearch 查询分析器简介

Elasticsearch 查询分析器简介 一、Elasticsearch 查询分析器概述1.1 Elasticsearch 简介1.2 查询分析器的作用 二、查询分析器类型2.1 Standard Analyzer2.2 Simple Analyzer2.3 Whitespace Analyzer2.4 Stop Analyzer2.5 Keyword Analyzer2.6 Pattern Analyzer2.7 语言分析器…

【C语言】杨氏矩阵中寻找元素

题目名称&#xff1a; 杨氏矩阵 题目内容&#xff1a; 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从下到上递增的&#xff08;杨氏矩阵的定义&#xff09;&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 形如这样的矩阵就是杨氏…

[USACO21DEC] Convoluted Intervals S

洛谷[USACO21DEC] Convoluted Intervals S 题目大意 有 n n n个区间&#xff0c;第 i i i个区间为 [ a i , b i ] [a_i,b_i] [ai​,bi​]&#xff0c;都在 [ 0 , m ] [0,m] [0,m]上。对于每一个 k ∈ [ 0 , 2 m ] k\in [0,2m] k∈[0,2m]&#xff0c;求满足 a i a j ≤ k ≤ …

关于贪心算法的一个小结

下面的内容主要参考了数据结构与算法之美。 贪心算法的应用有&#xff1a; 霍夫曼编码&#xff08;Huffman Coding&#xff09; Prim和Kruskal最小生成树算法 01背包问题(当允许取部分物品的时候) 分糖果 我们有m个糖果和n个孩子。我们现在要把糖果分给这些孩子吃&#xff…

MySQL是否解决幻读问题

MySQL是否解决幻读问题 MySQL事务隔离级别 ✓ 读未提交&#xff08;Read Uncommitted&#xff09;&#xff1a;最低的隔离级别&#xff0c;会读取到其他事务还未提交的内容&#xff0c;存在脏读。 ✓ 读已提交&#xff08;Read Committed&#xff09;&#xff1a;读取到的内容都…

chatglm微调

chatGML 看到 【【官方教程】ChatGLM-6B 微调&#xff1a;P-Tuning&#xff0c;LoRA&#xff0c;Full parameter】 【精准空降到 15:27】 https://www.bilibili.com/video/BV1fd4y1Z7Y5/?share_sourcecopy_web&vd_sourceaa8c13cff97f0454ee41e1f609a655f1&t927 记得看…

npm 加速 国内镜像源

一、修改成腾讯云镜像源 1、命令 npm config set registry http://mirrors.cloud.tencent.com/npm/ 验证命令 npm config get registry 如果返回http://mirrors.cloud.tencent.com/npm/&#xff0c;说明镜像配置成功。 二、修改成淘宝镜像源 命令 npm config set regist…

一文了解Docker之网络模型

目录 1.Docker网络 1.1 Docker网络模型概述 1.2 Docker网络驱动程序 1.2.1 host模式 1.2.2 bridge模式 1.2.3 container模式 1.2.4 none模式 1.3 Docker网络命令示例 1.3.1 创建一个自定义网络 1.3.2 列出所有网络 1.3.3 连接容器到网络 1.3.4 断开容器与网络的连接…

SpringCloud(三)LoadBalancer负载均衡

一、负载均衡 实际上&#xff0c;在添加LoadBalanced注解之后&#xff0c;会启用拦截器对我们发起的服务调用请求进行拦截&#xff08;注意这里是针对我们发起的请求进行拦截&#xff09;&#xff0c;叫做LoadBalancerInterceptor&#xff0c;它实现ClientHttpRequestIntercep…

Android 系统的分区介绍

由于Android系统采用Linux架构&#xff0c;所以Android的系统分区可以类比同样采用Linux架构的操作系统&#xff08;如Windows&#xff09;。 Android系统分区分类 现在一般常见的Android分区方式共有三种&#xff0c;在不同的Android系统版本上会采用不同的分区方式。 1、传…

Postman接口自动化之postman脚本编写

这是之前搞的接口自动化方案&#xff0c;已经在业务测试中实现了使用postman编写接口脚本&#xff0c;通过GitHubJenkinsemail html report实现了接口自动化&#xff0c;现在分块整理一下。 postman脚本编写 1、创建集合 和 目录&#xff1a; 一条业务线下的接口可以放到一个…

Android adb说明与详解

Android adb 说明与详解 Android Debug Bridge&#xff08;ADB&#xff09;是一个非常有用的工具&#xff0c;它可以帮助开发人员在Android设备和计算机之间进行通信&#xff0c;以便在设备上进行调试、测试和安装应用程序。 1. 安装ADB 在使用ADB之前&#xff0c;您需要安装…

sonarqube安装并配置CI/CD

sonarqube安装使用 目录 简介效果(配置在下面查看)官方文档环境准备配置compose-sonarqube.yml启动登录集成Gitlab 获取私钥sonarqube配置gitlab查看项目 配置 手动方式Gitlab CI/CD 自动检测 简介 SonarQube是一个开源的代码质量管理平台&#xff0c;用于对代码进行静态代…

【数学建模】——相关系数

第一部分&#xff1a;皮尔逊相关系数的计算以及数据的描述性统计 本讲我们将介绍两种最为常见的相关系数&#xff1a;皮尔逊person相关系数和斯皮尔曼spearman等级相关系数。它们可以用来衡量两个变量之间的相关性的大小&#xff0c;根据数组满足的不同条件&#xff0c;我们要选…

Monocular 3D Object Detection with Depth from Motion 论文学习

论文链接&#xff1a;Monocular 3D Object Detection with Depth from Motion 1. 解决了什么问题&#xff1f; 从单目输入感知 3D 目标对于自动驾驶非常重要&#xff0c;因为单目 3D 的成本要比多传感器的方案低许多。但单目方法很难取得令人满意的效果&#xff0c;因为单张图…

QT之智能指针

如果没有智能指针&#xff0c;程序员必须保证new对象能在正确的时机delete&#xff0c;四处编写异常捕获代码以释放资源&#xff0c;而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会…