Mybatis复杂结果集映射(详细)

简介: Mybatis复杂结果集映射(详细)

多对一:

多对一的理解:

  • 多个女神对应一个男神
  • 对于女神这边,就是一个多对一的现象,即从女神这边关联一个男神

数据库设计

# 女神表
CREATE TABLE `beauty` (
    // 编号
  `id` int(11) NOT NULL AUTO_INCREMENT,
    // 姓名
  `name` varchar(50) NOT NULL,
    // 生日
  `bornDate` datetime DEFAULT '1987-01-01 00:00:00',
    // 电话
  `phone` varchar(11) NOT NULL,
    // 男神id
  `boyfriendId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert  into `beauty` values 
(1,'柳岩','1988-02-03 00:00:00','18209876577',5),
(2,'苍老师','1987-12-30 00:00:00','18219876577',5),
(3,'Angelababy','1989-02-03 00:00:00','18209876567',3),
(4,'热巴','1993-02-03 00:00:00','18209876579',2),
(5,'周冬雨','1992-02-03 00:00:00','18209179577',9),
(6,'周芷若','1988-02-03 00:00:00','18209876577',1),
(7,'岳灵珊','1987-12-30 00:00:00','18219876577',9),
(8,'小昭','1989-02-03 00:00:00','18209876567',1),
(9,'双儿','1993-02-03 00:00:00','18209876579',9),
(10,'王语嫣','1992-02-03 00:00:00','18209179577',4),
(11,'夏雪','1993-02-03 00:00:00','18209876579',9),
(12,'赵敏','1992-02-03 00:00:00','18209179577',1),
(13,'紫霞仙子','1999-12-10 00:00:00','17303773603',7),
(14,'嫦娥','1234-02-03 00:00:00','1234',3),
(15,'阳丽','1999-09-21 00:00:00','0987654',5),
(16,'关晓彤','1999-12-10 00:00:00','1234',5),
(17,'张靓颖','1999-01-11 00:00:00','145678',6),
(18,'貂蝉','1978-12-12 00:00:00','098765',1954),
(19,'不知火舞','1999-12-13 00:00:00','2345689',5),
(20,'阿珂','1223-08-09 00:00:00','12456789',5);
#男神表
CREATE TABLE `boys` (
    // 男神id
  `id` int(11) NOT NULL AUTO_INCREMENT,
    // 男神姓名
  `boyName` varchar(20) DEFAULT NULL,
    // 魅力值
  `userCP` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert  into `boys` values 
(1,'张无忌',100),
(2,'鹿晗',800),
(3,'黄晓明',50),
(4,'段誉',300),
(5,'齐菁菁',360),
(6,'刘祥',260),
(7,'牛辉',300),
(8,'武怡',123),
(10,'王一帆',10),
(12,'詹三',100),
(17,'齐元松',180),
(20,'朱辉',246);

编写实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Beauty {
    /**
     * 女神id
     */
    private int id;
    /**
     * 女神姓名
     */
    private String name;
    /**
     * 出生日期
     */
    private Date bornDate;
    /**
     * 手机号
     */
    private String phone;
    /**
     * 对应男神id
     */
    private int boyfriendId;
    /**
     * 对应男神信息
     */
    private Boys boys;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Boys {
    /**
     * 男神id
     */
    private int id;
    /**
     * 男神姓名
     */
    private String boyName;
    /**
     * 魅力值
     */
    private int userCP;
}

编写两个实体类的接口

public interface BeautyMapper {
}
public interface BoysMapper {
}

编写对应的配置文件

BeautyMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mapper.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lili.dao.BeautyMapper">
</mapper>

BoysMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mapper.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lili.dao.BoysMapper">
</mapper>

编写需求代码

1.给BeautyMapper接口增加方法

List<Beauty> findBeautyBoy();

2.编写对应的Mapper文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mapper.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lili.dao.BeautyMapper">
    <!--结果集映射-->
    <resultMap id="findBeautyBoyMap" type="com.lili.entity.Beauty" autoMapping="true">
        <!--由于两个表id一样,所以需要用别名来区别-->
        <id property="id" column="b1_id"/>
        <association property="boys" javaType="com.lili.entity.Boys" autoMapping="true">
            <id property="id" column="b2_id"/>
        </association>
    </resultMap>
    <!--查询所有的女神以及她的男神信息(多对一)-->
    <select id="findBeautyBoy" resultMap="findBeautyBoyMap">
        select b1.id as b1_id,
               b1.name,
               b1.bornDate,
               b1.phone,
               b1.boyfriendId,
               b2.id as b2_id,
               b2.boyName,
               b2.userCP
        from beauty b1
                 left join boys b2 on
            b1.boyfriendId = b2.id
    </select>
</mapper>

3.测试

@Test
public void test1() {
    // 利用多对一查询所有女神及女神的男神名字
    try (SqlSession sqlSession = MybatisUtil.getSqlSession()) {
        BeautyMapper mapper = sqlSession.getMapper(BeautyMapper.class);
        List<Beauty> beauty = mapper.findBeautyBoy();
        beauty.forEach(System.out::println);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

一对多:

实体类编写

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Beauty {
    private int id;
    private String name; 
    private Date bornDate;   
    private String phone;
    private int boyfriendId;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Boys {
    private int id;
    private String boyName;
    private int userCP;
    private List<Beauty> beautyList;
}

编写代码

1.给BeautyMapper接口增加方法

List<Boys> getBoyBeauty();

2.编写对应的Mapper文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mapper.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lili.dao.BoysMapper">
    <!--结果集映射-->
    <resultMap id="getBoyBeautyMap" type="com.lili.entity.Boys" autoMapping="true">
        <result property="id" column="b2_id"/>
        <collection property="beautyList" ofType="com.lili.entity.Beauty" autoMapping="true">
            <result property="id" column="b1_id"/>
        </collection>
    </resultMap>
    <!--一对多-->
    <select id="getBoyBeauty" resultMap="getBoyBeautyMap">
        select b1.id as b1_id,
               b1.name,
               b1.bornDate,
               b1.phone,
               b1.boyfriendId,
               b2.id as b2_id,
               b2.boyName,
               b2.userCP
        from beauty b1
                 right join boys b2 on
            b1.boyfriendId = b2.id
    </select>
</mapper>

3.测试

@Test
public void test1() {
 // 利用一对多查询所有男神的女神名字
        try (SqlSession sqlSession = MybatisUtil.getSqlSession()) {          
            BoysMapper mapper = sqlSession.getMapper(BoysMapper.class);          
            List<Boys> boys = mapper.getBoyBeauty();
            boys.forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        }
}

小结:

1.关联-association

2.集合-collection

3.所以association是用于一对一和多对一,而collection是用于一对多的关系

4.JavaType和ofType都是用来指定对象类型的

  • JavaType是用来指定entity中属性的类型
  • ofType是用来指定list集合中属性的entity类型


目录
相关文章
|
9月前
|
SQL Java 数据库连接
MyBatis 的映射关系
MyBatis 核心功能之一是映射关系,支持一对一、一对多和多对多三种 ORM 映射。通过实体类与配置文件结合,开发者可灵活实现数据关联,提升数据库操作效率。
478 4
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
1257 5
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
444 6
|
XML Java 数据库连接
Mybatis映射关系
简介:本文介绍了MyBatis框架中四种常见的关系映射方式,包括一对一、一对多、多对一及多对多。一对一通过简单属性映射实现;一对多通过在主对象中添加集合属性并使用`&lt;collection&gt;`标签映射子对象集合;多对一则利用`&lt;association&gt;`标签在主对象中映射单个子对象;多对多需引入第三方类,分别在两个主对象中添加对方的集合属性,并通过`&lt;collection&gt;`标签实现映射。
306 32
|
Java 数据库连接 mybatis
MyBatis篇-映射关系(1-1 1-n n-n)
本文介绍了MyBatis中四种常见关系映射的配置方法,包括一对一、一对多、多对一和多对多。**一对一**通过`resultMap`实现属性与字段的映射;**一对多**以用户-角色为例,使用`&lt;collection&gt;`标签关联集合数据;**多对一**以作者-博客为例,利用`&lt;association&gt;`实现关联;**多对多**则通过引入第三方类(如UserForDept)分别在User和Dept类中添加集合属性,并配置对应的`&lt;collection&gt;`标签完成映射。这些方法解决了复杂数据关系的处理问题,提升了开发效率。
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
709 3
|
Java 数据库连接 mybatis
mybatis映射关系(1-1 1-n n-n)
Mybatis 中的关系映射包括一对一、一对多和多对多。一对一映射可以通过ResultMap定义属性与字段的对应。一对多示例中,User类包含List&lt;Role&gt;,在User的mapper.xml中使用&lt;collection&gt;标签。多对一的情况,如Author与Blog,Blog的ResultMap中使用&lt;association&gt;来映射Author属性。多对多时,如部门与用户,通常需要中间表,并在双方实体中通过&lt;collection&gt;引用中间类,如UserForDept,来维护关系。
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改