【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

微服务学习笔记(2)——SpringCloud Nacos

微服务学习笔记(2)——SpringCloud Nacos

🔥我的主页:九转苍翎⭐️个人专栏:《Java SE 》《Java集合框架系统精讲》《MySQL高手之路:从基础到高阶 》《计算机网络 》《Java工程师核心能力体系构建》《RabbitMQ理论与实践》天行健,君子以自强不息。 0.前言 * SpringBoot版本:3.2.5 * SpringCloud版本:2023.0.3 * SpringCloud Alibaba版本:2023.0.1.0 * nacos版本:2.2.3(已免费上传至我的资源) * 项目源码:spring-cloud-blog 1.概述 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置和管理平台。在 Spring Cloud 体系中,

By Ne0inhk
openclaw安装gateway失败及openclaw重装

openclaw安装gateway失败及openclaw重装

解决方案 方法一:以管理员身份重新运行(最简单直接) 1. 完全关闭当前所有命令行窗口 2. 以管理员身份打开新的PowerShell或cmd: * 按 Win + S 搜索 “PowerShell” 或 “命令提示符” * 右键点击 → 选择 “以管理员身份运行” * 如果弹出UAC提示,点击"是" 安装成功后启动服务: openclaw-cn gateway start 直接运行安装命令(不需要切换目录): openclaw-cn gateway install 方法二:如果方法一不行,先解决编码问题再看真实错误 如果你想确认真实的错误信息,可以先切换编码: # 切换到UTF-8编码 chcp 65001# 然后重新运行安装命令(仍需要管理员权限) openclaw-cn gateway install 这样你就能看到真实的 拒绝访问 错误信息。 方法三:彻底卸载重装(

By Ne0inhk
Flutter 组件 flutterw_sidekick_plugin 适配鸿蒙 HarmonyOS 实战:侧翼脚手架扩展,构建工程自动化与环境一致性治理架构

Flutter 组件 flutterw_sidekick_plugin 适配鸿蒙 HarmonyOS 实战:侧翼脚手架扩展,构建工程自动化与环境一致性治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 flutterw_sidekick_plugin 适配鸿蒙 HarmonyOS 实战:侧翼脚手架扩展,构建工程自动化与环境一致性治理架构 前言 在鸿蒙(OpenHarmony)生态迈向大规模团队协作、涉及多分支并行开发及复杂的 SDK 版本管控的背景下,如何确保每一位开发者的本地构建环境(Flutter/Dart SDK)与生产基准完全对齐,已成为保障项目交付质量的“工程定海神针”。在鸿蒙设备这类强调定制化编译工具链与私有插件依赖的环境下,如果团队缺乏统一的脚手架工具,由于由于本地 SDK 版本的微小代差(如空安全检测差异),极易由于由于“环境不一致”导致代码在不同机器上产生不可预知的编译崩溃。 我们需要一种能够深度集成 Sidekick、支持自定义命令扩展且具备“强制版本锁死”能力的脚手架治理方案。 flutterw_sidekick_plugin 为 Flutter 开发者引入了基于 Sidekick

By Ne0inhk
时序数据库选型革命:深入解析Apache IoTDB的架构智慧与实战指南

时序数据库选型革命:深入解析Apache IoTDB的架构智慧与实战指南

目录 引言:时序数据时代的到来 第一章 时序数据的独特魅力与挑战 1.1 时序数据的"个性特征" 1.2 时序数据管理的"技术大山" 第二章 时序数据库的"心脏"——存储引擎 2.1 架构演进:从通用到专用 2.2 IoTDB的创新存储设计 第三章 选型的"金标准"——关键指标详解 3.1 性能指标:数据库的"体能测试" 3.2 功能完备性:数据库的"技能树"

By Ne0inhk