【Spring Boot开发实战手册】掌握Springboot开发技巧和窍门(七)配置Mysql、配置SpringBoot、配置Spring Security

【Spring Boot开发实战手册】掌握Springboot开发技巧和窍门(七)配置Mysql、配置SpringBoot、配置Spring Security

前言

通过这篇文章,你将学习到如何从零开始设置 MySQL 数据库,如何将其与 Spring Boot 项目集成,并且如何利用 Spring Security 来实现用户认证和授权。无论你是初学者还是有经验的开发者,这些配置技巧都将对你的开发工作大有裨益。


配置Mysql

下载Mysql

Windows下载地址
建议下载第二个

在这里插入图片描述

安装MySQL

点击下载成功的安装包:

在这里插入图片描述


在这里插入图片描述


其他页面全选默认即可。

配置MySQL

将C:\Program Files\MySQL\MySQL Server 8.0\bin(如果安装到了其他目录,填写相应目录的地址即可)添加到环境变量PATH中,这样就可以在任意目录的终端中执行mysql命令了。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


ysql服务的关闭与启动(默认开机自动启动,如果想手动操作,可以参考如下命令)
打开命令行,输入以下命令
关闭:net stop mysql
启动:net start mysql

或者右击我的电脑,选择 管理 ->服务和应用程序 -> 服务 -> MySQL 可以选择手动 或者关闭。

在这里插入图片描述


mysql的常用操作:注意每一条命令需要加分号;结尾。

  • 连接用户名为root,密码为1234的数据库服务:mysql -uroot -p1234
  • 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, ‘yxc’);:在表中插入数据
  • select * from user;:查询表中所有数据
  • delete from user where id = 2;:删除某行数据

创建数据库kob
在kob下创建表user
插入两条数据

createdatabase kob;use kob;createtableuser( id int, username varchar(100), password varchar(100));insertintouservalues(1,'hgq','p1');insertintouservalues(2,'yxc','p2');

IDEA连接MySQL

点击右边的数据库 -> + -> 数据源-> MySQL,输入账号、密码、数据库名称,这里是kob,点击测试连接,成功后点击应用就可以了。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


连接成功后打开数据库,打开我们创建的表user

在这里插入图片描述

配置SpringBoot

添加依赖

在pom.xml下添加依赖,依赖可以在Maven仓库地址中寻找

Spring Boot Starter JDBC Project Lombok MySQL Connector/J mybatis-plus-boot-starter mybatis-plus-generator 

具体如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>2.7.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version><scope>provided</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version></dependency>

在application.properties中添加数据库配置:

//输入你自己的用户和密码 spring.datasource.username=root spring.datasource.password=1234 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://localhost:3000/pk/index/

在这里插入图片描述

实现简单的CRUD

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

@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@AllArgsConstructor@NoArgsConstructorpublicclassUser{privateInteger id;privateString username;privateString password;}

在backend创建mapper 包,创建一个 Java 类的接口 UserMapper

importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importorg.apache.ibatis.annotations.Mapper;importorg.example.backend.pojo.User;@MapperpublicinterfaceUserMapperextendsBaseMapper<User>{}

UserMapper 接口继承了 BaseMapper 接口,这样 UserMapper 就具备了 BaseMapper 中定义的所有基本 CRUD 操作(创建、读取、更新、删除)的方法。BaseMapper 通常是 MyBatis-Plus 提供的一个接口,它为普通的数据库操作提供了简化的实现。

在backend 的 controller 下创建 user 包然后创建 UserController

importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importorg.example.backend.mapper.UserMapper;importorg.example.backend.pojo.User;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RestController;importjava.util.List;@RestControllerpublicclassUserController{@AutowiredUserMapper userMapper;/* 查询所有用户 */@GetMapping("/user/all/")publicList<User>getAll(){return userMapper.selectList(null);}/* 根据id查询用户 */@GetMapping("/user/{userId}/")publicUsergetUser(@PathVariable("userId")Long userId){QueryWrapper<User> queryWrapper =newQueryWrapper<>(); queryWrapper.eq("id", userId);return userMapper.selectOne(queryWrapper);}/* 添加用户 */@GetMapping("/user/add/{userId}/{username}/{password}/")publicStringaddUser(@PathVariableint userId,@PathVariableString username,@PathVariableString password){User user =newUser(userId, username, password); userMapper.insert(user);return"Add User Success";}/* 根据id删除用户 */@GetMapping("/user/delete/{userId}/")publicStringdeleteUser(@PathVariableint userId){ userMapper.deleteById(userId);return"Delete User Success";}}

查询user中的全部数据。

在这里插入图片描述


根据id查询数据

在这里插入图片描述


添加用户

在这里插入图片描述


根据Id删除某个用户

在这里插入图片描述

配置Spring Security

是用户认证操作 – 一种授权机制,目的是安全。

添加依赖

添加依赖,添加之后刷新。

spring-boot-starter-security 
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>2.7.0</version></dependency>
在这里插入图片描述


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

在这里插入图片描述


在这里插入图片描述

与数据库对接

在backend 的 service 创建 impl 包,新建 UserDetailsServiceImpl 类。
实现service.impl.UserDetailsServiceImpl类,继承自UserDetailsService接口,用来接入数据库信息。

packageorg.example.backend.service.impl;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importorg.example.backend.mapper.UserMapper;importorg.example.backend.pojo.User;importorg.example.backend.service.impl.utils.UserDetailsImpl;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.security.core.userdetails.UserDetails;importorg.springframework.security.core.userdetails.UserDetailsService;importorg.springframework.security.core.userdetails.UsernameNotFoundException;importorg.springframework.stereotype.Service;@ServicepublicclassUserDetailsServiceImplimplementsUserDetailsService{@AutowiredprivateUserMapper userMapper;@OverridepublicUserDetailsloadUserByUsername(String username)throwsUsernameNotFoundException{QueryWrapper<User> queryWrapper =newQueryWrapper<>(); queryWrapper.eq("username", username);User user = userMapper.selectOne(queryWrapper);if(user ==null){thrownewRuntimeException("用户不存在");}returnnewUserDetailsImpl(user);}}

在backend 的 service 包的 impl 包下创建utils 包 新建 UserDetailsImpl

packageorg.example.backend.service.impl.utils;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importorg.example.backend.pojo.User;importorg.springframework.security.core.GrantedAuthority;importorg.springframework.security.core.userdetails.UserDetails;importjava.util.Collection;importjava.util.Collections;@Data@NoArgsConstructor@AllArgsConstructorpublicclassUserDetailsImplimplementsUserDetails{privateUser user;@OverridepublicCollection<?extendsGrantedAuthority>getAuthorities(){returnCollections.emptyList();}@OverridepublicStringgetPassword(){return user.getPassword();}@OverridepublicStringgetUsername(){return user.getUsername();}@OverridepublicbooleanisAccountNonExpired(){returntrue;}/* 用户是否没有被锁定 */@OverridepublicbooleanisAccountNonLocked(){returntrue;}/* 用户的凭据(如密码)是否过期 */@OverridepublicbooleanisCredentialsNonExpired(){returntrue;}/* 用户是否被启用 */@OverridepublicbooleanisEnabled(){returntrue;}}

测试

如果实现登录的话,需要提供一个 PassworEncoder。
如果在数据库中指定明文来存储,需要在自己的密码加上{noop},才可以登录。

  1. 实现密文存储:
    在 config 下新建 SecurityConfig 。
    实现config.SecurityConfig类,用来实现用户密码的加密存储。
importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importorg.example.backend.mapper.UserMapper;importorg.example.backend.pojo.User;importorg.example.backend.service.impl.utils.UserDetailsImpl;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.security.core.userdetails.UserDetails;importorg.springframework.security.core.userdetails.UserDetailsService;importorg.springframework.security.core.userdetails.UsernameNotFoundException;importorg.springframework.stereotype.Service;@ServicepublicclassUserDetailsServiceImplimplementsUserDetailsService{@AutowiredprivateUserMapper userMapper;@OverridepublicUserDetailsloadUserByUsername(String username)throwsUsernameNotFoundException{QueryWrapper<User> queryWrapper =newQueryWrapper<>(); queryWrapper.eq("username", username);User user = userMapper.selectOne(queryWrapper);if(user ==null){thrownewRuntimeException("用户不存在");}returnnewUserDetailsImpl(user);}}
  1. 测试
    在 Test 下生成需要转换的密文,同时修改数据库下的密码为密文。
@SpringBootTestclassBackendApplicationTests{@TestvoidcontextLoads(){PasswordEncoder passwordEncoder =newBCryptPasswordEncoder();System.out.println(passwordEncoder.encode("p1"));System.out.println(passwordEncoder.encode("p2"));System.out.println(passwordEncoder.encode("p3"));}}

生成的密文为:

$2a$10$INlbe6TUdMvJX7x8xtEtGOsi7DuO1LAuTBdpp78xFL7vwYupGYKSC $2a$10$ZdSqobBBhH8G73gv4OJn6uiFPZyvTieVWziK6ZBc3A/9p0YrAektu $2a$10$MAta9OsLkIYgJ93dIuSspO/Tofeu5Ov5ixpcRND8cBtj/Hqh5hwp6

在数据库中更改密码为密文:修改后上传,刷新。
重启项目,进入login页面

登录成功.

在这里插入图片描述

使用密文添加用户

修改 controller 下的 user 的 UserController的注册,密码直接存储加密之后的密码。

/* 添加用户 */@GetMapping("/user/add/{userId}/{username}/{password}/")publicStringaddUser(@PathVariableint userId,@PathVariableString username,@PathVariableString password){PasswordEncoder passwordEncoder =newBCryptPasswordEncoder();String encodedPassword = passwordEncoder.encode(password);User user =newUser(userId, username, encodedPassword); userMapper.insert(user);return"Add User Success";}
在这里插入图片描述


在这里插入图片描述

总结

掌握这些配置后,你将能够更加自信地开发和维护现代化的 Java 应用程序。同时,也希望你能根据自己的项目需求,进一步探索和扩展这些配置,为你的应用带来更多的功能和安全性。如果你在实际操作中遇到任何问题,欢迎在评论区留言,我们一起讨论和解决。

Read more

Flutter for OpenHarmony:diffutil_dart 列表差异计算引擎,高性能 UI 局部刷新的秘密武器(Myers 算法) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:diffutil_dart 列表差异计算引擎,高性能 UI 局部刷新的秘密武器(Myers 算法) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 Flutter 开发中,我们经常遇到列表更新的场景: * 用户下拉刷新,服务器返回了新的 20 条数据,其中 18 条是旧的,2 条是新的,还有 1 条被删除了。 * 我们需要更新 ListView 或 SliverList。 直接调用 setState 重新构建整个 List 确实简单,但性能有损耗,而且会导致 Scroll 位置丢失、动画生硬。我们希望能够: * 只插入那 2 条新数据。 * 只移除那 1 条旧数据。 * 并伴随优雅的插入/移除动画(使用 AnimatedList)。 diffutil_dart 就是解决这个问题的算法库。

By Ne0inhk
数据结构:队列

数据结构:队列

前言  本篇文章将讲解队列的概念和结构,队列的实现等知识的相关内容,本章代码实现的知识,与单向链表相关,所以如果还没看过单向链表文章,可以看看: https://blog.ZEEKLOG.net/2401_86982201/article/details/154615762?fromshare=blogdetail&sharetype=blogdetail&sharerId=154615762&sharerefer=PC&sharesource=2401_86982201&sharefrom=from_link 一、队列概念与结构 概念 与栈的数据结构类似,队列:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(First In

By Ne0inhk
cJSON 1.7.19 源码深度分析:数据结构、解析流程与深度注释实践

cJSON 1.7.19 源码深度分析:数据结构、解析流程与深度注释实践

本文基于 cJSON 1.7.19 源码,从核心数据结构、JSON 解析/生成流程、内存管理到深度注释实践,系统梳理这一轻量级 JSON 库的设计与实现,适合 C 语言进阶与嵌入式开发学习。 目录 * 一、前言 * 二、核心数据结构:cJSON 结构体 * 2.1 结构体定义 * 2.2 内存布局(64 位系统示意) * 2.3 类型系统:位掩码设计 * 2.4 树状链表:一个例子 * 三、核心流程一:JSON 解析(字符串 → cJSON 树) * 3.1 调用链

By Ne0inhk
Flutter 三方库 statistics 鸿蒙高性能数据回归科学系统全域适配:将顶尖数理统计算法与重负载大模型双栈引擎植入微距节点彻底盘活泛计算终端底层数据-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 statistics 鸿蒙高性能数据回归科学系统全域适配:将顶尖数理统计算法与重负载大模型双栈引擎植入微距节点彻底盘活泛计算终端底层数据-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 statistics 鸿蒙高性能数据回归科学系统全域适配:将顶尖数理统计算法与重负载大模型双栈引擎植入微距节点彻底盘活泛计算终端底层数据感知系统 前言 在鸿蒙生态的智慧医疗、金融理财及运动健康类应用中,实时对传感器数据或业务流水进行深度统计分析是核心能力。例如,通过运动步频计算方差以识别走跑状态,或根据心率波动进行回归分析以预测压力指数。statistics 库作为 Dart 生态中轻量且纯粹的数学工具集,为这类需求提供了高性能的底层支持。本文将探讨如何在 OpenHarmony 上适配该库,实现设备侧的大数据即时运算。 一、原理解析 / 概念介绍 1.1 基础原理/概念介绍 statistics 库不依赖外部厚重的二进制 C++ 库,它通过 Dart 语言级优化实现了对 Iterable<num> 的原生扩展。其核心逻辑聚焦于描述性统计(Descriptive Statistics)与回归模型(Regression

By Ne0inhk