Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发

[网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发

作者头像
椰椰椰耶
发布于 2025-05-29 00:55:14
发布于 2025-05-29 00:55:14
9000
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

数据库

数据库设计

完成注册登录以及用户分数管理

  • 使用数据库来保存上述用户信息

创建 java_gobang 数据库, user 表,表示用户信息和分数信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create database if not exists java_gobang;  
  
use java_gobang;  
  
drop table if exists user;  
create table user (  
    userId int primary key auto_increment,  
    username varchar(50) unique,  
    password varchar(50),  
    score int,         -- 天梯积分  
    totalCount int,    -- 比赛总场数  
    winCount int       -- 获胜场数  
);  
  
insert into user values (null, 'zhangsan', '123', 1000, 0, 0);  
insert into user values (null, 'lisi', '123', 1000, 0, 0);  
insert into user values (null, 'wangwu', '123', 1000, 0, 0);

配置 MyBatis

使用 MyBatis 来连接并操作我们的数据库

1. Spring 配置

修改 Spring 的配置文件,使用数据库可以被连接上

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:  
  application:  
    name: java_gobang  
  
  datasource:  
    url: jdbc:mysql://127.0.0.1:3306/java_gobang?characterEncoding=utf8&useSSL=false  
    username: root  
    password: 20230153018  
    driver-class-name: com.mysql.cj.jdbc.Driver  
  
mybatis:  
  mapper-locations: classpath:mapper/**Mapper.xml
  • 如果 driver-class-name 报错,可能是没有引入 Maven 依赖的原因
2. 创建实体类

创建一个实体类:用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.example.model;  
  
public class User {  
    private int userId;  
    private String username;  
    private String password;  
    private int score;  
    private int totalCount;  
    private int winCount;  
  
    public int getUserId() {  
        return userId;  
    }  
  
    public void setUserId(int userId) {  
        this.userId = userId;  
    }  
  
    public String getUsername() {  
        return username;  
    }  
  
    public void setUsername(String username) {  
        this.username = username;  
    }  
  
    public String getPassword() {  
        return password;  
    }  
  
    public void setPassword(String password) {  
        this.password = password;  
    }  
  
    public int getScore() {  
        return score;  
    }  
  
    public void setScore(int score) {  
        this.score = score;  
    }  
  
    public int getTotalCount() {  
        return totalCount;  
    }  
  
    public void setTotalCount(int totalCount) {  
        this.totalCount = totalCount;  
    }  
  
    public int getWinCount() {  
        return winCount;  
    }  
  
    public void setWinCount(int winCount) {  
        this.winCount = winCount;  
    }  
}
3. 创建 Mapper 接口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.example.model;  
  
/**  
 * 接口里面创建一些典型的方法  
 */  
public interface UserMapper {  
    // 往数据库中插入一个用户,用于注册功能  
    void insert(User user);  
  
    // 根据用户名,来查询用户的详细信息,用于登录功能  
    User selectByName(String userName);  
}
4. 使用 MyBatis

实现 MyBatis 的相关 xml 配置文件,来自动实现数据库操作

实现 UserMapper.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
<mapper namespace="org.example.java_gobang.model.UserMapper">  
    <insert id="insert">  
        insert into user values(null, #{username}, #{password}, 1000, 0, 0);  
    </insert>  
  
    <select id="selectByName" resultType="org.example.java_gobang.model.User">  
        select * from user where username = #{username};  
    </select>  
</mapper>

约定前后端交互接口

登录接口

请求:

  • POST /login HTTP/1.1
  • Content-Type: application/x-222-form-urlencoded
  • username=zhangsan&password=123

响应:

  • HTTP/1.1 200 OK
  • Content-Type: application/json { userId: 1, username: ‘zhangsan’, score: 1000, totalCount: 0, winCount: 0 }
  • 如果登录失败,就返回一个无效的 user 对象
    • 比如,这里的每个属性都是空着的,像 userId => 0

注册接口

请求:

  • POST /register HTTP/1.1
  • Content-Type: application/x-www-form-urlencoded
  • username=zhangsan&password=123

响应:

  • HTTP/1.1 200 OK
  • Content-Type: application/json { userId: 1, username: ‘zhangsan’, score: 1000, totalCount: 0, winCount: 0 }

前后端交互的接口,在约定的时候,是有很多种交互方式的

  • 这里约定好了之后,后续的后端/前端代码,都要严格地遵守这个约定来写代码

获取用户信息

服务器获取到当前登录用户的信息

  • 程序运行过程中,用户登录了之后,让客户端随时通过这个接口,来访问服务器,获取到自身的信息

请求:

  • GET /userInfo HTTP/1.1

响应:

  • HTTP/1.1 200 OK
  • COntent-Type: application/json { userId: 1, username: ‘zhangsan’, score: 1000, totalCount: 0, winCount: 0 }

服务器开发

创建 api.UserAPI 类,主要实现三个方法:

  • login:用来实现登录逻辑
  • register:用来实现注册逻辑
  • getUserInfo:用来实现登录成功后显示用户分数的信息

login

在登录的时候,我们要做的关键操作就是:

  • 根据用户传进来的 username,去数据库里面查一下,看查到的结果能不能和传入进来的 password 匹配
    • 匹配:登陆成功
    • 不匹配:登录失败
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@PostMapping("/login")  
@ResponseBody  
public Object login(String username, String password, HttpServletRequest req) {  
    // 关键操作,就是根据 username 去数据库中进行查找,  
    // 如果能找到匹配的用户,并且密码也一直,就认为登录成功  
    User user = userMapper.selectByName(username); 
    System.out.println("[login] username=" + username);  
    if (user == null || !user.getPassword().equals(password)) {  
        // 登录失败  
        System.out.println("登录失败!");  
        return new User();  
    }  
    HttpSession httpSession = req.getSession(true);  
    httpSession.setAttribute("user", user);  
    return user;  
}
  • HttpServletRequest:可以通过这个对象获取或创建 Session,以及访问其他 HTTP 属性
  • getSession(true)
    • 如果当前请求中没有带上已有的 Session ID,或者 Session 已过期,就会创建一个新的 HttpSession 对象
    • 如果存在有效的 Session,会返回当前 Session
  • getSession(false)
    • 如果当前请求没有有效的 Session,会返回 null,不会创建新的 Session
  • httpSession.setAttribute("user", user)
    • Session 保存一项属性,键是 “user”,值是当前登录的用户对象
    • 保存后,在接下来的任何请求中,只要该用户带着同一个 Session ID(通常通过 cookie 自动携带),就能取出这个对象

register

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@PostMapping("/register")  
@ResponseBody  
public Object register(String username, String password) {  
    try {  
        User user = new User();  
        user.setUsername(username);  
        user.setPassword(password);  
        userMapper.insert(user);  
        return user;  
    }catch (org.springframework.dao.DuplicateKeyException e) {  
        User user = new User();  
        return user;  
    }  
}
  • } catch (org.springframework.dao.DuplicateKeyException e) {
    • 如果数据库表中设置了 username 为唯一索引(UNIQUE),当插入一个已存在的用户名时会抛出此异常
    • 这个异常来自 SpringDataAccessException 系列,专门处理数据库层的错误

getUserInfo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping("/userInfo")  
@ResponseBody  
public Object getUserInfo(HttpServletRequest req) {  
    try {  
        HttpSession httpSession = req.getSession(false);  
        User user = (User) httpSession.getAttribute("user");  
        return user;  
    }catch (NullPointerException e) {  
        return new User();  
    }  
}

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.example.java_gobang.api;  
  
import jakarta.annotation.Resource;  
import jakarta.servlet.http.HttpServletRequest;  
import jakarta.servlet.http.HttpSession;  
import org.example.java_gobang.model.User;  
import org.example.java_gobang.model.UserMapper;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.ResponseBody;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class UserAPI{  
  
    @Resource  
    private UserMapper userMapper;  
  
    @PostMapping("/login")  
    @ResponseBody  
    public Object login(String username, String password, HttpServletRequest req) {  
        // 关键操作,就是根据 username 去数据库中进行查找,  
        // 如果能找到匹配的用户,并且密码也一直,就认为登录成功  
        User user = userMapper.selectByName(username);  
        System.out.println("[login] username=" + username);  
        if (user == null || !user.getPassword().equals(password)) {  
            // 登录失败  
            System.out.println("登录失败!");  
            return new User();  
        }  
        HttpSession httpSession = req.getSession(true);  
        httpSession.setAttribute("user", user);  
        return user;  
    }  
  
    @PostMapping("/register")  
    @ResponseBody  
    public Object register(String username, String password) {  
        try {  
            User user = new User();  
            user.setUsername(username);  
            user.setPassword(password);  
            userMapper.insert(user);  
            return user;  
        }catch (org.springframework.dao.DuplicateKeyException e) {  
            User user = new User();  
            return user;  
        }  
    }  
  
    @GetMapping("/userInfo")  
    @ResponseBody  
    public Object getUserInfo(HttpServletRequest req) {  
        try {  
            HttpSession httpSession = req.getSession(false);  
            User user = (User) httpSession.getAttribute("user");  
            return user;  
        }catch (NullPointerException e) {  
            return new User();  
        }  
    }  
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SASS相关知识
Sass(Syntactically Awesome Style Sheets)是一种CSS预处理器,用于增强CSS的功能和灵活性。它扩展了CSS,并引入了许多有用的功能,如变量、嵌套、混合、继承以及模块化的结构。
FGGIT
2024/12/20
1400
前端架构师技术之Sass
CSS 仅仅是一个标记语言,不是编程语言,因此不可以自定义变量,也不可以引用。CSS 主要有以下缺点。
张哥编程
2024/12/13
1090
【Sass/SCSS】预加载器中的“轩辕剑”
博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 随着前端技术发展的越来越迅速,前端的样式也需要更加贴近时代的审美,那么CSS就需要承担更多的工作,(强调!这不是煽情!这是宣讲背景。😄),为了给CSS怼上去,预加载器出现了,没错,CSS用上了武器。Sass/SCSS——预加载器中的“轩辕剑”,这也不是我帮它吹,是它自己说的,下图为例。 官网地址:SASS中文网 什么是Sass,它与SCSS是啥关系 感觉这里有点绕,这是怎么回事,
用户4268038
2021/11/18
8620
CSS预处理器入门:Sass/SCSS的实用指南
随着网页开发越发复杂,CSS 的可维护性也越显重要,但在 CSS 语法仍然受限的状况下,发展出了 CSS Preprocessor(CSS 预处理器)来扩展更多的写法。
写bug的高哈哈
2025/01/26
3730
CSS预处理器入门:Sass/SCSS的实用指南
CSS预处理器的对比 — sass、less和stylus
本文根据Johnathan Croom的《sass vs. less vs. stylus: Preprocessor Shootout》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://net.tutsplus.com/tutorials/html-css-techniques/sass-vs-less-vs-stylus-a-preprocessor-shootout/,以及作者相关信息 ——作者:Johnathan Croom
laixiangran
2018/04/11
4.7K0
CSS预处理器的对比 — sass、less和stylus
Sass常用语法
选择所有跟在article后的同层article元素,不管它们之间隔了多少其他元素:
码客说
2024/07/26
1280
如何使用SASS编写可重用的CSS
Sass 是一个CSS预处理程序,至今使用广泛,它之所以流行,是因为它修复了几个CSS缺陷:
前端小智@大迁世界
2022/06/15
8K0
如何使用SASS编写可重用的CSS
Sass(Scss)、Less的区别与选择 + 基本使用
Sass(Scss)、Less 都是 CSS 预处理器,他们定义了一种新的语言,其基本思想是,用一种专门的编程语言为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行 CSS 的编码工作。
老猫-Leo
2023/12/11
1.9K0
前端入门23-CSS预处理器(Less&Sass)声明正文-CSS预处理(less&Sass)
这里就讲讲这两个问题,写过 CSS 应该就会比较清楚,虽然我才刚入门,但在写一些练手时就已经有点感觉了:写 CSS 后,很难维护,维护基本要靠注释来,而且由于 HTML 文档中标签的嵌套层次复杂,导致写 CSS 的选择器时也很费劲,尤其是在后期为某部分标签新增样式时,总会不知道到底应该在 CSS 文件中哪里写这个选择器,这个选择器是否会与前面冲突。
请叫我大苏
2018/12/26
1.7K0
Sass/SCSS 简明入门教程
Sass(Syntactically Awesome StyleSheets) 是 CSS 的一种扩展,是 CSS的 超集(通过编译生成浏览器可以处理传统 CSS)。Sass 的出现是为了解决在大型项目中传统 CSS 会遇到的重复、可维护性差等问题(添加了嵌套的规则、变量、mixins、选择器继承等特性)。让开发者可以编写简洁、富语意(expressive )、可复用、可维护性和可延展性性佳的 CSS 代码。
疯狂的技术宅
2021/03/16
3K0
Sass/Scss、Less 是什么?
Sass (Syntactically Awesome Stylesheets) 是一种动态样式语言,Sass 语法属于缩排语法,比 css 比多出好些功能 (如变量、嵌套、运算,混入 (Mixin)、继承、颜色处理,函数等),更容易阅读。
CRMEB商城源码
2022/08/02
1.3K0
Sass:强大而灵活的CSS预处理器详解
在前端开发的世界里,CSS(层叠样式表)作为样式描述语言,为我们提供了丰富的样式定义和布局方式。然而,随着项目规模的不断扩大和复杂度的提升,原生CSS的编写和维护逐渐变得繁琐。为了解决这个问题,Sass(Syntactically Awesome Stylesheets)作为CSS的预处理器应运而生,它为我们提供了许多强大的功能和工具,使得CSS的编写更加高效和灵活。
九转成圣
2024/05/14
4250
CSS 预编译语言 Sass 快速入门教程
CSS 作为一门样式语言,语法简单,易于上手,但是由于不具备常规编程语言提供的变量、函数、继承等机制,因此很容易写出大量没有逻辑、难以复用和扩展的代码,在日常开发使用中,如果没有完善的编码规范,编写的 CSS 代码会非常冗余且难以维护。
学院君
2020/10/30
7.4K0
CSS 预编译语言 Sass 快速入门教程
Sass 快速入门学习
  众所周知css并不能算是一们真正意义上的“编程”语言,它本身无法未完成像其它编程语言一样的嵌套、继承、设置变量等工作。
笔阁
2018/09/04
1.2K0
Sass 快速入门学习
Sass-学习笔记【基础篇】
最下边附结构图 在线编辑器网址如下:http://sassmeister.com/  注意编写的时候,符号千万别用了中文的:、;、。...之类的,会报错,Sass也转换不成css。 less和sass的区别: 博客园文章—http://www.cnblogs.com/wangpenghui522/p/5467560.html 本章主要内容:变量 、混合宏 、继承 、占位 、插值 、运算 、数据类型 1:定义 Sass是css预处理器的一种,也是最早的css预处理语言。Sass采用Ruby语言编写,为css增
xing.org1^
2018/05/17
5.1K0
sass 基础——回顾
1.webstorm 自动编译SASS   下载安装包 http://rubyinstaller.org/downloads/   然后点击安装,路径为默认路径就行, 勾选以下两项     add Ruby executables to your PATH     Associate .rb and rbw files with this Ruby information   安装完,打开命令行 输入 gem install sass   webstorm 配置 点击setting选择tool下的f
用户1197315
2018/01/22
1.1K0
sass 基础——回顾
vue2.0以上版本安装sass(scss)
1、异同:1)简言之可以理解scss是sass的一个升级版本,完全兼容sass之前的功能,又有了些新增能力。语法形式上有些许不同,最主要的就是sass是靠缩进表示嵌套关系,scss是花括号
IT工作者
2022/02/17
2.7K0
SASS详解@mixins/@include/@extend/@at-root
Sass 支持所有CSS3的 @规则,以及一些已知的其他特定的Sass "指令"。这些在 Sass 都有对应的效果,更多资料请查看 控制指令 (control directives) 。今天重点讲mixins/include/extend
周陆军博客
2023/05/14
1.2K0
【Sass学习笔记】001-Sass简介
CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行编码工作。
訾博ZiBo
2025/01/06
1720
Sass 基础(一)
  css 是一些非常简单得语句的组合,既然简单的语句,就不可避免的有很多重复的,冗余的东西,而且没有传统 编程语言变量,控制语句等高级特性,所以造成了css 编写低效,往往需要查找替换,大量复制来修改或者编写。Sass 是用 弥补这些缺陷的,使开发更加的方便快捷,更加方便管理。   1.Sass和SCSS的区别。     文件扩展名不同,Sass 是以“.sass”后缀为扩展名,而 SCSS 是以“.scss”后缀为扩展名     语法书写方式不同,Sass 是以严格的缩进式语法规则来书写,不带
用户1197315
2018/01/19
8280
相关推荐
SASS相关知识
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验