基于ruoyi后端单表user的CURD功能完善
目录一.概述环境准备一.数据库准备二.CSMD四层模块创建1.control层接口入口创建2.Service 层业务逻辑创建3.Mapper 层数据库操作创建4.Domain 层实体类创建5.回看总体三.安全机制调整四.postman进行测试示例一.概述实现在ruoyi系统中以CSMD四层架构为基础完善后端单表user的CURD功能代码和测试。适用于刚学完 SpringBootMyBatis想快速上手后台框架且不写前端先让接口跑起来。环境准备流程:1.数据库准备2.csmd四层模块创建重点3.调整安全机制以便测试4.用postman进行测试一.数据库准备首先进行sql建表推荐使用navicat创建SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE user ( id int UNSIGNED NOT NULL AUTO_INCREMENT, name varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL, age int NULL DEFAULT NULL, sex char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL, creat_time datetime NULL DEFAULT NULL, PRIMARY KEY (id DESC) USING BTREE ) ENGINE InnoDB AUTO_INCREMENT 4 CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci ROW_FORMAT Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO user VALUES (3, dog, 1, m, 2025-10-07 20:11:44); INSERT INTO user VALUES (2, fu, 21, w, 2025-10-09 15:07:31); INSERT INTO user VALUES (1, chen, 20, m, 2025-10-14 15:07:06); SET FOREIGN_KEY_CHECKS 1;二.CSMD四层模块创建1.control层接口入口创建提供 HTTP 接口被前端或 Postman 调用请求体会自动转为User对象响应统一返回AjaxResult在ruoyi中的路径usercontroller.java具体代码实现package com.ruoyi.web.controller.system; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import com.ruoyi.system.domain.User; import com.ruoyi.system.service.UserService; import com.ruoyi.common.core.domain.AjaxResult; RestController //根路径 RequestMapping(/system/users) public class UserController { //依赖注入spring会把实现类UserServiceImpl 塞进来直接可以调增删改查方法。 Autowired private UserService userService; GetMapping(/list) public AjaxResult list(User user) { ListUser list userService.selectUserList(user); return AjaxResult.success(list); } PostMapping public AjaxResult add(RequestBody User user) { return AjaxResult.success(userService.insertUser(user)); } PutMapping public AjaxResult edit(RequestBody User user) { return AjaxResult.success(userService.updateUser(user)); } DeleteMapping(/{id}) public AjaxResult remove(PathVariable Long id) { return AjaxResult.success(userService.deleteUserById(id)); } }GetMapping(/list) PostMapping PutMapping DeleteMapping(/{id})注解详解把普通的 Java 方法变成了能通过网址调用的 API每条注解对应一种“动作 地址”的组合浏览器/Postman/前端都能直接访问返回值统一用 AjaxResult 包成 JSON。2.Service 层业务逻辑创建编写业务逻辑比如校验、调用多个 Mapper、事务管理等。当前我们只是简单转调 Mapper在ruoyi中的路径接口文件UserService.java实现package com.ruoyi.system.service; import java.util.List; import com.ruoyi.system.domain.User; //声明方法不实现逻辑 public interface UserService { User selectUserById(Long id); ListUser selectUserList(User user); int insertUser(User user); int updateUser(User user); int deleteUserById(Long id); } //在control层注入的就是这个但是实际上运行的是UserServiceImpl此文件只作为一个接口实体serServiceImpl.java实现package com.ruoyi.system.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.system.mapper.UserMapper; import com.ruoyi.system.domain.User; import com.ruoyi.system.service.UserService; Service public class UserServiceImpl implements UserService { Autowired private UserMapper userMapper; Override public User selectUserById(Long id) { return userMapper.selectUserById(id); } Override public ListUser selectUserList(User user) { return userMapper.selectUserList(user); } Override public int insertUser(User user) { return userMapper.insertUser(user); } Override public int updateUser(User user) { return userMapper.updateUser(user); } Override public int deleteUserById(Long id) { return userMapper.deleteUserById(id); } }在这个service层中userservice只作为接口进行方法的声明实际调用和运作的是serServiceImpl它实现了UserService接口的 5 个方法Spring 启动时会自动生成代理并注入到 Controller并调用了UserMapperDAO完成 SQL 执行。注解详解Service告诉 Spring“这是业务 Bean”可被Autowired注入Override表明是接口方法的实现编译器会帮你检查拼写/参数3.Mapper 层数据库操作创建Mapper 层直接操作数据库。SQL 写在 XML 文件里Java 代码通过接口调用。在ruoyi中的路径Mapper接口usermapper实现package com.ruoyi.system.mapper; import java.util.List; import com.ruoyi.system.domain.User; public interface UserMapper { User selectUserById(Long id); ListUser selectUserList(User user); int insertUser(User user); int updateUser(User user); int deleteUserById(Long id); }Mapper.xml 文件实现具体要放在src/main/resources/mapper/system/UserMapper.xml?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.ruoyi.system.mapper.UserMapper resultMap idUserResult typecom.ruoyi.system.domain.User id propertyid columnid/ result propertyname columnname/ result propertyage columnage/ result propertysex columnsex/ result propertycreateTime columncreate_time/ /resultMap select idselectUserById resultMapUserResult SELECT * FROM mybatis.user WHERE id #{id} /select select idselectUserList resultMapUserResult SELECT * FROM mybatis.user where if testname ! null and name ! AND name LIKE CONCAT(%, #{name}, %) /if /where /select insert idinsertUser parameterTypeUser INSERT INTO mybatis.user (name, age, sex, create_time) VALUES (#{name}, #{age}, #{sex}, NOW()) /insert update idupdateUser parameterTypeUser UPDATE mybatis.user SET name #{name}, age #{age}, sex #{sex} WHERE id #{id} /update delete iddeleteUserById DELETE FROM mybatis.user WHERE id #{id} /delete /mapper这里的mapper中接口只定义方法签名 → 编译期类型安全、可被 Spring 注入。而XML给出 SQL 文本、参数、结果映射 → 运行期由 MyBatis 解析。xml做了什么为什么mapper层要牵扯到resource中的xmlusermapper依然相当于是接口XML 是 Mapper 层的“SQL 实现体”当 Java 代码调用哪个方法时应该去数据库执行哪条 SQL、怎么传参、怎么封装结果resources 是“唯一能被 Maven 打包进 classpath 的目录”。把 XML 放 resources 下MyBatis 才能在运行时找到它把接口方法真正“粘”到 SQL 上。4.Domain 层实体类创建用于封装数据库表中的一行数据。Controller、Service、Mapper 都会使用这个类。在ruoyi中的路径user.java实现package com.ruoyi.system.domain; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.domain.BaseEntity; public class User extends BaseEntity { private static final long serialVersionUID 1L; private Long id; private String name; private Integer age; private String sex; JsonFormat(pattern yyyy-MM-dd HH:mm:ss) private Date createTime; // Getter 和 Setter public Long getId() { return id; } public void setId(Long id) { this.id id; } public String getName() { return name; } public void setName(String name) { this.name name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex sex; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime createTime; } }这是 MyBatis 的“数据实体”把数据库一行记录变成 Java 对象把 Java 对象变成 JSON是整个 CURD 流程的数据载体。5.回看总体我们通常在ruoyi-admin 模块实现接口入口 Controller。在ruoyi-system 模块实现主要逻辑。以下可以从总体上看到上述实施后的CSMD的关系三.安全机制调整Postman 测试/system/user/list [添加用户信息需传较多参数故测试查询接口]修改如下代码屏蔽Spring Security 相关安全防护策略和检测。因为ruoyi或者idea的版本不同在实现上会有一些区别和改变此处以idea2025.2.2和ruoyi3.9为例在src/main/java/com/ruoyi/framework/config/SecurityConfig.java中添加在src/main/java/com/ruoyi/web/controller/system/SysUserController.java中注释掉在src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java中注释掉四.postman进行测试示例