前后端分离项目进阶1---后端
前端链接:前端解析
一.项目目录
二.关键代码分析
1)Admin.java
package improv1.improv1.entity;
public class Admin {private String account;private String password;private String name;// 构造方法、getter和setterpublic Admin() {}public Admin(String account, String password, String name) {this.account = account;this.password = password;this.name = name;}// Getters and Setterspublic 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来获取数据库表的对应数据,
// 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
注解:@Select("SELECT * FROM admin") @MapKey("account") // 返回Map结构,key=account,value=记录Map Map<String, Map<String, Object>> findAllAsMap();
2)AdminMapper.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
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 {@Autowiredprivate AdminMapper adminMapper;@GetMappingpublic List<Admin> getAllAdmins() {return adminMapper.findAll();}@GetMapping("/{account}")public Admin getAdminByAccount(@PathVariable String account) {return adminMapper.findByAccount(account);}@PostMappingpublic 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(复杂对象) |
适用方法 | GET 、DELETE | POST 、PUT |
示例请求 | GET /users/1 | POST /users + JSON |
Content-Type | 不需要指定 | 需指定(如 application/json ) |