1. 整体框架
应用模型:
SpringBoot的角色是用来处理用户请求,client端向spring Boot发送请求,然后向数据库请求数据,数据库返回数据给前端。
在我的理解下 SpringBoot 类似于 管家
的角色。
2.配置MySQL
2.1下载与安装MySQL
2.2MySQL的常用操作
2.3IDEA连接MySQL
- 连接,点击右边的
数据库
->+
->数据源
->MySQL
,输入账号、密码、数据库名称,这里是kob
,点击测试连接
,成功后点击应用就可以了。
请注意,kob
是本人刚才创建的一个数据库。在MySQL的常用操作中有体现。
- 操作数据库
连接成功后打开数据库,打开我们创建的表user
3. 配置SpringBoot
3.1 添加依赖
- 在
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>
选择哪个版本号,都可以,个人习惯是最新的几个版本里选用的人最多的版本。
点击 maven
的重新加载,刷新 Maven
。
2. 在application.properties
中添加数据库配置:
//输入你自己的用户和密码
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/
显示界面就成功了
注;正常端口地址为8080,如果你修改了端口号更改端口号即可。
3.2 实现简单的CRUD :
SpringBoot
中的常用模块
pojo
层:将数据库中的表对应成Java
中的Class
mapper
层(也叫Dao层):将pojo
层的class
中的操作,映射成sql
语句
service
层:写具体的业务逻辑,组合使用mappe
r中的操作
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
@Data
@NoArgsContructor
@AllArgsContructor
public class User {
private Integer id;
private String username;
private String password;
}
2.2 在backend
创建mapper
包,创建一个 Java
类的接口 UserMapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
2.3 在backend
的 controller
下创建 user
包然后创建 UserController
.
@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
中的单个数据。
3. 添加 user 中的数据。
4. 删除 user
中的数据。
测试:127.0.0.1:8080/user/all
4. 配置Spring Security
是用户认证操作 – 一种授权机制,目的是安全。
4.1 添加依赖:
- 添加依赖,添加之后刷新。
spring-boot-starter-security
<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
接口,用来接入数据库信息。
@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
。
@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}
,才可以登录。
- 实现密文存储:
在config
下新建SecurityConfig
。
实现config.SecurityConfig
类,用来实现用户密码的加密存储。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
- 测试
在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
,这样也算登录成功。
4.4 使用密文添加用户 :
修改 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";
}