阅读前请先下载项目源码,边读边看源码以加深理解和实操,
源码地址已放于文章末尾!
效果预览:





03-用户模块-君从何处来?
地基打好,图纸到位,是时候开始搬砖砌墙了!从这一章开始,咱们正式进入后端代码的“深水区”。按照惯例,任何一个系统,我们都从最基础也是最重要的模块开始——用户模块。毕竟,系统是给人用的,没有用户,一切都是白搭。
咱们的目标很明确:让我们的Java代码能够连接上之前创建的数据库,并对user表进行“增删改查”(CRUD)操作。
第一步:让项目“认识”数据库
我们的项目现在还是个“睁眼瞎”,根本不知道数据库在哪。所以,我们得先给它“配一副眼镜”——配置数据库连接信息。
打开 src/main/resources/application.properties 文件,把里面的内容替换成下面的:
# 服务器端口号
server.port=8080
# 数据库连接配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/weke_learning?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=your_password # 记得换成你自己的数据库密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# MyBatis-Plus 配置
mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
划重点!
server.port=8080:指定了我们后端服务的端口是8080。spring.datasource.url:这是数据库的“地址”,127.0.0.1:3306是本地MySQL的默认地址和端口,weke_learning是我们上一章创建的数据库名。spring.datasource.username和spring.datasource.password:这是你的数据库用户名和密码,一定要换成你自己的!mybatis-plus.configuration.log-impl:这行配置非常有用!它能让我们在控制台清晰地看到MyBatis-Plus执行的每一条SQL语句,是排查数据库问题的“照妖镜”。
第二步:创建代码的“四层洋房”
一个好的后端项目,代码结构一定要清晰。我们通常会采用经典的分层架构,就像盖一栋四层的小洋房,每一层各司其职,互不干扰。
来,在 com.weke.learningsystem 这个包下,创建下面这四个新的包(package):
entity:实体层(The Ground Floor - 地基/模型)。存放和数据库表一一对应的Java类。mapper:数据访问层(The First Floor - 负责搬运数据)。直接和数据库打交道,定义数据的增删改查接口。service:业务逻辑层(The Second Floor - 负责加工处理)。处理具体的业务需求,比如“用户注册时密码要加密”、“查询用户列表时要分页”等。controller:接口暴露层(The Top Floor - 负责接待客人)。把内部的功能,通过API接口的形式暴露给前端调用。
创建好之后,我们的项目结构看起来应该是这样的:
第三步:砌墙-编写各层代码
“洋房”的框架搭好了,现在我们从底向上,一层一层地把它盖起来。
1. Entity - 定义用户实体
在 entity 包下创建一个 User.java 类。这个类就是我们user表的“Java版”,表里有啥字段,这里就定义啥属性。
package com.weke.learningsystem.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.sql.Timestamp;
@Data
@TableName("user")
public class User {
private Long id;
private String username;
private String password;
private String role;
private Timestamp createdAt;
}
代码解读:
@Data:这是Lombok的注解,它在编译时会自动帮我们生成get/set/toString等一大堆方法,让代码瞬间清爽!@TableName("user"):这是MyBatis-Plus的注解,告诉框架这个User类对应的是数据库里的user表。
2. Mapper - 创建数据访问接口
在 mapper 包下创建一个 UserMapper.java 接口。注意,是接口(Interface)不是类(Class)。
package com.weke.learningsystem.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.weke.learningsystem.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
代码解读:
@Mapper:告诉Spring Boot,这是一个MyBatis的Mapper接口,交给Spring来管理。extends BaseMapper<User>:这是精髓! 我们只需要继承MyBatis-Plus提供的BaseMapper,它里面已经内置了十几种常用的单表操作方法(比如insert,deleteById,selectById,selectList等),我们一个方法都不用写,就能拥有强大的CRUD能力!这就是“站在巨人的肩膀上”。
3. Service - 编写业务逻辑
在 service 包下先创建一个 UserService.java 接口,再创建一个它的实现类 UserServiceImpl.java。
UserService.java (接口):
package com.weke.learningsystem.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.weke.learningsystem.entity.User;
public interface UserService extends IService<User> {
// 以后可以扩展我们自己的业务方法
}
UserServiceImpl.java (实现类):
package com.weke.learningsystem.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.weke.learningsystem.entity.User;
import com.weke.learningsystem.mapper.UserMapper;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 同样,继承了ServiceImpl后,就拥有了大部分通用的业务方法
}
代码解读:
@Service:告诉Spring Boot,这是一个服务类。extends ServiceImpl<UserMapper, User>:和Mapper层类似,MyBatis-Plus也为我们提供了ServiceImpl,继承它,我们就自动拥有了CRUD的业务逻辑能力,无需重复造轮子。
4. Controller - 暴露API接口
最后,在 controller 包下创建 UserController.java。
package com.weke.learningsystem.controller;
import com.weke.learningsystem.entity.User;
import com.weke.learningsystem.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
// 获取所有用户
@GetMapping
public List<User> getAllUsers() {
return userService.list();
}
// 根据ID获取用户
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getById(id);
}
// 创建新用户
@PostMapping
public boolean createUser(@RequestBody User user) {
// 实际项目中,密码需要加密存储
return userService.save(user);
}
}
代码解读:
@RestController:表明这是一个RESTful风格的控制器,它返回的数据会自动转换成JSON格式。@RequestMapping("/users"):定义了这个控制器下所有接口的公共路径前缀,比如访问所有用户的URL就是http://localhost:8080/users。@Autowired:自动注入我们写好的UserService,这样我们就能调用它的方法了。@GetMapping,@PostMapping:分别定义了处理HTTP GET和POST请求的方法。@GetMapping("/{id}")中的{id}表示这是一个路径参数。@RequestBody和@PathVariable:分别用于从请求体和请求路径中获取参数。
见证奇迹的时刻 - 测试接口
好了,我们“四层洋房”已经盖完。是时候检验成果了!
重新运行我们的 LearningSystemApplication。然后打开一个API测试工具(比如 Postman 或 Apifox),我们来测试一下:
-
创建用户:
- 请求方式:
POST - URL:
http://localhost:8080/users - 请求体 (Body -> raw -> JSON):
{ "username": "zhangsan", "password": "123", "role": "student" } - 点击发送,如果返回
true,恭喜你,数据已经成功插入数据库了!
- 请求方式:
-
查询所有用户:
- 请求方式:
GET - URL:
http://localhost:8080/users - 点击发送,你应该能看到一个包含刚刚创建的“zhangsan”用户的JSON数组。
- 请求方式:
到这里,我们已经成功打通了从 Controller -> Service -> Mapper -> 数据库 的整条链路!这是后端开发中至关重要的一步!
下一期预告: 现在的用户注册和登录还处于“裸奔”状态,密码明文存储,谁都能访问接口,这绝对是线上事故级别的漏洞!下一章,我们将引入JWT和Spring Security,为我们的系统穿上“防弹衣”,实现安全可靠的用户认证!刺激的要来了,千万别走开!
源码下载地址:
https://download.youkuaiyun.com/download/THMAIL/91753658

1064

被折叠的 条评论
为什么被折叠?



