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

MyBatis一对多查询,MyBatis中resultMap的使用,MyBatis中collection注意事项,MyBatis的级联搜索

我们都知道对于简单的一对多查询,我们可以先将一的全部属性查询出来,然后再通过第二次查询将多端也查询出来,这样做通过两条SQL语句通俗易懂,但是有没有办法通过一条SQL语句直接返回一对多的查询结果呢?

模型说明:

一个Banner 内部包含多个BannerItem,最终我们要根据Banner的name来查询出Banner的属性以及该Banner包含的所有BannerItem

模型类:

//最终要返回的类:
@Data
@NoArgsConstructor
public class BannerByNameVo {
    private Long id;

    private String name;

    private String description;

    private String title;

    private String img;

    private List<BannerItem> items;
}

//BannerItem类:
@Data
public class BannerItem implements Serializable {
    private Long id;

    private String img;

    private String keyword;

    private Short type;

    private Integer bannerId;

    private String name;
}

XML文件部分:

1、查询语句部分

    <select id="selectByNames" resultType="List">
        select *
        from banner b
                 join banner_item bi on bi.banner_id = b.id
        where b.name = #{name};
    </select>

当我们直接将上述SQL语句放到MySQL中运行时,会给我们返回:(数据库中该Banner有3个BannerItem属性)

 将二者的所有列都返回,但是Banner部分的数据列数值全部一样,不一样的只是BannerItem部分列的属性值。这是因为SQL只能通过这种方式来为我们返回属性值。


ResaultMap:

针对上述问题我们就想能不能将相同部分保存下来,将不同部分保存到一个数组中,于是有了ResaultMap的出现。不知道大家有没有注意到上面SQL语句中的ResultType属性,其实二者的性质是相同的,所以不能同时出现,都表示返回的数据类型。

所以针对上述代码我们可以这样修改:

    <!--结果集映射-->
    <resultMap autoMapping="true" id="bannerAndBannerItems" type="com.lin.missyou.vo.BannerByNameVo">
        <id column="id" property="id" javaType="java.lang.Long"/>
        <collection autoMapping="true" property="items" ofType="com.lin.missyou.repository.pojo.BannerItem">
            <id column="bid" property="id"/>
            <result property="img" column="bimg"/>
            <result property="name" column="bname"/>
        </collection>
    </resultMap>

    <!--SQL语句部分-->
    <select id="selectByNames" resultMap="bannerAndBannerItems">
        select b.*,
               bi.*,
               bi.id   bid,
               bi.img  bimg,
               bi.name bname
        from banner b
                 join banner_item bi on bi.banner_id = b.id
        where b.name = #{name};
    </select>

1、我们通过ResultMap指明数据的返回类型。

2、每个内部都要写好Id属性。

3、collection标签表示集合属性

4、result表示返回的结果映射。通常用于别名情况

5、autoMapping让属性值自动匹配。数据库的列与实体类中自动进行字段映射,当数据库中的字段无法与实体类中的字段进行匹配的时候就要用result来进行映射。

6、自动映射的前提是查询的结果集无重复字段。针对上面的查询,我们发现BannerByNameVO中有id、img、name字段,但是BannerItem中也有相同的字段,所以针对这种字段必须进行result映射,否则就会用前面的值替换后面的值。所以上述代码采用了起别名的方式进行名称的替换。

7、column是数据库查询出来的字段名,如果使用了as别名,则表示别名名称。

8、property属性表示实体类中的属性名。

9、ofType表示集合泛型内部的属性类型。

返回结果:

相关文章:

  • STC15单片机-RS-485通信
  • 【JAVA-1】JDK、JRE安装及卸载,有手就会!
  • Python 操作MySql数据库(封装、优雅)
  • 《蓝海战略》让你竞争中获得优势
  • RequestMapping注解
  • 实战Spring Boot集成quartz任务调度框架
  • 神经网络深度学习(五)初始化
  • jvm虚拟机学习一class文件
  • 【编程题】【Scratch四级】2021.12 森林运动会
  • chapter 01 字符串的那些事
  • 给Python漫画分集标题下载工具开发Qt界面
  • 电子学会2022年6月青少年软件编程(图形化)等级考试试卷(二级)答案解析
  • 【Redis实战】生产中使用Redis的一些注意事项
  • 线性代数学习笔记8-3:二次型、合同矩阵、标准型、规范型
  • 06-vue-routers.js的基本使用,路由从定向,router-link代替a标签及样式,路由嵌套,路由动画
  • 07.Android之多媒体问题
  • 30天自制操作系统-2
  • css选择器
  • javascript 总结(常用工具类的封装)
  • JavaScript创建对象的四种方式
  • java第三方包学习之lombok
  • SSH 免密登录
  • 闭包--闭包作用之保存(一)
  • 从0到1:PostCSS 插件开发最佳实践
  • 从零开始学习部署
  • 电商搜索引擎的架构设计和性能优化
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 力扣(LeetCode)357
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 数据科学 第 3 章 11 字符串处理
  • 2017年360最后一道编程题
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • $ git push -u origin master 推送到远程库出错
  • $(function(){})与(function($){....})(jQuery)的区别
  • (2022 CVPR) Unbiased Teacher v2
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (分布式缓存)Redis哨兵
  • (三)docker:Dockerfile构建容器运行jar包
  • (一)为什么要选择C++
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)C#调用WebService 基础
  • (转)Sublime Text3配置Lua运行环境
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • . Flume面试题
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET单元测试
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net中的Queue和Stack
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构