PS:本篇文章主体内容并不涉及复杂代码的编写~~请大家放心食用hh
目录
2、在 application.properties 中添加数据库配置

应用模型:
SpringBoot的角色是用来处理用户请求,client端向spring Boot发送请求,然后向数据库请求数据,数据库返回数据给前端。
在我的理解下 SpringBoot 类似于 管家 的角色。

下载地址:



其他默认一直next就可以
将C:\Program Files\MySQL\MySQL Server 8.0\bin(如果安装到了其他目录,填写相应目录的地址即可)添加到环境变量PATH中,这样就可以在任意目录的终端中执行mysql命令了。我这里使用的是自己电脑原来安装的MySQL Server 5.7,本质上没有什么区别。



mysql服务的关闭与启动(默认开机自动启动,如果想手动操作,可以参考如下命令)
打开命令行,输入以下命令
关闭:net stop mysql80
启动:net start mysql80或者右击我的电脑,选择 管理 ->服务和应用程序 -> 服务 -> MySQL 可以选择手动 或者关闭。

MySQL 常用操作:(注意在结尾加上分号)
+ 连接用户名为root,密码为123456的数据库服务:mysql -uroot -p123456
+ show databases; :列出所有数据库
+ create database kob;:创建数据库
+ drop database kob;:删除数据库
+ use kob;:使用数据库kob
+ show tables;:列出当前数据库的所有表
+ create table user(id int, username varchar(100));:创建名称为user的表,表中包含id和username两个属性。
+ drop table user;:删除表
+ insert into user values(1, 'gcy');:在表中插入数据
+ select * from user;:查询表中所有数据
+ delete from user where id = 2;:删除某行数据


1、 创建数据库kob
2、在kob下创建表user
3、插入两条数据

使用工具在操作数据库(WorkBench)

操作大家自行百度即可,基本操作都非常简单~~
1. 连接,点击右边的数据库 -> + -> 数据源-> MySQL,输入账号、密码、数据库名称,这里是kob,点击测试连接,成功后点击应用就可以了。



1. 在pom.xml下添加依赖,依赖可以 Maven仓库地址 中寻找。
Spring Boot Starter JDBC
Project Lombok
MySQL Connector/J
mybatis-plus-boot-starter
mybatis-plus-generator
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-jdbcartifactId>
- <version>2.7.0version>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <version>1.18.22version>
- <scope>providedscope>
- dependency>
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>8.0.28version>
- dependency>
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-boot-starterartifactId>
- <version>3.5.1version>
- dependency>
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-generatorartifactId>
- <version>3.5.1version>
- dependency>
记得刷新~

- //输入你自己的用户和密码
- spring.datasource.username=root
- spring.datasource.password=123456
- spring.datasource.url=jdbc:mysql://localhost:3306/kob?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
点击运行 出现报错 可能是因为路径问题。
点击运行,输入网址 http://127.0.0.1:8080/pk/index/显示界面就成功了

SpringBoot中的常用模块
pojo层:将数据库中的表对应成Java中的Class
mapper层(也叫Dao层):将pojo层的class中的操作,映射成sql语句
service层:写具体的业务逻辑,组合使用mapper中的操作
controller层:负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面


注解?注解的作用?
使用注解可以帮助我们不在需要配置繁杂的xml文件,以前最基本的web项目是需要写xml配置的,需要标注你的哪个页面和哪个 servle 是对应的,注解可以帮助我们减少这方面的麻烦。
@Controller:用于定义控制器类,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping。
@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。
@Autowired:自动导入依赖的bean
@Service:一般用于修饰service层的组件
@Bean:用@Bean标注方法等价于XML中配置的bean。
@AutoWired:自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。
可以不用花时间去了解类似注解的实现原理,用的时候背下来就行,这里只是简单记录一下,如果想深入了解,可以百度。
在 backend 下创建 pojo 包 创建一个类 User,将数据库中的表 User转化为 Java 中的 User.class
- @Data
- @NoArgsContructor
- @AllArgsContructor
- public class User {
- private Integer id;
- private String username;
- private String password;
- }

在 backend 创建 mapper 包,创建一个 接口 UserMapper
- @Mapper
- public interface UserMapper extends BaseMapper
{ -
- }


在backend 的 controller 下创建 user 包然后创建 UserController
- @RestController
- public class UserController {
-
- @Autowired
- UserMapper userMapper;
-
- /**
- * 查询所有用户
- */
- @GetMapping("/user/all/")
- public List
getAll() { - return userMapper.selectList(null);
- }
-
- /**
- * 查询单个用户
- */
- @GetMapping("/user/{userId}/")
- public User getUser(@PathVariable int userId) {
- QueryWrapper
queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("id",userId);
-
- return userMapper.selectOne(queryWrapper);
-
- // 范围遍历
- // public List
getUser(int userId) - // queryWrapper.ge("id", 2).le("id", 3);
- // return userMapper.selectList(queryWrapper);
- }
-
- /**
- * 添加某个用户 直接输入 id name password
- * @param userId
- * @param username
- * @param password
- * @return Add User Sucessfully
- */
- @GetMapping("/user/add/{userId}/{username}/{password}/")
- public String addUser (@PathVariable int userId,
- @PathVariable String username,
- @PathVariable String password) {
-
- User user = new User(userId, username, password);
- userMapper.insert(user);
- return "Add User Sucessfully";
- }
-
- /**
- * 删除某个用户,直接输入 id
- * @param userId
- * @return Delete User Successfully
- */
- @GetMapping("/user/delete/{userId}/")
- public String deleteUser(@PathVariable int userId) {
- userMapper.deleteById(userId);
- return "Delete User Successfully";
- }
- }
查询user中的全部数据:

查询user中的单个数据:

添加 user 中的数据:


删除 user 中的数据:


什么是 Spring Security ?
答:Spring Security 是用户认证操作 – 一种授权机制,目的是安全。
spring-boot-starter-security
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-securityartifactId>
- <version>2.7.0version>
- dependency>
刷新之后显示登陆:

默认的叫 Username 是 user ,密码自动生成。

在backend 的 service 创建 impl 包,新建 UserDetailsServiceImpl 类。
实现service.impl.UserDetailsServiceImpl类,继承自UserDetailsService接口,用来接入数据库信息
- @Service
- public class UserDetailsServiceImpl implements UserDetailsService {
- //快捷键 windowsalt + insert / mac是option + enter
- @Autowired
- private UserMapper userMapper;
- // 传入 username 返回对应的信息,在这里也就是id name pwd
- @Override
- public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
- QueryWrapper
queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("username", username);
- User user = userMapper.selectOne(queryWrapper);
- if (user == null) {
- throw new RuntimeException("用户不存在");
- }
-
- return new UserDetailsImpl(user);
- }
- }

在backend 的 service 包的 impl 包下创建utils 包 新建 UserDetailsImpl:
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- public class UserDetailsImpl implements UserDetails {
-
- private User user;
-
- @Override
- public Collection extends GrantedAuthority> getAuthorities() {
- return null;
- }
-
- @Override
- public String getPassword() {
- return user.getPassword();
- }
-
- @Override
- public String getUsername() {
- return user.getUsername();
- }
-
- @Override
- public boolean isAccountNonExpired() {
- return true;
- }
-
- @Override
- public boolean isAccountNonLocked() {
- return true;
- }
-
- @Override
- public boolean isCredentialsNonExpired() {
- return true;
- }
-
- @Override
- public boolean isEnabled() {
- return true;
- }
- }
-
在backend 的 service 包的 impl 包下创建utils 包 新建 UserDetailsImpl:
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- public class UserDetailsImpl implements UserDetails {
-
- private User user;
-
- @Override
- public Collection extends GrantedAuthority> getAuthorities() {
- return null;
- }
-
- @Override
- public String getPassword() {
- return user.getPassword();
- }
-
- @Override
- public String getUsername() {
- return user.getUsername();
- }
-
- @Override
- public boolean isAccountNonExpired() {
- return true;
- }
-
- @Override
- public boolean isAccountNonLocked() {
- return true;
- }
-
- @Override
- public boolean isCredentialsNonExpired() {
- return true;
- }
-
- @Override
- public boolean isEnabled() {
- return true;
- }
- }

如果实现登录的话,需要提供一个 PassworEncoder。
如果在数据库中指定明文来存储,需要在自己的密码加上{noop},才可以登录。
1. 实现密文存储:
在 config 下新建 SecurityConfig 。
实现config.SecurityConfig类,用来实现用户密码的加密存储。
- @Configuration
- @EnableWebSecurity
- public class SecurityConfig {
-
- @Bean
- public PasswordEncoder passwordEncoder() {
- return new BCryptPasswordEncoder();
- }
- }

2. 测试
在 Test 下生成需要转换的密文,同时修改数据库下的密码为密文。

查看生成的密文:
$2a$10$4AaK80JnfmRFQA2nRUnNl.Vt.MhAvdu5FeyqxbMJDViOPDHuBSlhS
$2a$10$swlEAIVf4xw7qT/Mykk5leYlylUnToz3oy0dUifEWt4b2NTGOGzB.
$2a$10$zhG9.Pa5nIOYetvqkjo08echmbS3Ymhme3IHD1anwleqEbkc1y8ue
$2a$10$QQuex9RceLQE6GRZeTdGcOaWvsNq.Jxb7FCnrP9OqcL1lRW0cXm6e
$2a$10$w418fbr8WS3lr.X8/fORreX.RpnVtosjH4uB99qTRBPlp2jYCnamC
在数据库中更改密码为密文:修改后上传,刷新。一定要记得上传。

重启项目,进入login页面
登录成功,只要不给你显示密码错误就代表成功,显示Whitelabel Error Page也是成功,自己在后面添加路径就可以了登录。

注意,这里地址栏是我自己手动输入的,如果你没有设置跳转的话,应该是显示Whitelabel Error Page,这样也算登录成功。

使用密文添加用户(数据库中不要保存明文密码)
修改 controller 下的 user 的 UserController的注册,密码直接存储加密之后的密码。
- @GetMapping("/user/add/{userId}/{username}/{password}/")
- public String addUser(
- @PathVariable int userId,
- @PathVariable String username,
- @PathVariable String password) {
- PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
- String encodedPassword = passwordEncoder.encode(password);
- User user = new User(userId, username, encodedPassword);
- userMapper.insert(user);
- return "Add User Successfully";
- }



记得 git 维护~
