远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

  • 开源框架

    • MyBatis

      • JDBC的问题分析
      • 自定义持久层框架的设计思路
      • 自定义持久层框架的代码实现一
      • 自定义持久层框架的代码实现二
      • 使用getMapper方式对自定义持久层框架进行优化
      • MyBatis的基本介绍及优势
      • MyBatis的基本使用
      • Mybatis基本流程及配置文件解析
      • MyBatis复杂映射开发之一对一查询
      • MyBatis复杂映射开发之一对多查询
        • 一对多查询模型
        • 一对多查询语句
        • 代码实现
          • 修改User实体
          • 创建UserMapper
          • 配置UserMapper.xml
          • 测试
      • MyBatis复杂映射开发之多对多查询
      • MyBatis常用注解及基本增删改查的注解实现
      • MyBatis的注解实现复杂映射开发
      • MyBatis缓存的概念
      • MyBatis的一级缓存
      • MyBatis的二级缓存
      • MyBatis的二级缓存整合redis
      • MyBatis-RedisCache源码分析
  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

  • 分布式框架

  • 后端开发
  • 开源框架
  • MyBatis
terwer
2022-08-30
目录

MyBatis复杂映射开发之一对多查询

# 一对多查询模型

用户和订单表的关系为,一个用户有多个订单,一个订单只能属于一个用户。

一对多查询需求:查询多有用户,与此同时查询用户具有的订单信息。

​

# 一对多查询语句

对应的sql语句

select u.*,o.ordertime,o.total,o.uid from user u left join orders o on u.id = o.uid;
1

查询结果如下:

id username password birthday ordertime total uid
1 lucy 123 2022-03-17 17:15:56 2022-03-17 17:15:33 3000 1
1 lucy 123 2022-03-17 17:15:56 2022-03-17 17:15:33 4000 1
2 tom 123 2022-03-17 17:15:56 2022-03-17 17:15:33 5000 2

# 代码实现

# 修改User实体

    /**
     * 用户信息
     *
     * @name: User
     * @author: terwer
     * @date: 2022-05-08 17:41
     */
    class User {
        var id: Int? = null
        var username: String? = null
    
        // 代表当前用户具备那些订单
        var orderList: List<Order>? = null
        override fun toString(): String {
            return "User{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", orderList=" + orderList +
                    '}'
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /**
     * 用户信息
     *
     * @name: User
     * @author: terwer
     * @date: 2022-03-17 17:41
     **/
    public class User {
        private Integer id;
        private String username;
    
        // 代表当前用户具备那些订单
        private List<Order> orderList;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public List<Order> getOrderList() {
            return orderList;
        }
    
        public void setOrderList(List<Order> orderList) {
            this.orderList = orderList;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", orderList=" + orderList +
                    '}';
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    // Make sure to add code blocks to your code group

    # 创建UserMapper

      /**
       * 用户映射
       *
       * @name: UserMapper
       * @author: terwer
       * @date: 2022-05-08 00:03
       */
      interface UserMapper {
          // 查询所有用户信息以及用户关联的订单信息
          fun findAll(): List<User?>?
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      /**
       * 用户映射
       *
       * @name: UserMapper
       * @author: terwer
       * @date: 2022-03-28 00:03
       **/
      public interface UserMapper {
          // 查询所有用户信息以及用户关联的订单信息
          public List<User> findAll();
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      // Make sure to add code blocks to your code group

      # 配置UserMapper.xml

      <?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.terwergreen.mapper.UserMapper">
          <resultMap id="userMap" type="com.terwergreen.pojo.User">
              <result property="id" column="id"></result>
              <result property="username" column="username"></result>
      
              <collection property="orderList" ofType="com.terwergreen.pojo.Order">
                  <result property="id" column="uid"></result>
                  <result property="orderTime" column="ordertime"></result>
                  <result property="total" column="total"></result>
              </collection>
          </resultMap>
      
          <!-- resultMap:手动配置实体属性与表字段的映射关系 -->
          <select id="findAll" resultMap="userMap">
              select u.*,o.ordertime,o.total,o.uid from user u left join orders o on u.id = o.uid
          </select>
      </mapper>
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21

      # 测试

        @Test
        @Throws(IOException::class)
        fun test2() {
            val resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml")
            val sqlSessionFactory = SqlSessionFactoryBuilder().build(resourceAsStream)
            val sqlSession = sqlSessionFactory.openSession()
            val userMapper = sqlSession.getMapper(UserMapper::class.java)
            val userList = userMapper.findAll()
            for (user in userList) {
                println(user)
            }
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        @Test
        public void test2() throws IOException {
            InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        
            List<User> userList = userMapper.findAll();
            for (User user : userList) {
                System.out.println(user);
            }
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        // Make sure to add code blocks to your code group

        执行结果

        ​

        文章更新历史
        2022/05/08 feat:新增Kotlin支持

        ‍

        编辑 (opens new window)
        #mybatis#framework#one-to-many#mapping#mybatis-11
        上次更新: 2023/02/22, 13:47:25
        MyBatis复杂映射开发之一对一查询
        MyBatis复杂映射开发之多对多查询

        ← MyBatis复杂映射开发之一对一查询 MyBatis复杂映射开发之多对多查询→

        最近更新
        01
        解决css部分border被圆角切掉之后圆角的边框消失问题
        03-18
        02
        使用TypeScript开发一个自定义的Node-js前端开发脚手架
        03-08
        03
        Github-Actions使用release-please实现自动发版
        03-06
        更多文章>
        Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
        • 跟随系统
        • 浅色模式
        • 深色模式
        • 阅读模式