Mybatis中表关系查询结果集映射

这篇具有很好参考价值的文章主要介绍了Mybatis中表关系查询结果集映射。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

ER实体关系:

  • 一对一
  • 一对多
  • 多对多

1. 实体类设计

1.1 用户表

建表sql:

CREATE TABLE `User` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

java实体类:

public class User implements Serializable {
    private static final long serialVersionUID = 741077730204987800L;
    
    private Long id;
    
    private String name;
    
    private Integer age;
}

1.2 地址表

建表的sql


CREATE TABLE `Address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `province` varchar(100) DEFAULT NULL,
  `city` varchar(100) DEFAULT NULL,
  `county` varchar(100) DEFAULT NULL,
  `detail` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='地址表';

java代码

public class Address implements Serializable {
    private static final long serialVersionUID = 960792204085182238L;
    
    private Long id;
    
    private Long userId;
    
    private String province;
    
    private String city;
    
    private String county;
    
    private String detail;
    }

1.3 博客表

建表的sql

CREATE TABLE `Blogs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `content` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

java实体类:

public class Blogs implements Serializable {
    private static final long serialVersionUID = -82344806309770256L;
    
    private Long id;
    
    private Long userId;
    
    private String title;
    
    private String content;
 }

1.4 粉丝互关表

建表的sql

-- test.Fans definition

CREATE TABLE `Fans` (
  `id` varchar(100) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `fan_id` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='粉丝互关表';

实体类

public class Fans implements Serializable {
    private static final long serialVersionUID = -76540062746539253L;
    
    private String id;
    
    private Long userId;
    
    private String fanId;
    }

2.插入数据

INSERT INTO `User`(id, name, age)VALUES(11, 'elite', 20);
INSERT INTO `User`(id, name, age)VALUES(12, 'bob', 19);
INSERT INTO `User`(id, name, age)VALUES(13, 'johon', 22);
INSERT INTO `User`(id, name, age)VALUES(14, 'smith', 21);
INSERT INTO `User`(id, name, age)VALUES(15, 'jackon', 20);
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(1, 11, 'bj', 'xx', 'xx', '北京西路');
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(2, 12, 'sh', 'xx', 'xx', '上海路');
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(3, 13, 'sz', 'xx', 'xx', '深圳南山路');
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(4, 14, 'gz', 'xx', 'xx', '广州路');
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(5, 15, 'hz', 'xx', 'xx', '杭州');
INSERT INTO Blogs(id, user_id, title, content)VALUES(1, 11, 'java', 'java数据类型...');
INSERT INTO Blogs(id, user_id, title, content)VALUES(2, 11, 'python', '大数据开发..');
INSERT INTO Blogs(id, user_id, title, content)VALUES(3, 11, 'c#', '桌面应用开发...');
INSERT INTO Fans(id, user_id, fan_id)VALUES(1, 11, 12);
INSERT INTO Fans(id, user_id, fan_id)VALUES(2, 11, 13);
INSERT INTO Fans(id, user_id, fan_id)VALUES(3, 12, 11);
INSERT INTO Fans(id, user_id, fan_id)VALUES(4, 12, 14);
INSERT INTO Fans(id, user_id, fan_id)VALUES(5, 12, 15);

3.表关联查询

3.1 一对一关系

表user和address是一对一的关系,可以直接定义一个dto来接收数据。
定义数据传输对象:

public class UADTO {

    private Long id;

    private String name;

    private Integer age;

    private String province;

    private String city;

    private String county;

    private String detail;
    }

定义resultmap结果集以及查询

<!--定义用户地址结果集-->
    <resultMap type="com.elite.mybatis.dto.UADTO" id="UAMap">
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
        <result property="userId" column="user_id" jdbcType="INTEGER"/>
        <result property="province" column="province" jdbcType="VARCHAR"/>
        <result property="city" column="city" jdbcType="VARCHAR"/>
        <result property="county" column="county" jdbcType="VARCHAR"/>
        <result property="detail" column="detail" jdbcType="VARCHAR"/>
    </resultMap>

   <!--用户与地址的查询-->
    <sql id="uasql">
        select
            u.id,
            u.name,
            u.age,
            a.province,
            a.city,
            a.county,
            a.detail
        from
            User u,
            Address a
        where
            u.id = a.user_id
    </sql>
   <select id="getUAInfo" resultMap="UAMap">
       <include refid="uasql"></include>
   </select>

测试:

 /**
     * 测试一对一关系的查询
     */
    @Test
    public void testOne2One(){
        CollectionMapper c = sqlSession.getMapper(CollectionMapper.class);
        List<UADTO> uadtoList = c.getUAInfo();
        uadtoList.forEach(uadto -> {
            System.out.println(uadto.toString());
        });
    }

Mybatis中表关系查询结果集映射,mybatis,java,数据库,mybatis

3.2 一对多关系

用户和发表的博客ER关系属于一对多关系。
定义传输的DTO对象

/**
 * 用户表和博客发布的记录
 */
public class UBDTO {

    private Long id;

    private String name;

    private Integer age;

    private List<Blogs> blogs;
    }

定义结果集

 <!--定义用户与博客-->
    <resultMap id="UBMap" type="com.elite.mybatis.dto.UBDTO">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
        <collection property="blogs" ofType="com.elite.mybatis.entity.Blogs">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <id property="userId" column="user_id" jdbcType="INTEGER"/>
            <result property="title" column="title" jdbcType="VARCHAR"/>
            <result property="content" column="content" jdbcType="VARCHAR"/>
        </collection>
    </resultMap>
    <!--用户与地址的查询-->
    <sql id="ubsql">
        select
            u.id,
            u.name,
            u.age,
            b.id,
            b.user_id,
            b.title,
            b.content
        from
            User u inner join Blogs b on (u.id = b.user_id)
    </sql>
    <select id="getUBInfo" resultMap="UBMap">
        <include refid="ubsql"></include>
    </select>

测试

/**
     * 测试一对多关系的查询
     */
    @Test
    public void testOne2Multi(){
        CollectionMapper c = sqlSession.getMapper(CollectionMapper.class);
        List<UBDTO> ubInfo = c.getUBInfo();
        ubInfo.forEach(ubdto -> {
            System.out.println(ubdto.toString());
        });
    }

Mybatis中表关系查询结果集映射,mybatis,java,数据库,mybatis

3.3 多对多关系

用户表和粉丝表之间关系
定义dto

/**
 * 粉丝互关表
 */
public class UFDTO {
    private Long id;

    private String name;

    private Integer age;

    private List<User> fans;
    }

定义查询的结果集

 <!--定义用户与粉丝互关表-->
    <resultMap id="UFMap" type="com.elite.mybatis.dto.UFDTO">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
        <collection property="fans" ofType="com.elite.mybatis.entity.User">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="age" column="age" jdbcType="INTEGER"/>
        </collection>
    </resultMap>
    <!--用户与粉丝查询-->
    <sql id="ufsql">
        select
            u.id,
            u.name,
            u.age,
            f1.id,
            f1.name,
            f1.age
        from
            User u,
            Fans f,
            User f1
        where
            u.id = f.user_id
          and f.fan_id  = f1.id
    </sql>
    <select id="getUFInfo" resultMap="UFMap">
        <include refid="ufsql"></include>
    </select>

测试

 /**
     * 测试多对多关系的查询
     */
    @Test
    public void testMulti2Multi(){
        CollectionMapper c = sqlSession.getMapper(CollectionMapper.class);
        List<UFDTO> ufdtoList = c.getUFInfo();
        ufdtoList.forEach(ufdto -> {
            System.out.println(ufdto.toString());
        });
    }

Mybatis中表关系查询结果集映射,mybatis,java,数据库,mybatis文章来源地址https://www.toymoban.com/news/detail-574774.html

到了这里,关于Mybatis中表关系查询结果集映射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis注解开发---实现自定义映射关系和关联查询

    目录 相关导读 一、使用注解实现自定义映射关系 1. 编写注解方法 2. 编写测试方法

    2023年04月09日
    浏览(43)
  • Mybatis的三种映射关系以及联表查询

    目录 一、概念 二、一对一 1、配置generatorConfig.xml 2、Vo包的编写 3、xml的sql编写 4、编写对应接口及实现类 5、测试 三、一对多 1、Vo包类的编写 2、xml的sql编写 3、编写对应接口及实现类 4、测试 四、多对多 1、Vo类 2、xml的sql配置 3、接口及接口实现类 4、测试 1、MyBatis中表之间

    2024年02月10日
    浏览(48)
  • 【Java】Mybatis查询数据库

    经过前面的学习Spring系列的操作已经差不多了,接下来我们继续学习更加重要的知识,将前端传递的参数存储起来,或者查询数据库里面的数据 MyBatis是款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis几乎祛除了所有的JDBC代码以及设置参数和获取结果集

    2024年01月18日
    浏览(60)
  • Mybatis中的关系映射

    目录 前言 1.一对一的映射关系 1.1 创建模型类和Vo类  1.2 配置当前模型类的mapper.xml 1.3 开始测试 2.一对多的映射关系 2.1 创建模型类和Vo类 2.2 配置当前模型类的mapper.xml 2.3 开始测试 3.多对多的映射关系 总结  注意点:  一对一映射(One-to-One Mapping) : 一对一关系指的是两个

    2024年02月09日
    浏览(38)
  • MyBatis关联关系映射详解

    目录 前言 一、 什么是关联关系映射? 二、MyBatis的关系映射方式 1.基于XML配置的关系映射 2.基于注解的关系映射 三、如何使用MyBatis进行关系映射? 四、关于关系映射的一些建议 五、关联关系映射 1.一对一关联关系映射 嵌套查询 嵌套结果映射 2.一对多关联关系映射 嵌套查

    2024年02月09日
    浏览(64)
  • 【MyBatis】自定义resultMap三种映射关系

    目录 一、一对一映射(One-to-One) 1.1 表关系 1.2 resultMap设置自定义映射  二、一对多映射(One-to-Many) 2.1 创建实体 2.2 级联方式处理映射关系 2.3 定义SQL 2.4 OrderMapper接口 2.5 编写业务逻辑层 2.6 Junit测试 三、多对多映射(Many-to-Many) 3.1 表关系 3.2 创建实体 3.3 处理映射关系、

    2024年02月10日
    浏览(47)
  • Mybatis学习笔记,包含mybatis基本使用、关系映射、动态SQL、分页插件等等

    😀😀😀创作不易,各位看官点赞收藏. 简介:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain

    2024年02月15日
    浏览(49)
  • 认识Mybatis的关联关系映射,灵活关联表对象之间的关系

    目录      一、概述 ( 1 )  介绍 ( 2 )  关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件  2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 关联关系映射是指在数据库中,通过定义 表之间的关联关系 ,将多

    2024年02月11日
    浏览(46)
  • Java EE 突击 13 - MyBatis 查询数据库(2)

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月11日
    浏览(51)
  • MyBatis中至关重要的关系映射----全方面介绍

    目录 一 对于映射的概念 1.1 三种关系映射 1.2 resultType与resultMap的区别 resultType: resultMap: 二,一对一关联查询 2.1 嵌套结果集编写 2.2 案例演示 三,一对多关联查询 3.1 嵌套结果集编写  3.3 案例演示 四,多对多关联查询  4.1 嵌套结果集编写  4.2 案例演示      在关系型数

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包