数据库表的关系无非就四种:1、一对多(多对一),2、一对一,3、多对多,4、没有关系。其实面对数据表的多对多关系并没有那么复杂,那要看你怎么实现,传统的方法无非就是查询sql语句,而我要的是不通过自己写sql语句来达到查询出数据。这个我貌似不会,在网上找了太多资料,结果太让我失望了,不是要xml文件就是注解写sql,多对多的关系处理不清。想了好久,也碰到好多壁障,不过还是做出来了。

功能:通过中间表查询出与之关联的表的个别字段数据

传统方法(注解编写sql语句的方式)

  • 表关系(歌单表、歌曲表、歌曲集合表(中间表))
    一个歌单可以有多首歌曲,一首歌曲可以有多个歌单。
    这是歌曲表:

    这是歌单表:

    这是中间表:

代码(注解sql语句方式)

  • 创建一个实体类接收数据:
/*** 歌单歌曲id*/private  Integer id;/*** 歌曲id*/private Integer songId;/*** 歌单id*/private Integer songListId;/*歌曲表*/private Song song;/*曲名*/private String name;/*歌单*/private SongList songList;/*歌单标题*/private String title;
  • dao层
@Select("select song.name,song_list.title from list_song inner join song on list_song.song_id=song.id\n" +"join song_list on list_song.song_list_id=song_list.id where list_song.song_list_id=#{id} ")List<ListSongUtils> selectsong(@Param("id")Integer id);
//sql语句我一般都是在数据库写好了再复制过来,这样可以降低sql语句出错的概率
//参数id是通过前端传过来的,是歌单id(根据歌单id查询歌单里的歌曲集合)
  • service层
 List<ListSongUtils> selectsong(@Param("id")Integer id);
  • serviceImpl实现层
//引用dao层@AutowiredListSongMapper listSongMapper;@Overridepublic List<ListSongUtils> selectsong(Integer id) {//返回数据return listSongMapper.selectsong(id);}
  • 测试-测试类
//引入service@AutowiredListSongService listSongService;//这里直接调用方法@Testvoid test01() {List<ListSongUtils> gg = listSongService.selectsong(1);System.out.println(gg);}
  • 测试-controller
 @RequestMapping("/jjjop")public void ggkk(){List<ListSongUtils>llmm =listSongService.selectsong(1);System.out.println(llmm);}

无sql语句查询

无sql语句查询就比较简单(我是说操作步骤)。要完成接下来的操作要导入mybatis-plus的依赖(因为我本来用的就是mybatis-plus)要导入依赖请跳往mybatis-plus官网
然后利用mybatis-plus service层继承IService

public interface ListSongService extends IService<ListSong> {}
  • 直接测试-测试类
    @AutowiredListSongService listSongService;@AutowiredSongService songService;@Testvoid test02() {//创建一个map容器Map<String, Object> columnMap=new HashMap<>();//给map容器中放值columnMap.put("song_list_id",1);//调用IService类中的方法listByMap(解析在下面)//查询出中间表的数据List<ListSong> gg = listSongService.listByMap(columnMap);//创建一个list集合,集合的类型是:IntegerList<Integer>songids=new ArrayList<>();for (int i=0; i<gg.size();i++){//for循环个list集合中放值//取值的对象查询中间表数据中的歌曲的id集合songids.add(gg.get(i).getSongId());}//调用IService类中的方法listByIds(解析在下面)List<Song> nn = songService.listByIds(songids);//创建一个集合,集合里面装的是一个map容器List<Map<Object,Object>> hh=new ArrayList<>();//for循环往map里赋值在给到集合里,这里值的注意的是创建map的对象要在循环体里://因为如果在循环体外那么就相当只创建了一个map它的地址值不变,最后只会得到循环最后一位的值(即:得到多个一样的值)for (int i=0; i<gg.size();i++){Map<Object,Object> kk=new HashMap<>();//给map放值kk.put("id",gg.get(i).getId());kk.put("name",nn.get(i).getName());//给集合放值hh.add(kk);}//输出System.out.println(hh);}
//IService类listByMap方法解析:
//在创建一个map容器后给容器赋值:columnMap.put("song_list_id",1),前面song_list_id是数据库字段名,后面的1是字段名的值。具体使用方法可去mybatis-plus官网查询//IService类listByIds方法解析:是根据主键id的集合批量查询数据
//
  • 测试-controller
@GetMapping("/selectListsong")public List<Map<Object,Object>> selectListsong(@RequestParam("id") Integer id){//根据表字段查询数据Map<String, Object> columnMap=new HashMap<>();columnMap.put("song_list_id",id);List<ListSong> gg = listSongService.listByMap(columnMap);//创建一个集合,通过for循环取出ListSong表中歌曲的idList<Integer>songids=new ArrayList<>();for (int i=0; i<gg.size();i++){songids.add(gg.get(i).getSongId());}//通过id的集合查询数据数据List<Song> nn = songService.listByIds(songids);List<Map<Object,Object>> hh=new ArrayList<>();for (int i=0; i<gg.size();i++){Map<Object,Object> kk=new HashMap<>();kk.put("id",gg.get(i).getId());kk.put("name",nn.get(i).getName());hh.add(kk);}return hh;}
//注解我就不写了,跟测试类的一样

mybatis-plus多表查询(三表多对多关系)相关推荐

  1. java day55【 Mybatis 连接池与事务深入 、 Mybatis 的动态 SQL 语句、 Mybatis 多表查询之一对多 、 Mybatis 多表查询之多对多】...

    第1章 Mybatis 连接池与事务深入 1.1 Mybatis 的连接池技术 1.1.1 Mybatis 连接池的分类 1.1.2 Mybatis 中数据源的配置 1.1.3 Mybatis 中 D ...

  2. Mybatis连3表查询数据resultMap结果映射

    Mybatis连结3表查询数据resultMap结果映射 一.前言 Mybatis实现了sql与java代码的分离,达到了解耦合的目的,配置sql语句时有个resultType="" ...

  3. 【MyBatis】多表查询

    MyBatis的多表查询 表之间的关系:一对多,多对一,一对一,多对多. 一对多:一个班级对应多个学生 多对一:多个学生对应一个班级 一对一:一个人对应一个身份证号码 多对多:一个订单可以有多个商品, ...

  4. 【Mybatis】MyBatis 实现多表查询

    大纲 Auto Mapping 单表实现(别名方式) <resultMap>实现单表配置 单个对象关联查询(N+1,外连接) 集合对象关联查询 注解开发 MyBatis 运行原理 准备:创 ...

  5. MyBatis 实现多表查询、resultMap 标签、MyBatis 注解、mybatis运行原理

    内容 Auto Mapping 单表实现(别名方式) 实现单表配置 单个对象关联查询(N+1,外连接) 集合对象关联查询 注解开发 MyBatis 运行原理 一.MyBatis 实现多表查询 Myba ...

  6. mybatis分页多表查询

    mybatis分页多表查询 我们常遇到一种情况,数据量比较大,如果使用前台分页,在前台如果有权限,有逻辑判断,都会大大降低页面加载的速度,我们需要分页,单表查询的网上方法很多,这里就不赘余了,多表关联 ...

  7. Mybatis实现关联表查询

    Mybatis实现关联表查询 6.1. 一对一关联 1). 提出需求 根据班级 id 查询班级信息(带老师的信息) 2). 创建表和数据 [](javascript:void(0)

  8. hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例

    hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例 : 操作环境 :Windows 10 教育版.eclipse.MySQL数据库.SQLyog数据库管理工具 MySQL ...

  9. mybatis框架实现一对多、多对多关系查询,以及递归查询(单表多级分类:省市区三级地址查询)

    mybatis框架练习 mybatis框架中,包括实体类(这些实体类与数据库中的字段属性相对应),mybatis的配置文件(即mybatis-config.xml,这个配置文件用于连接实体类和orm( ...

  10. Mybatis实现多表查询(一对一、一对多、多对多)

    文章目录 一.一对一查询 1.1 模型 1.2 SQL语句 1.3 创建Order和User实体类 1.4 创建OrderMapper接口 1.5 配置OrderMapper.xml 1.6 测试 二 ...

最新文章

  1. 线程返回值的方式介绍
  2. DBScript:轻量级ORM
  3. python 摄像头录制帧率_基于opencv和python的可变帧速率IP摄像机视频记录
  4. 外挂安装eclipse插件
  5. HDU - 6992 Lawn of the Dead 线段树 + 思维
  6. CentOS 7.0 上安装和配置 VNC 服务器
  7. Swift - 发送消息(文本,图片,文件等)给微信好友或分享到朋友圈
  8. 【SICP归纳】6 副作用与环境模型
  9. Bootstrap 表格的默认样式
  10. 3.企业应用架构模式 --- 映射到关系数据库
  11. 最小生成树:朴素版prim、kruskal(附例题)
  12. 无线传感器网络(一)基于无锚节点的WSN系统设计
  13. 简单的求三角函数sin,cos的图像
  14. origin调整纵坐标刻度值_Origin数据图坐标刻度值特殊标注的方法
  15. 大数据:对大数据的理解
  16. 兔云资讯_游戏研发工程师面试更新_20200801
  17. 一文读懂,WMS仓库管理系统模块功能
  18. python 打印三角形
  19. SQL注入——SQL注入具体防御方案
  20. 关于Redis的远程连接 Connection: Disconnect on error 问题

热门文章

  1. isspace在python中是什么意思
  2. java malloc_malloc和free函数详解
  3. 欧美 手机ios android,全球第3大手机系统,比安卓IOS都流畅,却逐渐被人遗忘!...
  4. 学计算机显卡要求,学计算机的,电脑需要什么配置?
  5. 【Java百炼成神】大魂师进阶篇——ArrayList、LinkedList、Vector、HashSet
  6. 雅虎天气API 多语言参数
  7. 基于PHP的潮鞋商城系统
  8. ntp的server的上游跳变对ntp的server及client的影响
  9. Photoshop中怎么画虚线
  10. vue 点击事件失效