手把手教你写项目之中小学微课学习系统(三):用户模块

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

效果预览:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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.usernamespring.datasource.password:这是你的数据库用户名和密码,一定要换成你自己的!
  • mybatis-plus.configuration.log-impl:这行配置非常有用!它能让我们在控制台清晰地看到MyBatis-Plus执行的每一条SQL语句,是排查数据库问题的“照妖镜”。

第二步:创建代码的“四层洋房”

一个好的后端项目,代码结构一定要清晰。我们通常会采用经典的分层架构,就像盖一栋四层的小洋房,每一层各司其职,互不干扰。

来,在 com.weke.learningsystem 这个包下,创建下面这四个新的包(package):

  1. entity:实体层(The Ground Floor - 地基/模型)。存放和数据库表一一对应的Java类。
  2. mapper:数据访问层(The First Floor - 负责搬运数据)。直接和数据库打交道,定义数据的增删改查接口。
  3. service:业务逻辑层(The Second Floor - 负责加工处理)。处理具体的业务需求,比如“用户注册时密码要加密”、“查询用户列表时要分页”等。
  4. controller:接口暴露层(The Top Floor - 负责接待客人)。把内部的功能,通过API接口的形式暴露给前端调用。

创建好之后,我们的项目结构看起来应该是这样的:

com.weke.learningsystem
controller
service
mapper
entity
LearningSystemApplication.java

第三步:砌墙-编写各层代码

“洋房”的框架搭好了,现在我们从底向上,一层一层地把它盖起来。

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),我们来测试一下:

  1. 创建用户:

    • 请求方式: POST
    • URL: http://localhost:8080/users
    • 请求体 (Body -> raw -> JSON):
      {
          "username": "zhangsan",
          "password": "123",
          "role": "student"
      }
      
    • 点击发送,如果返回 true,恭喜你,数据已经成功插入数据库了!
  2. 查询所有用户:

    • 请求方式: GET
    • URL: http://localhost:8080/users
    • 点击发送,你应该能看到一个包含刚刚创建的“zhangsan”用户的JSON数组。

到这里,我们已经成功打通了从 Controller -> Service -> Mapper -> 数据库 的整条链路!这是后端开发中至关重要的一步!

下一期预告: 现在的用户注册和登录还处于“裸奔”状态,密码明文存储,谁都能访问接口,这绝对是线上事故级别的漏洞!下一章,我们将引入JWTSpring Security,为我们的系统穿上“防弹衣”,实现安全可靠的用户认证!刺激的要来了,千万别走开!

源码下载地址:
https://download.youkuaiyun.com/download/THMAIL/91753658

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值