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

SSM(一对多和多对多)

一对多:

背景:

一个用户有多个订单,订单的用户只有一个人。

属性:

首先是在User实体类里面封装一个Order(订单类)的集合。

 userMapper接口:

    /**
     * 查看该用户的全部订单
     * 一对多的关系 因此返回的是 List类型
     * @return
     */
    List<User>findAllWithOrders();

userMapper.xml:

在之前一对一的时候,用的是association,但是咱们这个是一对多的关系,返回的是集合,用的是collection标签。里面的属性和之前的association里面是一样的。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.findyou.mapper.UserMapper">
    <resultMap id="userMap" type="com.findyou.entity.User">
        <!--这个是属性是集合的 其他对象-->
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <!--这里是一对多 属性是集合类别的 因此 用的是 collection -->
        <collection property="ordersList" ofType="Orders">
            <id column="oid" property="id"/>
            <result column="ordertime" property="ordertime"/>
            <result column="total" property="total"/>
        </collection>
    </resultMap>


    <select id="findAllWithOrders" resultMap="userMap">
        select u.*, o.id oid, ordertime, total, uid from user u left join orders o on u.id = o.uid;
    </select>

</mapper>

测试类:

    /**
     * 一对多的查询
     */
    @Test
    public void test02() {
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(); /*默认的是手动的提交 如果里面的参数是true的话 就为自动提交了*/
        // 这个是获取mapper对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.findAllWithOrders();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

运行的结果:

多对多:

 背景:

一个用户可能有多个职位,每个职位可能对应多个用户。

多对多可以拆分为两个一对多的。

属性:

首先是在User实体类里面封装一个occupation(职称类)的集合。

userMapper接口:

    /**
     * 查找用户的职业 一个用户对应多个职业
     * @return
     */
    List<User> findAllWithOccupation();

 userMapper.xml:

    <resultMap id="occupationMap" type="com.findyou.entity.User">
        <!--这个是属性是集合的 其他对象-->
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <collection property="occupationList" ofType="Occupation">
            <id column="oid" property="id"/>
            <result column="name" property="name"/>
            <result column="d" property="desc"/>
        </collection>
    </resultMap>

    <select id="findAllWithOccupation" resultMap="occupationMap">
        select u.*, oc.id oid, name, oc.desc d from user u left join user_occupation uo on u.id = uo.userid
                                                           left join occupation oc on oc.id = uo.occupation_id;
    </select>

测试类:

    /**
     * 多对多的查询
     * 可以分为两个1对多的 因此这个写法 和上面的是类似的
     */
    @Test
    public void test03() {
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(); /*默认的是手动的提交 如果里面的参数是true的话 就为自动提交了*/
        // 这个是获取mapper对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.findAllWithOccupation();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

运行结果:


http://www.kler.cn/news/363204.html

相关文章:

  • 【Flutter】基础组件:文本及样式
  • DNS安全概述
  • 项目提测质量不高导致延期何解?
  • 探索音频在线剪辑工具的奇妙世界
  • 从一个简单的计算问题,看国内几个大语言模型推理逻辑能力
  • Android跨进程通信
  • data_table_2 与 flutter 官方 DataTable 的区别
  • 富格林:正确判别欺诈确保安全
  • ros2 action server示例、拓展、练习
  • 【无标题】测试
  • ubuntu启用ssh
  • Codeforces Round 980 (Div. 2) A-C 题解
  • C语言编译过程
  • 【CVPR2025】3 投稿指南和论文模版
  • 大数据查询引擎之Tez
  • MySQL的主从复制配置
  • SpringCloud无介绍快使用,sentinel服务熔断功能与持久化(二十四)
  • 自动创作PPT 利用提示词和大模型自动创建ppt
  • Java第三周:继承和多态,抽象类和接口
  • 基于SSM消防物资存储系统的设计
  • 实验03分支---7-9 真睡还是装睡
  • 构建后端为etcd的CoreDNS的容器集群(四)、etcd挂载私有自签名证书进行访问测试
  • 探索未来社交新纪元:元宇宙展厅的无限魅力
  • 修改huggingface的缓存目录以及镜像源
  • 代码随想录算法训练营第三十七天|509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
  • C语言中单字符I/O的使用