【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},才可以登录。
- 实现密文存储:
在 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);}}- 测试
在 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 应用程序。同时,也希望你能根据自己的项目需求,进一步探索和扩展这些配置,为你的应用带来更多的功能和安全性。如果你在实际操作中遇到任何问题,欢迎在评论区留言,我们一起讨论和解决。