Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库

系列目录

Spring Boot+Vue项目 微博系统

目录

  • 系列目录
  • 前言
  • 创建用户
    • 数据库创建user表
    • 程序创建User实体
  • 访问数据库
    • dao层
    • service层
    • 测试
  • 总结

前言

前边已经定位到,如果要想用Spring Security做自定义权限认证,只需要实现框架内的 UserDetailsService 接口,在其loadUserByUsername方法中,访问自己的数据库获取用户。然后把我们自己写的service配置上即可,所以按部就班,先创建数据库表。

创建用户

数据库创建user表

通过命令行或数据库可视化工具在blog数据库下创建user表。也可以用IDEA内置的数据库管理工具来操作,点击View=》Tool Windows=》Database,点击 + =》datasource 来选择、配置、操作数据库。这里先简单的创建一个用户表:自增主键idusernamepassword
Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库_第1张图片

create table user
(
	id bigint auto_increment comment '自增主键',
	username varchar(256) default '' not null comment '用户名',
	password varchar(256) default '' not null comment '密码',
	constraint user_pk
		primary key (id)
)
comment '用户表';

我用的是8版本的MySQL,不同关系型数据库在语法上可能会有细微差异,但是大差不差,也好改。

这里注意,在设计数据库时,对于那些没有初值的字段,最好设置not null并指定默认初值,防止在程序中出现NullPointerException异常,比如这里我把username、password默认初值设置为''空字符串。

程序创建User实体

在默认路径下,右键创建 model.entity目录下的 User类。
Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库_第2张图片
Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库_第3张图片

User类中添加与数据库对应的字段。

package cn.novalue.blog.model.entity;

import lombok.Data;

@Data
@TableName("user")
public class User implements Serializable {
	@TableId(type = IdType.AUTO)
    private Long id;
    private String username;
    private String password;
}

这里使用的Lombok的注解来简化实体的编写,@Data会自动生成该类所有非final字段的getter、setter方法,以及toStringhashCode方法等。这样代码看起来会清爽很多。

@TableName@TableId(type = IdType.AUTO)是MyBatis Plus的注解,即标注该类与数据库哪个表对应,并且定义主键字段以及主键策略(自增)。

可以在TestController中新建个User对象测试
Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库_第4张图片
可以看到IDEA已经能够提示setter方法了。

访问数据库

典型的spring boot项目中一般都会有以下三层:

层级 功能
controller 对应不同的用户请求,然后调用相应的service来处理请求,并返回结果
service 负责主要的业务处理,接收controller层传来的数据并处理,其中可能会使用dao层提供的接口来访问数据库。一般会写个xxService接口和xxServiceImpl实现类
dao 提供访问数据库的接口

看一看感觉有些臃肿,因为对于小项目可能并不需要分这么多层。但是还是规范着来吧。其实现在这些都是可以自动生成的,有各种各样的方法,比如Mybatis Generator啥的,建议初学还是多手动敲敲,等到熟悉一些了再自动生成。

所以自底向上,先从dao开始。

dao层

使用过MyBatis的都知道,MyBatis都会写一个接口类与对应的数据库表对接,并且配置个对应的xml文件,在文件中写具体的SQL语句。执行的时候,我们只需要调用接口类中的对应方法,它会去执行xml中配置的SQL语句,然后把返回结果封装成对应的对象返回。

新建dao包,并新建UserDao接口类,编写对应的方法。

package cn.novalue.blog.dao;

import cn.novalue.blog.model.entity.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;


@Repository
public interface UserDao {
	User findByUsername(@Param("username") String username);
}

然后在 resources目录下,新建 mapper包.
Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库_第5张图片
新建 UserMapper.xml



<mapper namespace="cn.novalue.blog.dao.UserDao">

    <select id="findByUsername" resultType="cn.novalue.blog.model.entity.User">
        select * from user where username = #{username}
    select>

mapper>

这里的说明该文件与UserDao对应, 标签就与 findByUsername 方法对应,resultType="cn.novalue.blog.model.entity.User" 与方法的返回值对应。#{username} 与对应配置的 @Param("username") 对应。

其实这里还有个知识点,MyBatis中获取参数有两种方式: #{}${},具体区别网上很容易搜到,还可以延伸了解下占位符,SQL预编译,SQL注入等知识。这里就不多解释了。

service层

按照规范,新建service包,包下新建UserService接口文件:

import cn.novalue.blog.model.entity.User;

public interface UserService {
    User findByUsername(String s);
}

注意这里的 findByUsername 和之前dao层的方法没啥关系,只是为了统一,都用一个名字了。

service包下,新建impl包,用于放Service的对应实现类。然后在impl包下,新建UserServiceImpl类:
Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库_第6张图片

import cn.novalue.blog.dao.UserDao;
import cn.novalue.blog.model.entity.User;
import cn.novalue.blog.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;
	@Override
	User findByUsername(String s) {
		return userDao.findByUsername(s);
	}

在实现类里,调用 dao 层的方法,根据输入的用户名,从数据库中读取用户信息。注意添加 @Service注解,为了Spring能将其加入到容器中。

到此我们就可以通过调用UserService.findByUsername方法从数据库中获取数据了,以后也业务流程也都差不多。

测试

为了测试数据库访问操作,可以先在数据库可视化工具中手动插入一条数据。
在这里插入图片描述
这里因为Spring Security默认会以加密方式(BCryptPasswordEncoder类)校验密码。
Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库_第7张图片
所以为了后续借助Spring Security操作,我先手动生成了个账户密码:

zhangsan
$2a$10$5PerCq8LezShd0TRwudup.MkzrTSni.DGUF2VReOszKUYaEjsXj9C

可以理解为输入账号:“zhangsan”,密码:“zhangsan”即可匹配这条数据。

然后新建个测试类试一下,在项目中有个 test目录如下:
Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库_第8张图片
这里新建个UserTest测试类,来测试功能。

package cn.novalue.blog;

import cn.novalue.blog.model.entity.User;
import cn.novalue.blog.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;

@SpringBootTest
public class UserTest {
    @Autowired
    private UserService userService;

	@Test
	public void testUser(){
        String username = "zhangsan";
        User user = userService.findByUsername(username);
        String password = user.getPassword();
        System.out.println(password);
	}

点击运行该方法,即可看到从数据库中读取到的密码:

在这里插入图片描述

总结

到此我们已经能够通过调用userService.findByUsername从数据库获取用户了,再按照之前的结论,实现UserDetailsService接口并配置即可。下一步就来配置Spring Security,实现登录用户登录功能。

上一篇:
Spring Boot+Vue项目 微博系统(5):Spring Security登录流程源码分析
下一篇:
Spring Boot+Vue项目 微博系统(7):Spring Boot+Vue项目 微博系统(7):登录流程后端实现之配置Spring Security

你可能感兴趣的:(Spring,Boot,+,Vue项目)