前后端分离项目进阶1---后端

前端链接:前端解析

一.项目目录

二.关键代码分析

1)Admin.java

java 复制代码
package improv1.improv1.entity;
public class Admin {
    private String account;
    private String password;
    private String name;

    // 构造方法、getter和setter
    public Admin() {
    }

    public Admin(String account, String password, String name) {
        this.account = account;
        this.password = password;
        this.name = name;
    }

    // Getters and Setters
    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

解析:

编写Admin实体类,其实可以不用写实体类,可以直接通过Mapper来获取数据库表的对应数据,

java 复制代码
// Controller中直接接收Map
@PostMapping
public void addAdmin(@RequestBody Map<String, Object> adminMap) {
    adminMapper.insert(adminMap);
}

// Mapper接口
@Insert("INSERT INTO admin VALUES(#{account}, #{password}, #{name})")
int insert(Map<String, Object> map);

但是,这样做不利于纠错,字段名拼写错误只有在运行时才会暴露,无法保证所有必要字段都存在,业务逻辑散落在各处,难以维护。对此,建议

学习阶段:建议坚持用Entity,培养良好设计习惯

正式项目:必须用Entity+DTO,减少后期维护成本

特殊需求 :如果确实需要灵活性,可以用MyBatis的 @MapKey 注解:

java 复制代码
@Select("SELECT * FROM admin")
@MapKey("account")  // 返回Map结构,key=account,value=记录Map
Map<String, Map<String, Object>> findAllAsMap();

2)AdminMapper.java

java 复制代码
package improv1.improv1.mapper;
import improv1.improv1.entity.Admin;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface AdminMapper {
    @Select("SELECT * FROM admin")
    List<Admin> findAll();

    @Select("SELECT * FROM admin WHERE Account = #{account}")
    Admin findByAccount(String account);

    @Insert("INSERT INTO admin(Account, Password, Name) VALUES(#{account}, #{password}, #{name})")
    int insert(Admin admin);

    @Update("UPDATE admin SET Password = #{password}, Name = #{name} WHERE Account = #{account}")
    int update(Admin admin);

    @Delete("DELETE FROM admin WHERE Account = #{account}")
    int delete(String account);
}

解析:

提供五个接口,分别用来查询全部记录,查询指定账号记录和插入新数据,更新数据,删除数据。

3).AdminController.java

java 复制代码
package improv1.improv1.controller;
import improv1.improv1.entity.Admin;
import improv1.improv1.mapper.AdminMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/admins")
public class AdminController {
    @Autowired
    private AdminMapper adminMapper;

    @GetMapping
    public List<Admin> getAllAdmins() {
        return adminMapper.findAll();
    }

    @GetMapping("/{account}")
    public Admin getAdminByAccount(@PathVariable String account) {
        return adminMapper.findByAccount(account);
    }

    @PostMapping
    public int addAdmin(@RequestBody Admin admin) {
        return adminMapper.insert(admin);
    }

    @PutMapping("/{account}")
    public int updateAdmin(@PathVariable String account, @RequestBody Admin admin) {
        admin.setAccount(account);
        return adminMapper.update(admin);
    }

    @DeleteMapping("/{account}")
    public int deleteAdmin(@PathVariable String account) {
        return adminMapper.delete(account);
    }
}

解析:

@RequestBody(请求体参数)

作用 :从 HTTP 请求体(body) 获取 JSON/XML 数据,并转换成 Java 对象。
适用场景:提交表单数据、创建/更新资源(如 POST 请求传 JSON 数据)。

@PathVariable(路径变量)

作用 :从 URL 路径 中获取参数。
适用场景 :RESTful API,比如查询、删除某个资源(如 /users/1 表示获取 ID=1 的用户)。

特性 @PathVariable @RequestBody
参数来源 URL 路径(如 /users/1 HTTP 请求体(Body)
数据格式 简单类型(数字、字符串) JSON/XML(复杂对象)
适用方法 GETDELETE POSTPUT
示例请求 GET /users/1 POST /users + JSON
Content-Type 不需要指定 需指定(如 application/json
相关推荐
Knight_AL2 分钟前
如何解决 Jacob 与 Tomcat 类加载问题:深入分析 Tomcat 类加载机制与 JVM 双亲委派机制
java·jvm·tomcat
枫叶丹48 分钟前
【Qt开发】多元素类控件(二)-> QTableWidget
开发语言·qt
bin915310 分钟前
当AI开始‘映射‘用户数据:初级Python开发者的创意‘高阶函数‘如何避免被‘化简‘?—— 老码农的函数式幽默
开发语言·人工智能·python·工具·ai工具
哲学七15 分钟前
Springboot3.5.x版本引入javaCv相关库版本问题以及精简引入包
java·ffmpeg
Aqua Cheng.30 分钟前
代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
java·数据结构·算法·散列表
Nebula_g31 分钟前
Java哈希表入门详解(Hash)
java·开发语言·学习·算法·哈希算法·初学者
努力努力再努力wz34 分钟前
【C++进阶系列】:万字详解unordered_set和unordered_map,带你手搓一个哈希表!(附模拟实现unordered_set和unordered_map的源码)
java·linux·开发语言·数据结构·数据库·c++·散列表
励志不掉头发的内向程序员37 分钟前
【STL库】哈希表的原理 | 哈希表模拟实现
开发语言·c++·学习·散列表
万粉变现经纪人44 分钟前
如何解决 pip install -r requirements.txt 私有仓库认证失败 401 Unauthorized 问题
开发语言·python·scrapy·flask·beautifulsoup·pandas·pip