1. 整体框架
应用模型: SpringBoot 的角色是用来处理用户请求,client 端向 spring Boot 发送请求,然后向数据库请求数据,数据库返回数据给前端。 在我的理解下 SpringBoot 类似于 管家
的角色。
2. 配置 MySQL
2.1 下载 MySQL
Windows 下载地址
建议下载第二个:
2.2 安装 MySQL 点击下载成功的安装包:
其他页面全选默认即可 。
2.3 配置 MySQL 1. 将C:\Program Files\MySQL\MySQL Server 8.0\bin
(如果安装到了其他目录,填写相应目录的地址即可)添加到环境变量PATH
中,这样就可以在任意目录的终端中执行mysql
命令了。我这里使用的是自己电脑原来安装的MySQL Server 5.7
,本质上没有什么区别。
2. mysql
服务的关闭与启动(默认开机自动启动,如果想手动操作,可以参考如下命令) 打开命令行,输入以下命令 关闭:net stop mysql80
启动:net start mysql80
或者右击我的电脑,选择 管理
->服务和应用程序
-> 服务
-> MySQL
可以选择手动 或者关闭。
3. 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, 'yxc');
:在表中插入数据 + select * from user;
:查询表中所有数据 + delete from user where id = 2;
:删除某行数据
具体操作如下:
创建数据库kob
在 kob 下创建表user
插入两条数据
4. 使用工具来操作数据库。 我自己也不喜欢写sql
语句(懒 ),所以平常使用 Navicat for MySQL 绿色版 or Navicat for MySQL 来操作数据库,连接上直接就是按钮操作,挺方便的!刚开始接触sql
的同学可以多写写 hh,至于教程的话网上一大堆,百度一下花个几分钟学一下就行。 界面大概如下:
2.3 IDEA 连接 MySQL 1. 连接,点击右边的数据库
-> +
-> 数据源
-> MySQL
,输入账号、密码、数据库名称,这里是kob
,点击测试连接
,成功后点击应用就可以了。
2. 操作数据库 连接成功后打开数据库,打开我们创建的表user
3. 配置 SpringBoot 3.1 添加依赖 1. 在pom.xml
下添加依赖,依赖可以 Maven 仓库地址 中寻找。Spring Boot Starter JDBC
Project Lombok
MySQL Connector/J
mybatis-plus-boot-starter
mybatis-plus-generator
具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <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>
选择哪个版本号,都可以,个人习惯是最新的几个版本里选用的人最多的版本。 点击 maven
的重新加载,刷新 Maven
。
2. 在application.properties
中添加数据库配置:
1 2 3 4 5 //输入你自己的用户和密码 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/
显示界面就成功了
3.2 实现简单的CRUD
: 1. 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
也不报错。
可以不用花时间去了解类似注解的实现原理,用的时候背下来就行,这里只是简单记录一下,如果想深入了解,可以百度。
2. 取消软件包压缩:设置
-> 树外观
-> 压缩空的中间软件包
2.1 在 backend
下创建 pojo
包 创建一个类 User
,将数据库中的表 User
转化为 Java
中的 User.class
1 2 3 4 5 6 7 8 @Data @NoArgsContructor @AllArgsContructor public class User { private Integer id; private String username; private String password; }
2.2 在backend
创建mapper
包,创建一个 Java
类的接口 UserMapper
1 2 3 4 @Mapper public interface UserMapper extends BaseMapper<User> { }
2.3 在backend
的 controller
下创建 user
包然后创建 UserController
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 @RestController public class UserController { @Autowired UserMapper userMapper; /** * 查询所有用户 */ @GetMapping("/user/all/") public List<User> getAll() { return userMapper.selectList(null); } /** * 查询单个用户 */ @GetMapping("/user/{userId}/") public User getUser(@PathVariable int userId) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id",userId); return userMapper.selectOne(queryWrapper); // 范围遍历 // public List<User> 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
中的数据。
测试 :127.0.0.1:8080/user/all
4. 配置 Spring Security 是用户认证操作 – 一种授权机制,目的是安全 。
4.1 添加依赖: 1. 添加依赖,添加之后刷新。spring-boot-starter-security
1 2 3 4 5 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>2.7.0</version> </dependency>
刷新 之后显示登陆:
默认的叫 Username
是 user
,密码自动生成。
4.2 与数据库对接 : 在backend
的 service
创建 impl
包,新建 UserDetailsServiceImpl
类。 实现service.impl.UserDetailsServiceImpl
类,继承自UserDetailsService
接口,用来接入数据库信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @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<User> 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
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 @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; } }
4.3 测试 : 如果实现登录的话,需要提供一个 PassworEncoder
。 如果在数据库中指定明文来存储,需要在自己的密码加上{noop}
,才可以登录。
1. 实现密文存储: 在 config
下新建 SecurityConfig
。 实现config.SecurityConfig
类,用来实现用户密码的加密存储。
1 2 3 4 5 6 7 8 9 @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
2. 测试 在 Test
下生成需要转换的密文,同时修改数据库下的密码为密文。
查看生成的密文:
1 2 3 4 5 $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
,这样也算登录成功。
4.4 使用密文添加用户 : 修改 controller
下的 user
的 UserController
的注册,密码直接存储加密之后的密码。
1 2 3 4 5 6 7 8 9 10 11 @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"; }