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

一、功能需求分析

接口需要满足两个需求:

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

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


二、接口设计

复制代码
GET /lovemusic/findlovemusic
参数 类型 必填 说明
musicName String 音乐名称关键词
响应设计(假设的一个例子)
复制代码
{
  "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 and
            lm.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 like
                                                                                      concat('%',#{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

相关推荐
小蒜学长2 分钟前
基于uni-app的蛋糕订购小程序的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·小程序·uni-app
麦麦大数据1 小时前
J002 Vue+SpringBoot电影推荐可视化系统|双协同过滤推荐算法评论情感分析spark数据分析|配套文档1.34万字
vue.js·spring boot·数据分析·spark·可视化·推荐算法
云飞云共享云桌面4 小时前
昆山精密机械公司8个Solidworks共用一台服务器
运维·服务器·网络·3d·自动化·制造
恒创科技HK4 小时前
中国香港服务器中常提到的双向/全程CN2是什么意思?
运维·服务器
鼠鼠我捏,要死了捏8 小时前
Spring Boot Actuator自定义指标与监控实践指南
spring boot·监控·actuator
大霞上仙8 小时前
jmeter实现两个接口的同时并发
运维·服务器·jmeter
上官浩仁8 小时前
springboot excel 表格入门与实战
java·spring boot·excel
nmxiaocui9 小时前
openssl升级
linux·运维·服务器
初学者_xuan10 小时前
零基础快速了解掌握Linux防火墙-Iptables
linux·服务器·防火墙·linux新手小白
en-route10 小时前
如何在 Spring Boot 中指定不同的配置文件?
java·spring boot·后端