SpringBoot(三)SpringBoot搭建简单服务端

news2024/11/17 22:32:33

    之前的两篇文章介绍了如何使用ItelliJ社区版创建SpringBoot项目以及SpringBoot的starter。本篇,介绍下如何使用SpringBoot搭建一个简单的服务端,实现一个新用户注册的场景,供前端和移动端去使用。本篇需要你对SpringBoot的starter,mysql,jpa等有一些基本的了解。不过即使你没有任何的基础,直接跟着我的步骤来也是ok的。

目录

一、导入starter和mysql

二、创建Dao类

三、创建JpaRepository

四、创建返回对象类RegisterResult

五、实现Controller

六、创建数据库和表

七、SpringBoot连接mysql数据库

八、运行项目并测试

九、可能遇到的问题


一、导入starter和mysql

    上篇介绍过spring-boot-starter-web,既然是服务端,我们依然需要导入它,在这里不再赘述。然后,导入mysql,因为我们接受到新用户的注册信息后,需要持久化到数据库,在这里我们使用mysql。此外,java程序需要跟mysql数据库交互,大学课程上我们是使用JDBC,大家应该都很熟悉。但是,在这里我们使用JPA(一种ORM规范,用来解决面向对象和关系数据库不匹配问题),导入spring-boot-starter-data-jpa。

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<scope>runtime</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

二、创建Dao类

    Dao做java后端的同学肯定都很熟悉,Android也有一个非常优秀的ORM框架GreenDao。上面也提到过,ORM是为了解决对象和关系数据库的映射问题,因此需要注意:Dao类的表名和字段名需要跟后面在mysql创建的表名和字段名一致。

@Entity
@Table(name="user_info")
public class UserDao {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer userId;
    @Column(name = "user_name")
    private String userName;
    @Column(name = "user_password")
    private String userPassword;
    @Column(name = "user_phone")
    private String userPhone;
    @Column(name = "user_token")
    private String userToken;
    @Column(name = "user_register_time")
    private String userRegisterTime;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public String getUserPhone() {
        return userPhone;
    }

    public void setUserPhone(String userPhone) {
        this.userPhone = userPhone;
    }

    public String getUserToken() {
        return userToken;
    }

    public void setUserToken(String userToken) {
        this.userToken = userToken;
    }

    public String getUserRegisterTime() {
        return userRegisterTime;
    }

    public void setUserRegisterTime(String userRegisterTime) {
        this.userRegisterTime = userRegisterTime;
    }
}

三、创建JpaRepository

    使用JPA,我们只需要定义一个接口就可以轻松地操作数据库,不用写SQL,这个接口继承JpaRepository接口。JpaRepository接口已经提供了几乎非常全面的增删改查方法,自定义的Repository主要是去实现自定义的一些增删改查方法,比如如下示例中的通过用户名和token去查询:

@Repository
public interface UserRepository extends JpaRepository<UserDao,Integer> {

    public UserDao findByUserName(String userName); //通过UserName查询

    public UserDao findByUserToken(String token);//通过UserToken查询
}

四、创建返回对象类RegisterResult

    客户端访问服务端,服务端需要返回数据。如下示例中,code可以表示状态码(例如200),status表示注册成功或失败(例如fail),msg则是附加的信息(例如因用户名重复注册失败)。因为是个demo,暂时我们就这么些。

public class RegisterResult {
    private int code;
    private String status;
    private String msg;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

五、实现Controller

    请求API的实现在controller中,我实现了简单的注册逻辑,附带基本的校验。注册成功后,会把新用户的信息写入mysql数据库:

@RestController
public class RegisterController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping("register")
    public RegisterResult register(String name, String phone, String password) {
        int code = 0;
        String status = "未知状态";
        String msg = "未知信息";
        String token = "";
        RegisterResult registerResult = new RegisterResult();
        if (TextUtils.isEmpty(name)) {
            status = "fail";
            msg = "用户名不能为空";
        } else if (TextUtils.isEmpty(phone)) {
            status = "fail";
            msg = "手机号不能为空";
        } else if (TextUtils.isEmpty(password)) {
            status = "fail";
            msg = "密码不能为空";
        } else if (userRepository.findByUserName(name) != null) {
            status = "fail";
            msg = "用户名已存在";
        } else {
            status = "success";
            msg = "注册成功";
            addUser(name, phone, password);
        }

        registerResult.setCode(code);
        registerResult.setStatus(status);
        registerResult.setMsg(msg);
        return registerResult;
    }

    /**
     * 添加用户
     *
     * @param name     name
     * @param password password
     * @param phone    phone
     */
    public void addUser(String name, String password, String phone) {
        UserDao userDao = new UserDao();
        userDao.setUserName(name);
        userDao.setUserPassword(password);
        userDao.setUserPhone(phone);
        java.sql.Date date = new Date(System.currentTimeMillis());
        userDao.setUserRegisterTime(date + "");
        userRepository.save(userDao);
    }
}

六、创建数据库和表

    在这里我使用mysql workbench建表,在此不详细介绍如何使用mysql workbench。特别需要注意的是,user_id设置主键,设置自增。如下:

七、SpringBoot连接mysql数据库

    在application.properties文件中,增加如下配置:

spring.datasource.url=jdbc:mysql://localhost:3306/android_server?&useSSL=false
spring.datasource.username=root
spring.datasource.password=888888
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

八、运行项目并测试

    运行项目,在浏览器中输入:http://localhost:8080/register?name=hello&phone=19999999999&password=123456

 ​​

    查看mysql数据库,看是否成功写到表里: 

九、可能遇到的问题

1、java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)。检查数据库用户名或密码是否拼写错误。

2、com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure。数据库端口号不对,mysql通常是3306。 

    简单总结一下,本篇介绍了如何通过ItelliJ社区版创建的SpringBoot项目搭配mysql和jpa搭建简单的服务端,去模拟实现新用户注册这样的场景。也整理了新手在开发和配置过程中可能遇到的一些问题,希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/705588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于LLM构建文本生成系统

背景&#xff1a; 在流量存量时代&#xff0c;内容运营重要性不言而喻。在流量时代&#xff0c;内容可以不要过于多样化和差异化&#xff0c;只需要有足够多的人流量&#xff0c;按流量转化比率来看&#xff0c;1000个人有1%概率转化&#xff0c;素材不变只要增加足够多的流量…

SpringSecurity之概述

概述 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff1b; 是一个专注于为Java应用程序提供身份验证和授权的框架 核心功能 1.认证 2.验证 3.攻击防范 原理解析 SpringSecurity 采用的是责任链的设计模式&#xff0c;它有一条很长的过滤器链&#xff1b; WebAsy…

探索分治算法:解决复杂问题的有效策略

目录 引言&#xff1a; 一. 基本原理&#xff1a; 二. 适用场景&#xff1a; 三. 分治算法的步骤&#xff1a; 四. 示例&#xff1a;归并排序算法 五. 优缺点&#xff1a; 引言&#xff1a; 在计算机科学中&#xff0c;分治算法是一种在解决复杂问题时常被使用的有效策略…

OBU协议-【CWAVE 客户端接口使用手册】Protobuf-CWAVEII版

1. 说明 (Instruction) 本文档针对所有在 OBU上位机进行开发的客户端程序 上位机进行开发的客户端程序 。开发时需使用者 使用谷歌提供的 protobuf工具结合我公司提供的 nebulalink.servercwaveii.proto文 件进行开发。 Protobuf相关介绍&#xff1a; https://www.ibm.com/deve…

springcloud笔记一

涉及到的技术: 单体架构:将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署 所以需要远程调用 注册中心:可以维护每个节点的信息&#xff0c;并且监护节点的状态 配置中心:管理微服务群的配置 服务网关:用户通过服务网关作为入口访问&#xff0c;然后通过路由到…

【三维重建】【深度学习】NeRF_Pytorch代码--预备基础知识

【三维重建】【深度学习】NeRF_Pytorch代码–预备基础知识 给定一个场景的多视角的图像&#xff0c;神经辐射场&#xff08;NeRF&#xff09;通过图像重建误差优化一个神经场景表征&#xff0c;优化后可以实现逼真的新视角合成效果。NeRF最先是应用在新视点合成方向&#xff0c…

TrainingOperator--PyTorchJob实现机制分析

前言 由 Pytorch分布式训练&#xff08;一&#xff09;_chenxy02的博客-CSDN博客 可知Pytorch分布式训练实现进程间寻址&#xff0c;主要依靠以下 四个参数: MASTER_ADDRMASTER_PORTWORLD_SIZERANK MASTER_PORT和MASTER_ADDR的目的是告诉进程组中负责进程通信协调的核心进程…

SpringBoot:整合 Redis BitMap技术及结合场景:实现签到与统计

⛄引言 本文参考黑马 点评项目 在各个项目中&#xff0c;我们都可能需要用到签到和 统计功能。 签到后会给用户一些礼品以此来吸引用户持续在该平台进行活跃。 签到功能&#xff0c;我们可以通过Redis中的 BitMap功能来实现 一、Redis BitMap 基本用法 ⛅BitMap 基本语法、…

vue+css中通过一个div的hover触发另一个的样式变化

思路 通过触发父div&#xff0c;除了改变父div的背景色外&#xff0c;还同时改变div中i标签的颜色 效果图 原本 hover触发后 html代码 <div class"user_addfrid"><i class"iconfont icon-friend-add"></i> </div> css代码 …

动态地图开发需要注意哪些方面?

动态地图是指可以随时更新和展示地理信息的地图。随着科技的发展和人们对地理信息的需求不断增加&#xff0c;动态地图的开发越来越受到关注。动态地图可以实现多种功能&#xff0c;如实时交通状况的展示、灾害预警、物流配送路线规划等。动态地图的开发需要结合多种技术手段&a…

HummerRisk V1.2.0 发布

经过一个月的时间&#xff0c;1.2.0和大家见面了&#xff0c;在这个版本中我们重做了云资源态势&#xff0c;用全新的2.5D方式来展现云上资源态势及资源关联关系&#xff0c;同时升级了多云合规检测引擎&#xff0c;现在X-PACK中的多云检测可以提升300%的执行速度&#xff0c;规…

自定义MVC

目录 一、MVC概念描述 1、什么是MVC&#xff1f; 2、什么是自定义MVC&#xff1f; 3、自定义MVC有什么用&#xff08;主要用途&#xff09;&#xff1f; 二、MVC三层架构 第一种版本 JSP页面 servlet 结果 第二种版本 JSP代码 servlet 结果 第三种版本 jsp页面 s…

unity Embedded Browser(ZFBrowser)使用相关问题

在使用ZFBrowser的时候 碰到获取不到声音权限的问题 在插件的BrowserNative.cs脚本中&#xff0c;找到commandLineSwitches变量&#xff0c; 只需要开启以下两个配置项&#xff1a; "--enable-media-stream"&#xff1a;允许收集用户的摄像头视频流与mic的音频流。…

【Rust】入门教程-7章

Package、Crate、Module 7.1 代码组织 7.2 路径 根级可以相互访问 super 关键字 pub struct 7.4 use关键字

【Spark大作业】财政收入影响因素分析及预测模型

文章目录 前言一、数据的基本描述性分析1.1 导包与读取数据1.2 数据的基本情况1.3 变量的分布情况1.4 相关性分析 二、数据的预处理2.1 Lasso变量选择模型 三、建立财政收入预测模型3.1 灰色模型3.2 神经网络预测模型 环境搭建Spark pandsAPI接口&#xff08;了解&#xff09;分…

windows本地上传文件到服务器(scp)

命令 1.ssh 用户名ip&#xff1a;远程登录服务器。 ssh root1.15.233.1932.scp 本地文件路径 用户名ip:上传路径 &#xff1a;本地文件与服务器进行传递。 scp C:\a.txt root1.15.233.193:/var/www/html3.本地文件夹上传到服务器 scp -r C:\user root1.15.233.193:/home4…

三防工业平板在哪些行业中得到广泛应用?

随着科技的不断进步&#xff0c;工业平板正逐渐成为各行业中不可或缺的工具。其中&#xff0c;三防工业平板由于其卓越的耐用性和丰富的功能&#xff0c;在许多行业中得到了广泛的应用。本文将重点介绍三防工业平板在以下几个行业中的应用。 三防工业平板在物流行业中发挥着关键…

shell脚本ssh远程执行命令给变量赋值的问题

需求及目标 从A机器通过SSH方式到B机器&#xff0c;并执行相关的命令。命令中包含变量及变量的赋值。 代码如下&#xff0c;意思是&#xff0c;ssh到10.111.111.27这台机器&#xff0c;cd到 / 根目录下&#xff0c;并执行ls命令&#xff0c;如果ls出来的结果不为空&#xff0…

【鲁棒优化】微电网鲁棒优化定价方案研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【算法】区间DP (从记忆化搜索到递推DP)⭐

文章目录 前期知识516. 最长回文子序列思路1——转换问题&#xff1a;求 s 和反转后 s 的 LCS&#xff08;最长公共子序列&#xff09;思路2——区间DP&#xff1a;从两侧向内缩小问题规模补充&#xff1a;记忆化搜索代码 1039. 多边形三角剖分的最低得分从记忆化搜索开始翻译成…