SpringBoot项目实战笔记:电脑商城项目实战(SpringBoot+MyBatis+MySQL)

news/2024/4/29 21:15:55/文章来源:https://blog.csdn.net/weixin_44260350/article/details/127746667
花了一段实现刚学完SpringBoot,做个项目练练手。教程视频来源于B站。
视频链接:【SpringBoot项目实战完整版】SpringBoot+MyBatis+MySQL电脑商城项目实战_哔哩哔哩_bilibili

一、系统概述与环境搭建

1. 系统开发及运行环境

       电脑商城系统开发所需的环境及相关软件进行介绍。
        1.操作系统:Windows 10
        2.Java开发包:JDK 8
        3.项目管理工具:Maven 3.6.3
        4.项目开发工具:IntelliJ IDEA 2022.2.2 x64
        5.数据库:MySQL MariaDB-10.3.7-winx64
        6.浏览器:Google Chrome
        7.服务器架构:Spring Boot 2.7.5+ MyBatis 2.2.2 + AJAX2

2.项目分析

        1.在开发某个项目之前,应先分析这个项目中可能涉及哪些种类的数据。本项目中涉及的数据:用户、商品、商品类别、收藏、订单、购物车、收货地址。

        2.关于数据,还应该要确定这些数据的开发顺序。设计开发顺序的原则是:先开发基础、简单或熟悉的数据。以上需要处理的数据的开发流程是:用户-收货地址-商品类别-商品-收藏-购物车-订单。

        3.在开发每种数据的相关功能时,先分析该数据涉及哪些功能。在本项目中以用户数据为例,需要开发的功能有:登录、注册、修改密码、修改资料、上传头像

        4.然后,在确定这些功能的开发顺序。原则上,应先做基础功能,并遵循增查删改的顺序来开发。则用户相关功能的开发顺序应该是:注册-登录-修改密码-修改个人资料-上传头像。

        5.在实际开发中,应先创建该项目的数据库,当每次处理一种新的数据时,应先创建该数据在数据库中的数据表,然后在项目中创建该数据表对应的实体类。

        6.在开发某个具体的功能时,应遵循开发顺序:持久层-业务层-控制器-前端页面。

3.创建项目

       1.给项目添加Web->Spring Web、SQL->MyBatis Framework、SQL->MySQL Driver的依赖。点击【Next】按钮完成项目创建。

        2.Maven配置

        其中在maven的配置上,点击File->Setting->搜索maven->如下配置。 

       但在User settings file 配置不大对,但能项目能正常启动(不知道为什么,后面需要再说),因为我在G:\Maven\apache-maven-3.6.3-bin\目录下没看到/conf目录,可能IDEA自动给我默认选了C盘下的目录了吧

        3.首次创建完Spring Initializr项目时,解析项目依赖需消耗一定时间(Resolving dependencies of store...)

4.配置并运行项目

4.1 运行项目

        首先先保证Springboot项目能够启动起来,找到程序的入口,即被@SpringBootApplication注解修饰的入口启动类,运行入口启动类,如果观察到图形化的界面,即项目成功启动。

```java
package com.cy.store;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class StoreApplication {public static void main(String[] args) {SpringApplication.run(StoreApplication.class, args);}
}

4.2 配置项目

        检查数据库是否成功连接,在/test包中写个测试代码:

@SpringBootTest
class StoreApplicationTests {@Autowired  //自动注入/自动装配private DataSource dataSource;@Testvoid contextLoads() {}@Testvoid getConnection() throws SQLException {System.out.println(dataSource.getConnection());}}

        如果启动项目时提示:“配置数据源失败:'url'属性未指定,无法配置内嵌的数据源”。有如下的错误提示。

​​​​​​​

        解决以上操作提示的方法:在resources文件夹下的application.properties文件中添加数据源的配置。

        配置数据源,数据库信息。这一步建议在创建项目完后立马检查配置。步骤:按照上面测试代码的方式获取数据源连接观察是否能成功连接。

spring.datasource.url=jdbc:mysql://localhost:3306/store?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456

4.3 其他配置

        1.为了方便查询JSON数据,隐藏没有值的属性,减少流量消耗,服务器不应该向客户端响应为null的属性。解决方式有两种:

        方式一:在属性或类之前添加@JsonInclude(value=Include.NON_NULL)

        方式二:可以在application.propertise配置文件中添加全局配置:

# 服务器向客户端不响应为null的属性
spring.jackson.default-property-inclusion=NON_NULL

        2.SpringBoot项目的默认访问路径是“/”,如果需要修改的话可以在配置文件中指定SpringBoot访问项目路径的项目名。但是不建议修改

server.servlet.context-path=/store

三、用户登录注册

3.1 用户注册

3.1.1  用户-创建数据表

        创建store数据库,创建t_user用户数据表。

        1.使用use命令先选中store数据库:use store;

        2.在store数据库中创建t_user表。(直接复制到Navicat中,点击查询,执行脚本)

CREATE TABLE t_user (
uid INT AUTO_INCREMENT COMMENT '用户id',
username VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',
password CHAR(32) NOT NULL COMMENT '密码',
salt CHAR(36) COMMENT '盐值',
phone VARCHAR(20) COMMENT '电话号码',
email VARCHAR(30) COMMENT '电子邮箱',
gender INT COMMENT '性别:0-女,1-男',
avatar VARCHAR(50) COMMENT '头像',
is_delete INT COMMENT '是否删除:0-未删除,1-已删除',
created_user VARCHAR(20) COMMENT '日志-创建人',
created_time DATETIME COMMENT '日志-创建时间',
modified_user VARCHAR(20) COMMENT '日志-最后修改执行人',
modified_time DATETIME COMMENT '日志-最后修改时间',
PRIMARY KEY (uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.1.2 用户-创建实体类

1.项目中许多实体类都会有日志相关的四个属性,所以在创建实体类之前,应先创建这些实体类的基dsdi 类,将4个日志属性声明在基类中。在com.cy.store.entity包下创建BaseEntity,作为实体类的基类。

package com.cy.store.entity;
import java.io.Serializable;
import java.util.Date;
/** 实体类的基类 */
public class BaseEntity implements Serializable {
private String createdUser;
private Date createdTime;
private String modifiedUser;
private Date modifiedTime;
// Generate: Getter and Setter、toString()
}

因为这个基类的作用就是用于被其他实体类继承的,所以应声明为抽象类。

为什么要继承sealization接口?因为要在网络中以流的形式传输,所以需要serialize序列化

2.创建com.cy.store.entity.User用户数据的实体类,继承自BaseEntity类,在中声明相关属性。

package com.cy.store.entity;
import java.io.Serializable;
import java.util.Objects;
/** 用户数据的实体类 */
public class User extends BaseEntity implements Serializable {
private Integer uid;
private String username;
private String password;
private String salt;
private String phone;
private String email;
private Integer gender;
private String avatar;
private Integer isDelete;
// Generate: Getter and Setter、Generate hashCode() and equals()、toString()
}

Tips:实体类可使用lombok插件,类上声明几个注解@Data @AllArgConsturctor等注解表示自动生成get/set方法,以及有参和无参构造函数。

3.1.3用户-注册-持久层

(1)准备工作

        1.在src/test/java下的com.store.StoreApplicationTest测试类中编写并执行获取数据库连接的单元测试,以检查数据库连接的配置是否正确。参加上面环境配置的数据源的代码。

        2.执行src/test/java下的com.cy.storeApplicationTests测试类中的contextLoad观察是否执行成功。

(2)规划需要执行的SQL语句

        1.用户注册的本质就是向用户表中插入数据,需要执行的SQL语句大致是:

insert into t_user(除uid之外的字段列表) values(匹配的值列表)

        2.由于数据库表中的用户名字段被设计为UNIQUE,在执行插入数据之前,还应该检查该用户名是否被注册,因此需要有“根据用户名查询用户数据”的功能。需要执行的SQL语句大致是:

select * from t_user where username = ? 

(3)接口与抽象方法

        1.在com.cy.store包下创建一个mapper包,接着创建com.cy.store.mapper.UserMapper接口,并在接口中添加抽象方法。

/** 处理用户数据操作的持久层接口 */
public interface UserMapper {
/**
* 插入用户数据
* @param user 用户数据
* @return 受影响的行数
*/
Integer insert(User user);
/**
* 根据用户名查询用户数据
* @param username 用户名
* @return 匹配的用户数据,如果没有匹配的数据,则返回null
*/
User findByUsername(String username);
}

        2.由于这是项目中第一次创建持久层接口,还应在StoreApplication启动类之前添加@MapperScan("com.cy.store.mapper")注解,表示在项目一启动自动扫描这个包下的mapper接口。因为SpringBoot一开始不知道mapper接口放在哪,你得在项目启动入口告诉它在那个地方,通过注解的方式配置包扫描路径。

@SpringBootApplication
@MapperScan("com.cy.store.mapper")
public class StoreApplication {
public static void main(String[] args) {
SpringApplication.run(StoreApplication.class, args);
}
}

Mybats与Spring整合后需要实现实体类和数据表的映射关系。实现实体类和数据表的映射关系可以在Mapper接口添加@Mapper注解。但建议以后直接在SpringBoot启动类中加@MapperScan("mapper包")注解,这样比较方便,不需要对每个Mapper都添加@Mapper注解。

复习一下:一个数据表对应一个实体类,每个实体类都有一个Mapper接口,每个Mapper自动生成一个Mapper实现类,每个Mapper接口对应一个Mapper配置文件。

eg: t_user -->  User  --> UserMapper.java  --> UserMapper.xml 

(4)配置SQL映射

        1.在src/main/resource下创建mapper文件夹,并在文件夹下创建UserMapper.xml配置文件,进行以上两个抽象方法的映射配置。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.store.Mapper.UserMapper"><!--实体类属性和数据库表字段创建映射关系,映射的属性:把有下划线改成驼峰的映射关系用于查询语句select,增删改不需要--><resultMap id="userEntityMap" type="com.cy.store.Entity.User"><id column="uid" property="uid"></id><result column="is_delete" property="isDelete"></result><result column="created_user" property="createdUser"></result><result column="created_time" property="createdTime"></result><result column="modified_user" property="modifiedUser"></result><result column="modified_time" property="modifiedTime"></result></resultMap><!--插入语句  使用主键自增userGenerateKeys  keyProperty--><!-- 插入用户数据:Integer insert(User user) --><insert id="insert"  useGeneratedKeys="true"  keyProperty="uid" >insert into t_user(username,password, salt,phone,email,gender,avatar,is_delete,created_user, created_time,modified_user,modified_time)values(#{username},#{password},#{salt},#{phone},#{email},#{gender},#{avatar},#{isDelete},#{createdUser},#{createdTime},#{modifiedUser},#{modifiedTime})</insert><!-- 根据用户名查询用户数据:User findByUsername(String username) --><select id="findByUsername" resultMap="userEntityMap">select * from t_user where username = #{username}</select></mapper>

几点说明:

1.插入/删除/修改语句会有返回值(int),返回受影响的行数;

2.实体类属性和表字段创建映射关系,映射方式:字段下划线变为属性驼峰形式。自己手动改吧,字段复制过来自己去掉下划线改成驼峰命名

3.插入标签里往往需要主键自增,开启主键自增的几个核心属性: userGeneratedKeys   keyProperty

        userGeneratedKeys:表示开启的某个属性的字段递增,值为true

        keyProperty:将表中的哪个属性自增

4.映射关系仅仅出现在select语句中,需要使用到reseltMap属性,来建立属性和字段的映射。也可以使用resultType,但必须实体类实行和表字段属性完全一致;增删改语句不存在属性字段映射的,因为看语句就知道了。

5.resultMap标签里的几个属性:

        id表示唯一标识,select标签需要指定resultMap属性为这个id;

        type标识映射那个实体类的全类名。在<result>标签中指定字段column和属性property的映射。字段名属性名一致的就不用指定映射了,长的一样的Mybatis可以自动映射成功。

        注意:主键一定得指定映射,无论字段名和属性名是否一致。<id>标签里

6.#{}和¥{}的区别 ?

程序执行流程分析

    比如执行insertUser(User user)方法,业务层调用insertUser(User user),业务层里的userMapper已经自动注入了,然后业务层调用持久层的userMapper接口的insertUser(User user)方法,因为userMapper配置文件有个SQL语句的id=“insertUser”(方法名),因此执行这个SQL,把方法里的参数user对象里的所有属性注入到<select>里面来了(有用没用都进来了),因为SQL语句会用到对象中的某些属性呀(比如username password等等其他的),接下来就可以顺利执行SQL语句了,数据库成功执行,插入一条记录后,返回受影响的行数1给这个接口方法int insertUser(User user)。

2.由于这是项目中第一次使用SQL映射(配置文件中SQL语句和Mapper中的抽象方法映射),所哟需要在application.properties中添加mybatis.mapper-locations属性的配置,来指定XML的位置,告诉SpringBoot配置文件在哪个目录下,它方便和mapper接口抽象方法映射上。

mybatis.mapper-locations=classpath:mapper/*.xml

前面顺便提了一下啊,使用@MapperScan告诉SpringBoot把mapper接口都放在com.cy.store.mapper接口下,项目自动给给mapper下的接口当作mapper接口。然后SpringBoot知道了配置文件的的目录,再通过配置文件里的命名空间就实现了mapper接口和xml配置文件文件的映射了。

3.完成后及时执行单元测试,检查以上开发的功能是否正确运行。在src/test/java下创建com.cy.store.mapper.UserMapperTest单元测试类。在测试类的声明之前添加@RunWith(SpringRunner)和@SpringBootTest注解,并在测试类中声明持久化对象,通过自动装配注入值。

​​​​​​​未完!!!

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高质量测试的12个步骤

简介 假设您正在实现某个功能&#xff0c;经过一番艰苦卓绝的编码后&#xff0c;终于可以提交、合并代码了。流水线开始运行&#xff0c;几分钟后失败了。部分单元测试用例失败了……这会让您很痛苦&#xff0c;因为修改的是别人遗留下来的程序&#xff0c;所以您并不清楚单元…

docker环境连接tdengine服务

1.开发app项目 <!--引入TDEngine--> <dependency><groupId>com.taosdata.jdbc</groupId><artifactId>taos-jdbcdriver</artifactId><version>3.0.0</version> </dependency> <!-- 引入jdbc --> <dependency&g…

Vue(四)——使用脚手架(1)

安装和启动&#xff1a; 目录 分析脚手架结构 render函数 修改默认配置 ref属性 props配置项 mixin混入 插件 scoped样式 分析脚手架结构 脚手架文件结构 ├── node_modules ├── public│ ├── favicon.ico: 页签图标│ └── index.html: 主页面├── …

【Linux修炼手册:基本指令(上)】

目录 1 ls 指令 2 pwd命令 3 cd 指令 4 touch指令 5 mkdir指令&#xff08;重要&#xff09; 6 rmdir指令 && rm 指令&#xff08;重要&#xff09; 7 cp指令&#xff08;重要&#xff09; 8 mv指令&#xff08;重要&#xff09; 9 cat 总结&#xff1a; 1 ls…

C语言如何做到四舍五入保留小数

C语言中的格式化打印 : 例如&#xff1a; printf("%.2f",21.195); 输出是 21.20 四舍五入保留了定义宏变量 #define 即符号常量 也能够四舍五入保留 而变量和常变量 并不四舍五入&#xff1a; float a21.195 ;const float b21.195;printf("%.2f \n %.2f&quo…

Java本地搭建宝塔部署实战springboot工艺管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套java开发的工艺管理系统源码&#xff0c;该系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术架构 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.…

【linux】stat文件属性中三个时间的区别(Access time,Modify time,Change time)

在了解这三个时间之前&#xff0c;我们了解什么是stat。 stat 文件名/目录 表示查看这个文件或者目录的属性&#xff0c;当然属性中包括我们的三个时间属性。 例如&#xff1a; OK&#xff0c;了解完stat之后 ,我们开始进入主题&#xff1a;Access time,Modify time,Change t…

几款很好看的爱心表白代码(动态)

分享几款好看的爱心表白代码❤️爱心代码❤️&#xff08;C语言&#xff09;❤️流动爱心❤️&#xff08;htmlcssjs&#xff09;❤️线条爱心❤️&#xff08;htmlcssjs&#xff09;❤️biu表白爱心❤️&#xff08;htmlcssjs&#xff09;❤️matlab爱心函数❤️&#xff08;需…

LSTM--火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第R2周&#xff1a;LSTM-火灾温度预测&#x1f356; 作者&#xff1a;K同学啊一句话介绍LSTM&#xff0c;它是RNN的进阶版&#xff0c;如果…

静态路由———初学

文章目录实验需求:关键命令&#xff1a;静态路由默认路由实验配置接下来是配置pc的IP地址静态路由的配置保存实验需求: PC1 在 LAN1 中&#xff0c;PC2 在 LAN2 中&#xff0c;使用静态路由实现 pc1 和 pc2 之间的互相通信 本实验使用Cisco Packet Tracer 模拟器搭建 所有的路…

公考求的是稳定,搞IT求的是高薪,鱼和熊掌能否兼得?

程序员和公务员&#xff0c;大概是最让大家耳熟能详的两种职业。 这也是中国现代年轻人最具有代表性的两种职业。 程序员是从事程序开发、程序维护的专业人员。一般将程序员分为程序设计人员和程序编码人员&#xff0c;但两者的界限并不非常清楚&#xff0c;特别是在中国。软…

Verilog功能模块——Uart收发

摘要本文分享了一种通用的Uart收发模块&#xff0c;可实现Uart协议所支持的任意波特率&#xff0c;任意位宽数据&#xff08;5~8&#xff09;&#xff0c;任意校验位&#xff08;无校验、奇校验、偶校验、1校验、0校验&#xff09;&#xff0c;任意停止位&#xff08;1、1.5、2…

前端反爬思考,好友从百度搜到了我的文章,链接却是别人的

今天感叹可以改完八阿哥早点下班&#xff0c;在吃饭的时候&#xff0c;就想着自己也写了一段时间了&#xff0c;看看百度这个强大的引擎能不能搜到我的博客文章。 1、发现文章被爬走了 吃饭的时候用手机搜的&#xff0c;感觉还挺开心&#xff0c;我还给朋友炫耀&#xff0c;你看…

Import Error: from torchtext.data import to_map_style_dataset解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

电子统计台账:快速设置产品的排除与保留

目录 1 基础操作 2 设置垂直过滤模板 2.1 排除法 2.2 保留法 3 完成其他设置 4 小提示&#xff1a;项目导入导出 实践中&#xff0c;企业数据文件中可能有很多产品&#xff0c;中间混杂诸如“累计”、“合计”、“报表人”、“企业负责人”等信息。我们需要用简单的操作完…

洛谷千题详解 | P1018 [NOIP2000 提高组] 乘积最大【C++、Python、Java、pascal语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Python源码&#xff1a; Pascal源码&#xff1a; Java源码&#xff1a; -------------------------------------------------…

苯丙氨酸甲酯双三氟甲基磺酰亚胺[PheC1][Tf2N]氨基酸酯离子液体

苯丙氨酸甲酯双三氟甲基磺酰亚胺[PheC1][Tf2N]氨基酸酯离子液体 纯度&#xff1a;95% 外观与形状:液体/固体, 储存:存放于惰性气体之中 应避免湿气 (吸湿) 包装规格(Packing):50g、100g、500g 保存方法&#xff1a;密闭&#xff0c;阴凉&#xff0c;通风干燥处 氨基酸酯…

返回Series或DataFrame中指定列中指定数量的最小值nsmallest()函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 返回Series或DataFrame中 指定列中指定数量的最小值 nsmallest()函数 [太阳]选择题 下列说法错误的是? import pandas as pd mySeries pd.Series([31, 21, 11]) print("【显示】mySer…

Numpy手撸softmax regression

算法介绍 Softmax 回归&#xff08;或多项逻辑回归&#xff09;是将逻辑回归推广到我们想要处理多个类的情况。 在逻辑回归中&#xff0c;我们假设标签是二元的&#xff1a;y(i)∈{0,1}y^{(i)} \in \{0,1\}y(i)∈{0,1},我们使用这样的分类器来区分两种手写数字。 Softmax 回归…

C#项目实战|人脸识别考勤

此文主要通过WinForm来制作的一个人脸识别考勤打卡程序&#xff0c;有兴趣的小伙伴可以接入到打卡机上。 一、实现流程1.1、创建项目1.2、设计页面1.3、创建应用1.4、获取Token及参数解析1.5、与人脸数据比对并展示一、实现流程 1.1、创建项目 打开Visual Studio&#xff0c;右…