当前位置: 首页 > news >正文

【Springboot服务实现类】用户登录逻辑梳理(未完待续)

一、初级理解版本

在UserController类中代码是这样的:

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate IUserService userService;@GetMapping("/all")public Result<List<User>> getAllUser(){List<User> list=userService.list();return Result.success(list,"查询成功");}@PostMapping("/login")public Result<Map<String,Object>> login(@RequestBody User user){Map<String,Object> data=userService.login(user);if(data!=null){return Result.success(data);}return Result.fail(20002,"用户名或密码错误");}
}

        前端把用户名和密码POST过来之后,在login参数前面加一个@RequestBody,用于将 HTTP 请求体中的 JSON 数据直接绑定到方法参数上。它的作用是在控制器的方法中自动解析请求体中的数据,并将其转换为指定的 Java 对象。 所以就是将JSON中的数据自动转化为一个java实体类对象。

IUserService是一个接口类,里面直写接口,接口的实现在UserServicelmpl中,UserServicelmpl代码如下:

    @Overridepublic Map<String, Object> login(User user) {//根据用户名和密码进行查询LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>();wrapper.eq(User::getUsername,user.getUsername());wrapper.eq(User::getPassword,user.getPassword());User loginUser=this.baseMapper.selectOne(wrapper);//结果不为空,则生成token给前端,并且把用户信息存入redisif(loginUser!=null){//暂时用UUID,终极方案用jwtString key="user:"+UUID.randomUUID();//存入redis//返回数据Map<String,Object> data=new HashMap<>();data.put("token",key);return data;}return null;}

其中:

LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>();
wrapper.eq(User::getUsername,user.getUsername());
wrapper.eq(User::getPassword,user.getPassword());
User loginUser=this.baseMapper.selectOne(wrapper);
  • LambdaQueryWrapper<User>:这是MyBatis-Plus提供的一个查询包装器,用于构建条件查询。这里使用LambdaQueryWrapper来生成查询条件。
  • wrapper.eq(User::getUsername,user.getUsername()):构建查询条件,查询数据库中username字段等于传入user对象的用户名。
  • wrapper.eq(User::getPassword,user.getPassword()):继续构建查询条件,查询password字段等于传入user对象的密码。
  • this.baseMapper.selectOne(wrapper):使用生成的条件查询用户信息。如果数据库中存在匹配的用户,则返回该用户对象;否则返回null

那么扩展一下这个查询包装器,如果是针对其他的查询条件,一些例子如下:

wrapper.eq(User::getStatus, 1);
// 查询 status 字段等于 1 的记录,类似SQL中的=wrapper.ne(User::getStatus, 0);
// 查询 status 字段不等于 0 的记录,类似SQL中的<>wrapper.gt(User::getAge, 18);
// 查询 age 字段大于 18 的记录,类似SQL中的>wrapper.lt(User::getAge, 60);
// 查询 age 字段小于 60 的记录,类似SQL中的<wrapper.ge(User::getAge, 18);
// 查询 age 字段大于或等于 18 的记录,类似SQL中的>=wrapper.le(User::getAge, 60);
// 查询 age 字段小于或等于 60 的记录,类似SQL中的<=wrapper.like(User::getUsername, "admin");
// 查询 username 字段包含 "admin" 的记录,模糊查询,类似SQL中的LIKEwrapper.between(User::getAge, 18, 30);
// 查询 age 字段在 18 到 30 之间的记录,类似 SQL 中的 BETWEEN ... AND ...wrapper.orderByAsc(User::getAge);
// 按照 age 字段升序排列,类似 SQL 中的 ORDER BYwrapper.isNotNull(User::getEmail);
// 查询 email 字段不为空的记录,类似 SQL 中的 IS NULL 和 IS NOT NULL

举一些具体的例子:

(1)查询年龄在18到25岁之间,并且用户名包含 "test" 的用户,按年龄升序排列

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.between(User::getAge, 18, 25).like(User::getUsername, "test").orderByAsc(User::getAge);
List<User> users = userMapper.selectList(wrapper);

(2)查询所有 status 字段为 1 并且 email 不为空的用户

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getStatus, 1).isNotNull(User::getEmail);
List<User> users = userMapper.selectList(wrapper);

(3)查询用户名等于 "admin" 或者年龄大于30岁的用户

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUsername, "admin").or().gt(User::getAge, 30);
List<User> users = userMapper.selectList(wrapper);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据库与缓存一致性的解决方案
  • django(一):项目搭建
  • python-pptx - Python 操作 PPT 幻灯片
  • Node.js中离线集成ip2region:实现高效的IP地址定位
  • 【网络安全】服务基础第一阶段——第六节:Windows系统管理基础---- DNS部署与安全
  • 单片机的主流编程语言是什么
  • Vue的计算属性:methods方法、computed计算属性、watch监听属性
  • 拿到一个新项目,如何开展测试?
  • 应对Nginx负载均衡中的请求超时:策略与配置
  • Mysql在服务器中的源码部署
  • sqli-labs靶场通关攻略(41-50)
  • 如何通过日志或gv$sql_audit,分析OceanBase运行时的异常SQL
  • Linux: SPI应用编程
  • OpenCV 100道面试题及参考答案(7万字长文)
  • 错误: 找不到或无法加载主类 App.class,Java文件是怎么编译的
  • @angular/forms 源码解析之双向绑定
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【EOS】Cleos基础
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • CAP理论的例子讲解
  • emacs初体验
  • go语言学习初探(一)
  • Linux gpio口使用方法
  • react-native 安卓真机环境搭建
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • select2 取值 遍历 设置默认值
  • webpack+react项目初体验——记录我的webpack环境配置
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 每天10道Java面试题,跟我走,offer有!
  • 数据仓库的几种建模方法
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 我的面试准备过程--容器(更新中)
  • 小试R空间处理新库sf
  • 应用生命周期终极 DevOps 工具包
  • 用jQuery怎么做到前后端分离
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Linux权限管理(week1_day5)--技术流ken
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Forward) Music Player: From UI Proposal to Code
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (五)Python 垃圾回收机制
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转) ns2/nam与nam实现相关的文件
  • (转)负载均衡,回话保持,cookie
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net - 类的介绍
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)