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

Spring Boot音乐服务器项目-查询喜欢的音乐模块

一、功能需求分析

接口需要满足两个需求:

  1. 模糊查询:支持按音乐名称关键词搜索收藏的歌曲

  2. 全量查询:当不传参数时,返回用户所有收藏的音乐


二、接口设计

GET /lovemusic/findlovemusic
参数类型必填说明
musicNameString音乐名称关键词
响应设计(假设的一个例子)
{"status": 0,"message": "查询到了所有的收藏的音乐","data": [{"id": 19,"title": "银河与星斗(女生版)","singer": "gaobo","url": "/music/get?path=银河与星斗(女生版)","time": "2022-03-28","userid": 3}]
}

三、接口实现

Mapper接口设计
    /**如果没有传⼊具体的歌曲名,显⽰当前⽤⼾收藏的所有⾳乐@param userId@return*/List<Music> findLoveMusicByUserId(int userId);/**根据某个⽤⼾的ID和歌曲名称查询,某个⽤⼾收藏的⾳乐@param musicName@param userId@return*/List<Music> findLoveMusicBykeyAndUID(String musicName, int userId);
XML映射配置
<resultMap id="BaseMap1" type="com.example.musicplayer.model.Music"><id column="id" property="id" /><id column="title" property="title" /><id column="singer" property="singer" /><id column="time" property="time" /><id column="url" property="url" /><id column="userId" property="userId" /></resultMap><select id="findLoveMusicByUserId" resultMap="BaseMap1">select m.* from lovemusic lm,music m where m.id = lm.music_id andlm.user_id=#{userId}</select><resultMap id="BaseMap2" type="com.example.musicplayer.model.Music"><id column="id" property="id" /><id column="title" property="title" /><id column="singer" property="singer" /><id column="time" property="time" /><id column="url" property="url" /><id column="userId" property="userId" /></resultMap><select id="findLoveMusicBykeyAndUID" resultMap="BaseMap2">select m.* from lovemusic lm,music m where m.id = lm.music_id and lm.user_id=#{userId} and title likeconcat('%',#{musicName},'%')</select>

这一段语句,相对于之前的Mybatis语句显得稍微复杂一点,我们可以简单的分析一下这段语句:

        在SQL中,当使用逗号(,)连接两个表(如`from lovemusic lm, music m`)而不指定连接条件时,会产生笛卡尔积(即两个表所有行的组合)。但是,在这个例子中,where子句中指定了连接条件(`m.id = lm.music_id`)以及额外的过滤条件(`lm.user_id=#{userId}`)。因此,这里并不是笛卡尔积,而是内连接(等价于使用INNER JOIN)。

INNER JOIN就是同时将两表作为参考对象,根据ON后给出的两表的条件将两表连接起来。结果则是两表同时满足ON后的条件的部分才会列出。 


四、服务层实现

Controller核心逻辑
@RequestMapping("/findlovemusic")public ResponseBodyMessage<List<Music>>findLoveMusic(@RequestParam(required=false)String musicName,HttpServletRequest req) {//没有session不创建HttpSession httpSession = req.getSession(false);if(httpSession == null ||httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {System.out.println("没有登录!");return new ResponseBodyMessage<>(-1,"没有登录",null);}User user = (User)httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);int userid = user.getId();List<Music> musics = new ArrayList<>();if(musicName != null) {musics = loveMusicMapper.findLoveMusicBykeyAndUID(musicName,userid);}else {musics = loveMusicMapper.findLoveMusicByUserId(userid);}return new ResponseBodyMessage<>(0,"查询到了所有的收藏的⾳乐",musics);}

由于并没有放任何数据进去,所以我们看到的data里面的内容都是空的。

我们尝试做一些违法操作,直接在数据库中塞入一条数据。我们就可以看到!!

一些参考点:

  1. 使用@RequestParam(required=false)实现可选参数

  2. 通过Session验证用户状态

  3. 根据参数动态选择查询方法

  4. 统一响应格式封装

代码仓库:

查询喜欢/收藏⾳乐模块设计 2025.7.30 /音乐服务器 - Gitee.com

http://www.xdnf.cn/news/1212139.html

相关文章:

  • 企业级应用安全传输:Vue3+Nest.js AES加密方案设计与实现
  • 常见CMS获取webshell的方法-靶场练习
  • 基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(三)
  • YOLOv5u:无锚点检测的革命性进步
  • 智能AI医疗物资/耗材管理系统升级改造方案分析
  • 【C++】类和对象(中)拷贝构造、赋值重载
  • BT131-800-ASEMI家电领域专用BT131-800
  • Hutool 的 WordTree(敏感词检测)
  • 第2章 cmd命令基础:常用基础命令(2)
  • 中国高铁从追赶到领跑的破壁之路
  • 磁盘io查看命令iostat与网络连接查看命令netstat
  • FFmpeg,如何插入SEI自定义数据
  • MidJourney精选图集与提示词生成器:AI创意灵感与高效提示词工具
  • 无监督MVSNet系列网络概述
  • 高效管理Hosts文件的终极工具
  • 【Qt开发】信号与槽(三)-> 自定义信号和槽
  • Python 程序设计讲义(46):组合数据类型——集合类型:集合间运算
  • 解决 Node.js 托管 React 静态资源的跨域问题
  • 力扣54:螺旋矩阵
  • 疯狂星期四文案网第24天运营日记
  • 永磁同步电机FOC控制----电流采样的实现
  • 【Lambda】flatMap使用案例
  • 字节跳动“扣子”(Coze)开源:AI智能体生态的技术革命
  • 从结构到交互:HTML5进阶开发全解析——语义化标签、Canvas绘图与表单设计实战
  • 微软OpenAI展开深入谈判
  • DIV 指令概述
  • 视觉语言模型在视觉任务上的研究综述
  • HTML第一次作业
  • JavaWeb 进阶:Vue.js 与 Spring Boot 全栈开发实战(Java 开发者视角)
  • 【数据结构初阶】--二叉树(四)