项目目前已经上线
在上一篇文章中,我们完成了上传音乐文件,数据库存储音乐文件信息,以及播放音乐模块
本篇文章,将一起和铁子们完成,指定音乐删除、音乐批量删除、查询音乐功能模块!深刻体会分层架构的好处!冲!塔塔开!!!
这一层我们要做的工作主要是
①通过拿到音乐的id,到数据库中去查询音乐
②数据库中删除音乐
不多bb,直接上代码
/**
* 根据Id查询音乐
* @param id
* @return
*/
Music findMusicById(int id);
/**
* 根据ID删除音乐
* @param musicId
* @return
*/
int deleteMusicById(int musicId);
<select id="findMusicById" resultType="com.example.musicserver.model.Music">
select * from music where id = #{id};
</select>
<delete id="deleteMusicById">
delete from music where id = #{id};
</delete>
业务逻辑层去处理具体的查询逻辑和删除逻辑~~
/**
* 删除单首音乐
* @param id
* @return
*/
@RequestMapping("/deleteMusic")
public ResponseBodyMessage<Boolean> deleteMusic(@RequestParam String id){
int iid = Integer.parseInt(id);
Music music = musicService.findMusicById(iid);
if(music == null){
return new ResponseBodyMessage<>(-1,"没有找到你要删除的音乐",false);
}
int result = musicService.deleteMusic(iid,music);
if(result == -1){
return new ResponseBodyMessage<>(-1,"删除数据库中的音乐失败",false);
}else if(result == -2){
return new ResponseBodyMessage<>(-1,"删除服务器中的音乐失败",false);
}
//库中和服务器中都删除成功,现在看收藏中是否含有该音乐,若有则删
int ret = loveMusicService.deleteLoveMusicById(iid);
if(ret == 1){
log.info("收藏中该音乐也被删除");
}
return new ResponseBodyMessage<>(0,"删除服务器中的音乐成功",true);
}
public Music findMusicById(int iid) {
return musicMapper.findMusicById(iid);
}
这里我们数据库中删除的只是音乐信息,我们还要删除这个电脑中(也就是服务器)保存的音乐文件,这里我们利用,在查询音乐操作中获取到的Music对象,来获取我们的音乐文件名字
我们从“=”的下一个字符截取到末尾,创建虚拟文件,传入文件路径,最后删除硬盘中存储的音乐
/**
*
* @param iid
* @param music MusicController中已经在数据库中查到music的信息,并把music作为参数传过来了
* @return
*/
public int deleteMusic(int iid , Music music) {
//1:删除数据库中的音乐
int result = musicMapper.deleteMusicById(iid);
if(result != 1){
return -1;
}
//2:数据库中删除成功,那么服务器中的数据也要进行删除
int index = music.getUrl().lastIndexOf("=");
String fileName = music.getUrl().substring(index+1);//获取该音乐名称,不包含.mp3
File file = new File(SAVE_PATH + "/" + fileName + ".mp3");
log.info("此时的路径为:{}",file.getPath());
//删除数据库中的音乐信息
if(!file.delete()){
return -2;
}
return 1;
}
这个模块我们就需要去思考一下了,前端会返回给我们很多个音乐id,类似集合,我们后端需要对拿到的集合中所有的音乐id进行查询操作,并进行删除
这里我们使用@RequesParam来进行参数绑定,我们这个方法拿到的参数,是一个集合,其实逻辑也很简单,遍历这个集合,对拿到的每一个id,进行单曲音乐删除不就OK了~~,使用sum作为一个计数器。
/**
* 批量删除音乐
* @param idList
* @return
*/
@RequestMapping("/batchDeleteMusic")
public ResponseBodyMessage<Boolean> batchDeleteMusic(@RequestParam("id") List<Integer> idList){
int sum = 0;
for(int i = 0 ; i < idList.size() ; i++){
int id = idList.get(i);
Music music = musicService.findMusicById(id);
int result = musicService.deleteMusic(id, music);
if(result == -1){
return new ResponseBodyMessage<>(-1,"删除数据库中的音乐失败",false);
}else if(result == -2){
return new ResponseBodyMessage<>(-1,"删除服务器中的音乐失败",false);
}
loveMusicService.deleteLoveMusicById(music.getId());
sum += result;
}
if(sum == idList.size()){
return new ResponseBodyMessage<>(0,"批量删除成功",true);
}else{
return new ResponseBodyMessage<>(-1,"批量删除失败",false);
}
}
思考:我们查询音乐有哪些常见场景
比如:我很喜欢听周杰伦的歌~,那么我搜索周杰伦,音乐列表就应该给我显示所有包含周杰伦的歌曲对吧——《晴天——周杰伦》《可爱女人——周杰伦》《兰亭序——周杰伦》..........
那么这里我们后端的sql语句就应该要支持模糊查询
如果我们查询为空呢?那音乐列表就应该直接显示所有音乐
不多bb上图,这里使用postman给大家演示的
我们的请求和响应模块也这么设计
/**
* 根据歌曲名字,查询音乐
* @param musicName
* @return
*/
List<Music> findMusicByMusicName(String musicName);//模糊查询
/**
* 查询所有音乐
* @return
*/
List<Music> findAllMusic();
介绍一下这里的模糊查询
concat关键字,是sql中字符串连接操作,通常用于实现模糊查询
不懂模糊查询的童鞋到看看阿华的这篇文章
【MySQL】数据库的创建和增删查改使用操作(超详细)_数据库操作-CSDN博客
<select id="findMusicByMusicName" resultType="com.example.musicserver.model.Music">
select * from music where title like concat('%',#{musicName},'%') ;
</select>
<select id="findAllMusic" resultType="com.example.musicserver.model.Music">
select * from music;
</select>
/**
* 找歌曲
* @param musicName 可以传入参数
* @return
*/
@RequestMapping("/findMusic")
public ResponseBodyMessage<List<Music>> findMusic(@RequestParam(required = false) String musicName){
log.info("查询界面");
List<Music> musicList = null;
if(musicName == null){
musicList = musicService.findAllMusic();
}else {
musicList = musicService.findMusic(musicName);
}
return new ResponseBodyMessage<>(0,"查询到了歌曲信息",musicList);
}
public List<Music> findAllMusic() {
return musicMapper.findAllMusic();
}
public List<Music> findMusic(String musicName) {
return musicMapper.findMusicByMusicName(musicName);
}