第八章 Mybatis多表操作之一对多配置

目录

一、引言

​二、完整代码实现

[2.1. 订单实体类](#2.1. 订单实体类)

[2.2. 用户实体类](#2.2. 用户实体类)

[2.3. UserMapper](#2.3. UserMapper)

[2.4. UserMapper.xml](#2.4. UserMapper.xml)

[2.5. sqlMybatisConfig.xml](#2.5. sqlMybatisConfig.xml)

[2.6. properties](#2.6. properties)

[2.7. UserService](#2.7. UserService)


一、引言

在上一章节中我们讲到了日常业务场景开发中碰到的一对一查询,其中就提到了关于用户和订单表的例子,一笔订单关联一个用户,那么反过来一个用户其实会对应多笔订单,这就是我们本章要讲解的一对多查询。在MyBatis中,一对多查询也是通过配置映射文件中的<resultMap>来实现的。

一对多查询模型

用户表和订单表的反向关系为:

  1. 一个订单只从属于一个用户,但是一个用户有多个订单,用户表id关联多个订单表uid。

  2. 一对多查询的需求:查询一个用户,与此同时查询出该用户关联的所有订单。

二、完整代码实现

2.1. 订单实体类

java 复制代码
package com.example.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {
    private int id;
    private Date orderTime;
    private double total;
    // 代表当前订单从属于哪一个用户
    private User user;
}

2.2. 用户实体类

java 复制代码
package com.example.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.Date;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
    /**
     * 描述的是当前用户存在哪些订单
     */
    private List<Order> orderList;
}

2.3. UserMapper

java 复制代码
package com.example.mapper;

import com.example.domain.User;
import java.io.IOException;
import java.util.List;

public interface UserMapper {

    List<User> findAll() throws IOException;
}

2.4. UserMapper.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">

    <resultMap id="userMap" type="user">
        <id column="uid" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>
        <!-- 配置集合信息
         property: 集合名称
         ofType: 当前集合的数据类型
         -->
        <collection property="orderList" ofType="order">
            <id column="oid" property="id"></id>
            <result column="ordertime" property="orderTime"></result>
            <result column="total" property="total"></result>
            <result column="oid" property="id"></result>
        </collection>
    </resultMap>

    <!-- 查询操作 -->
    <select id="findAll" resultMap="userMap">
        select * from user u, `order` o where u.id = o.uid
    </select>
</mapper>

2.5. sqlMybatisConfig.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 加载外部properties -->
    <properties resource="jdbc.properties"></properties>

    <settings>
        <!-- 其他配置 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <typeAliases>
        <typeAlias type="com.example.domain.User" alias="user"></typeAlias>
        <typeAlias type="com.example.domain.Order" alias="order"></typeAlias>
    </typeAliases>

    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 指定方言 MySQl -->
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>
    
    <!-- 数据源环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
        <mapper resource="com/example/mapper/OrderMapper.xml"/>
    </mappers>
</configuration>

2.6. properties

XML 复制代码
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=Wangzhexiao

2.7. UserService

java 复制代码
package com.example.service;

import com.example.domain.User;
import com.example.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserService {
    public static void main(String[] args) throws IOException {
        // 获得核心配置文件
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        // 获得Session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 获得Session会话对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取Dao代理对象,Mybatis内部已经帮我们完成了实现(与我们传统方式代码中的实现类相似)
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = mapper.findAll();
        for (User user : list) {
            System.out.println(user);
        }
    }
}
相关推荐
IronmanJay1 小时前
【LeetCode每日一题】——862.和至少为 K 的最短子数组
数据结构·算法·leetcode·前缀和·双端队列·1024程序员节·和至少为 k 的最短子数组
加载中loading...2 小时前
Linux线程安全(二)条件变量实现线程同步
linux·运维·服务器·c语言·1024程序员节
Wx120不知道取啥名2 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
biomooc3 小时前
R语言 | paletteer包:拥有2100多个调色板!
r语言·数据可视化·1024程序员节
Hello.Reader3 小时前
FFmpeg 深度教程音视频处理的终极工具
ffmpeg·1024程序员节
精致先生4 小时前
问题记录01
java·数据库·mybatis
Y.O.U..4 小时前
STL学习-容器适配器
开发语言·c++·学习·stl·1024程序员节
就爱敲代码4 小时前
怎么理解ES6 Proxy
1024程序员节
憧憬一下4 小时前
input子系统的框架和重要数据结构详解
arm开发·嵌入式·c/c++·1024程序员节·linux驱动开发
三日看尽长安花4 小时前
【Tableau】
1024程序员节