重庆网站建设流程/b站免费建网站

重庆网站建设流程,b站免费建网站,做愛视频网站,网页和网站的概念目录 ​编辑 API接口设计的架构风格 一 Dao层实现(处理数据库) 二 Sercice层实现(处理业务逻辑) 三 Controller层(处理http请求) 四 补充知识点 1 PathVariable - 路径变量 2 CrossOrigin(Origins …

目录

​编辑

API接口设计的架构风格

一 Dao层实现(处理数据库)

二 Sercice层实现(处理业务逻辑)

三 Controller层(处理http请求)

四 补充知识点

1 @PathVariable - 路径变量

2 @CrossOrigin(Origins = "*")允许跨域访问

3 可以在路径之前加上需要访问的路径


restful 概念引入 REST(表现层状态转移Representional State Transfer)是一种软件架构风格。

旨在构建高效、可拓展的分布式系统,尤其适用于Web服务,其核心思想是通过统一的接口和资源操作实现客户端于服务器之间的交互。REST 凭借其简洁、灵活的特点,成为现代 Web 服务的基石。

API接口设计的架构风格

API接口:Web应用暴露出来的让别人访问的请求路径。jar包封装的API接口。

CRUD案例实现:

一 Dao层实现(处理数据库)

结构图

代码实现:

创建一个bean类,用来放数据库用户的信息

package org.example.springmvc.bean;import lombok.Getter;
import lombok.Setter;@Setter
@Getter
public class Employee {private Integer id;private String name;private Integer age;private String gender;public Employee(Integer id, String name, Integer age, String gender) {this.id = id;this.name = name;this.age = age;this.gender = gender;}public Employee() {}@Overridepublic String toString() {return "Employee{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}

定义一个接口里面写上需要的方法

package org.example.springmvc.dao;import org.example.springmvc.bean.Employee;public interface EmployeeDao {// 查询根据ID查询员工Employee getEmployeeById(Integer id);// 添加员工void addEmployee(Employee employee);// 修改员工void updateEmployee(Employee employee);// 删除员工(根据ID)void deleteEmployee(Integer id);}

接口的实现类(数据库增删改查的具体实现)

package org.example.springmvc.dao.Impl;import org.example.springmvc.bean.Employee;
import org.example.springmvc.dao.EmployeeDao;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;@Component
public class EmployeeDaoImpl implements EmployeeDao {private final JdbcTemplate jdbcTemplate;// 注入JdbcTemplatepublic EmployeeDaoImpl(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic Employee getEmployeeById(Integer id) {String sql = "select * from first_tb where id = ?";return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Employee.class), id);}@Overridepublic void addEmployee(Employee employee) {String sql = "insert into first_tb(id,name,age,gender) values(?,?,?,?)";jdbcTemplate.update(sql, employee.getId(), employee.getName(), employee.getAge(), employee.getGender());}@Overridepublic void updateEmployee(Employee employee) {String sql = "update first_tb set name = ?,age = ?,gender = ? where id = ?";jdbcTemplate.update(sql, employee.getName(), employee.getAge(), employee.getGender(), employee.getId());}@Overridepublic void deleteEmployee(Integer id) {String sql = "delete from first_tb where id = ?";jdbcTemplate.update(sql, id);}
}

测试类实现:(CRUD)

package org.example.springmvc;import org.example.springmvc.bean.Employee;
import org.example.springmvc.dao.EmployeeDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class SpringTest {@AutowiredEmployeeDao employeeDao;@Testpublic void test() {// 查Employee employee = employeeDao.getEmployeeById(1);System.out.println(employee);// 增删改employeeDao.addEmployee(new Employee(7, "超哥", 18, "男"));employeeDao.updateEmployee(new Employee(1, "贤哥", 18, "男"));employeeDao.deleteEmployee(5);}
}

二 Sercice层实现(处理业务逻辑)

结构图:

接口:

package org.example.springmvc.service;import org.example.springmvc.bean.Employee;public interface EmployeeService {// 根据id查询员工Employee getEmployeeById(Integer id);// 添加员工void addEmployee(Employee employee);// 修改员工void updateEmployee(Employee employee);// 删除员工void deleteEmployee(Integer id);}

接口的实现类:(实现更新操作的非空判断)

package org.example.springmvc.service.Impl;import org.example.springmvc.bean.Employee;
import org.example.springmvc.dao.EmployeeDao;
import org.example.springmvc.service.EmployeeService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;@Service
public class EmployeeServiceImpl implements EmployeeService {private final EmployeeDao employeeDao;// 注入daopublic EmployeeServiceImpl(EmployeeDao EmployeeDao) {this.employeeDao = EmployeeDao;}@Overridepublic Employee getEmployeeById(Integer id) {return employeeDao.getEmployeeById(id);}@Overridepublic void addEmployee(Employee employee) {employeeDao.addEmployee(employee);}@Overridepublic void updateEmployee(Employee employee) {//防空处理,考虑到service是被controller调用的,所以要考虑某些属性是空的,需要进行处理//1 去数据库查询到原来的值//2 把页面带来的值覆盖原来的值,页面没带的保持原状Integer id = employee.getId();if (id == null) {return;}// 获取数据库当中的Employee employeeById = employeeDao.getEmployeeById(id);//传过来的值不是空串,将值传递给数据库if (StringUtils.hasText(employee.getName())) {employeeById.setName(employee.getName());}if (StringUtils.hasText(employee.getGender())) {employeeById.setGender(employee.getGender());}if (employee.getAge() != null) {employeeById.setAge(employee.getAge());}employeeDao.updateEmployee(employeeById);}@Overridepublic void deleteEmployee(Integer id) {employeeDao.deleteEmployee(id);}
}

测试类:

    @AutowiredEmployeeService employeeService;@Testpublic void test1() {Employee employee = new Employee();employee.setId(7);employee.setAge(100);employeeService.updateEmployee(employee);}

三 Controller层(处理http请求)

代码实现:

    /*** 统一返回JSON* code: 说明:业务状态码,前后端商定不同的业务状态吗* msg: 说明:提示信息,前端根据业务状态码和提示信息进行业务逻辑处理* data: 说明:返回的数据* 前端统一处理业务逻辑,根据业务状态码和提示信息进行业务逻辑处理* 1 前端发送请求* 2 判断状态码,成功就显示数据,失败就提示提示信息(或其它操作)**/
package org.example.springmvc.common;public class R<T> {private final Integer code;private final String msg;private final T data;// 私有化构造器,强制通过静态工厂方法创建对象private R(Integer code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}// -------------------- 成功响应快捷方法 --------------------public static R<?> ok() {return new R<>(200, "success", null);}public static <T> R<T> ok(T data) {return new R<>(200, "success", data);}public static <T> R<T> ok(String msg, T data) {return new R<>(200, msg, data);}// -------------------- 错误响应快捷方法 --------------------public static R<?> error(int code, String msg) {return new R<>(code, msg, null);}public static R<?> error(ErrorCode errorCode) {return new R<>(errorCode.getCode(), errorCode.getMsg(), null);}// -------------------- 链式构建方法(可选) --------------------public R<T> withMsg(String msg) {return new R<>(this.code, msg, this.data);}public R<T> withData(T data) {return new R<>(this.code, this.msg, data);}// -------------------- Getter --------------------public Integer getCode() {return code;}public String getMsg() {return msg;}public T getData() {return data;}// -------------------- 状态码枚举(可选) --------------------public enum ErrorCode {BAD_REQUEST(400, "参数错误"),UNAUTHORIZED(401, "未授权"),NOT_FOUND(404, "资源不存在"),INTERNAL_ERROR(500, "服务器内部错误");private final int code;private final String msg;ErrorCode(int code, String msg) {this.code = code;this.msg = msg;}public int getCode() {return code;}public String getMsg() {return msg;}}
}

需求类:

package org.example.springmvc.controller;import org.example.springmvc.bean.Employee;
import org.example.springmvc.common.R;
import org.example.springmvc.service.EmployeeService;
import org.springframework.web.bind.annotation.*;@RestController
public class EmployeeRestController {EmployeeService employeeService;// 构造器注入public EmployeeRestController(EmployeeService employeeService) {this.employeeService = employeeService;}// 根据id查询员工// @RequestMapping(value = "/employee/{id}", method = RequestMethod.GET)@GetMapping(value = "/employee/{id}")public R get(@PathVariable("id") Integer id) {Employee employeeById = employeeService.getEmployeeById(id);return R.ok(employeeById);}// 根据id删除员工// @RequestMapping(value = "/employee/{id}", method = RequestMethod.POST)@DeleteMapping(value = "/employee/{id}")public R delete(@PathVariable("id") Integer id) {employeeService.deleteEmployee(id);return R.ok();}// 添加员工,前端发送请求,把 json 数据封装到 Employee 对象中@PostMapping(value = "/employee")public R add(@RequestBody Employee employee) {employeeService.addEmployee(employee);return R.ok();}// 修改员工@PutMapping(value = "/employee")public R update(@RequestBody Employee employee) {employeeService.updateEmployee(employee);return R.ok();}}

四 补充知识点

1 @PathVariable - 路径变量

2 @CrossOrigin(Origins = "*")允许跨域访问

3 可以在路径之前加上需要访问的路径

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

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

相关文章

Docker搭建MySQL主从服务器

一、在主机上创建MySQL配置文件——my.cnf master服务器配置文件路径&#xff1a;/data/docker/containers/mysql-cluster-master/conf.d/my.cnf slave服务器配置文件路径&#xff1a; /data/docker/containers/mysql-cluster-master/conf.d/my.cnf master服务配置文件内容 …

鸿蒙路由 HMrouter 配置及使用一

1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中&#xff0c;配置useNormalizedOHMUrl属性为true (我这项目创…

Linux中安装Git

安装Git 安装git&#xff0c;我们可以使用yum指令在线安装&#xff0c;这里&#xff0c;我们先对yum做一个简单介绍。 执行下面命令 #查看可用的git安装包 yum list git #安装git yum install -y git 查看git安装包 安装git 验证是否安装成功 安装完毕之后&#xff0c;我们…

开源免费一句话生成儿童故事视频核心思想解析

再看一个演示视频&#xff0c;学会核心思想后&#xff0c;可以打造自己的内容生成工具&#xff0c;后文有基于飞书多维表格的实现效果&#xff1a; 一句话灵感生成儿童故事视频演示 这是一款专门为内容素材创作打造的创新工具&#xff0c;可根据用户输入的主题&#xff0c;快速…

Linux上的`i2c-tools`工具集的详细介绍;并利用它操作IMX6ULL的I2C控制器进而控制芯片AP3216C读取光照值和距离值

IC-Tools 工具集介绍 i2c-tools 是 Linux 下用于 IC 设备调试 的用户空间工具集(你也可以把它看成是一个库&#xff0c;类似于之前自己用过的触摸屏库tslib库、FreeType矢量字符库)&#xff0c;它提供了一系列命令行工具&#xff0c;可以扫描、读取、写入 IC 设备&#xff0c;…

Windows 部署 RuoYi 前后端分离项目

目录 ruoyi-vue部署 ruoyi源码类型 若依官方地址 RuoYi-Vue 前后端分离版 环境 工具 windows开发环境 jdk安装 (安装位置默认) 双击点击安装 步骤 耐心等待加载完毕&#xff0c;路径默认 等待安装完成即可 快速打开文件资源管理器 进入高级系统设置 系统属性&#…

《C语言中的ASCII码表:解锁字符与数字的桥梁》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、什么是ASCII码表&#xff1f;二、ASCII码表的结构1. 控制字符&#xff08;0-31 和 127&#xff09;2. 可打印字符&#xff08;32-126&#xff09; 三、完…

一、初始 Linux

文章目录 一、操作系统概述二、Linux 初识1. Linux 的组成2. Linux 发行版 三、远程链接 Linux 系统1. 四、WSL (windows subsystem for linux)1. 什么是 WSL2. 如何下载 WSL3. 安装不同的 Linux 发行版4. 启动停止使用指定发行版5. 卸载与备份6. 文件共享7. 命令混用8. 用 vsc…

3D标定中的平面约束-平面方程的几何意义

平面方程的一般形式为 AxByCzD0&#xff0c;其中系数 A、B、C、D共同决定了平面的几何特性。 系数对平面姿态的影响 1. 法向量方向2. 平面位置3. 比例关系4. 姿态变换5.平面空间变换 1. 法向量方向 法向量方向由 A、B、C 决定 核心作用&#xff1a;系数 A、B、C 构成的向量 (…

C/C++蓝桥杯算法真题打卡(Day6)

一、P8615 [蓝桥杯 2014 国 C] 拼接平方数 - 洛谷 方法一&#xff1a;算法代码&#xff08;字符串分割法&#xff09; #include<bits/stdc.h> // 包含标准库中的所有头文件&#xff0c;方便编程 using namespace std; // 使用标准命名空间&#xff0c;避免每次调用…

如何在 GoLand 中设置默认项目文件夹

在使用 GoLand 进行开发时&#xff0c;设置一个默认的项目文件夹可以大大提高工作效率。默认项目文件夹会在你打开或新建项目时自动预选&#xff0c;避免每次都需要手动导航到目标目录。本文将详细介绍如何在 GoLand 中设置默认项目文件夹。 步骤一&#xff1a;打开系统设置 …

DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战

文章目录 前言1. 本地部署OllamaDeepSeek2. Page Assist浏览器插件安装与配置3. 简单使用演示4. 远程调用大模型5. 安装内网穿透6. 配置固定公网地址 前言 最近&#xff0c;国产AI大模型Deepseek成了网红爆款&#xff0c;大家纷纷想体验它的魅力。但随着热度的攀升&#xff0c…

Java基础与集合

参考 Java基础知识详解&#xff1a;从面向对象到异常处理-CSDN博客 2024年 Java 面试八股文&#xff08;20w字&#xff09;_java面试八股文-CSDN博客 基础知识 java概述 什么是java&#xff1f; java是一种面向对象的编程语言 java特点 面向对象&#xff08;继承&#…

【R语言】二项分布,正态分布,极大似然估计实现

二项分布 生成二项分布概率 s <- 0:60 prob <- dbinom(s, size 60, prob 1/6)s <- 0:60&#xff1a;生成 0 到 60 之间的整数&#xff0c;表示可能的成功次数。 dbinom(s, size 60, prob 1/6)dbinom(x, size, prob) 计算二项分布的概率质量函数&#xff08;PMF…

【C语言】:学生管理系统(多文件版)

一、文件框架 二、Data data.txt 三、Inc 1. list.h 学生结构体 #ifndef __LIST_H__ #define __LIST_H__#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <time.h>#define MAX_LEN 20// 学生信息…

Linux系统移植篇(十一)Linux 内核启动流程

要分析 Linux 启动流程&#xff0c;同样需要先编译一下 Linux 源码&#xff0c;因为有很多文件是需要编译才 会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds&#xff0c;通过链接脚本可以 找到 Linux 内核的第一行程序是从哪里执行的。vmlinux.lds …

【Docker入门】构建推送第一个Docker映像

【Docker入门】构建推送第一个Docker映像 Build and Push the First Docker Image By JacksonML Docker的容器(Container)映像是轻量级的可执行独立包&#xff0c;包含代码、运行时、库、环境变量以及配置文件&#xff0c;它对于运行软件至关重要。注册表可在团队间分享映像。…

【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发

在 一个AC多个VAP的实现—CAPWAP隧道转发 此篇文章配置的基础上&#xff0c;将隧道转发改成直接转发 一、改成直接转发需要改动的配置 &#xff08;一&#xff09;将连接AP的接口改成trunk口&#xff0c;并允许vlan100、101、102通过 [AC1]interface GigabitEthernet 0/0/8 …

SPI 总线协议

1、协议介绍 SPI&#xff0c;是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。主节点或子节点的数据在…

我爱学算法之——滑动窗口攻克子数组和子串难题(上)

现在来学习"滑动窗口"这一算法思想。 至于什么是"滑动窗口"呢&#xff1f;简单来说就是同向双指针&#xff1b;现在来通过题目来了解什么是"滑动窗口" 一、长度最小的子数组 题目链接&#xff1a;长度最小的子数组 题目解析 先来看题目&#…