远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • 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复杂映射开发之一对一查询
        • 一对一查询需求
        • 需求分析
        • 具体实现
          • 创建User和Order实体
          • 创建OrderMapper接口
          • 配置OrderMapper.xml
          • 测试结果
      • MyBatis复杂映射开发之一对多查询
      • MyBatis复杂映射开发之多对多查询
      • MyBatis常用注解及基本增删改查的注解实现
      • MyBatis的注解实现复杂映射开发
      • MyBatis缓存的概念
      • MyBatis的一级缓存
      • MyBatis的二级缓存
      • MyBatis的二级缓存整合redis
      • MyBatis-RedisCache源码分析
  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

  • 分布式框架

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

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

# 一对一查询需求

用户表和订单表的关系为:一个用户可以有多个订单,一个订单只能从属于一个用户

​

一对一查询需求:查询一个订单,同时查询出该订单所对应的用户

对应的sql语句:select * from orders o,user u where o.uid=u.id

查询结果如下:

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

# 需求分析

​

​

# 具体实现

# 创建User和Order实体

  • User

      /**
       * 用户信息
       *
       * @name: User
       * @author: terwer
       * @date: 2022-05-08 17:41
       */
      class User {
          var id: Int? = null
          var username: String? = null
          override fun toString(): String {
              return "User{" +
                      "id=" + id +
                      ", username='" + username + '\'' +
                      '}'
          }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      /**
       * 用户信息
       *
       * @name: User
       * @author: terwer
       * @date: 2022-03-17 17:41
       **/
      public class User {
          private Integer id;
          private String username;
      
          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;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "id=" + id +
                      ", username='" + username + '\'' +
                      '}';
          }
      }
      
      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
      // Make sure to add code blocks to your code group
    • Order

        /**
         * 订单
         *
         * @name: Order
         * @author: terwer
         * @date: 2022-05-08 17:42
         */
        class Order {
            var id: Int? = null
            var orderTime: String? = null
            var total: Double? = null
        
            // 代表当前订单属于哪一个用户
            var user: User? = null
            override fun toString(): String {
                return "Order{" +
                        "id=" + id +
                        ", orderTime='" + orderTime + '\'' +
                        ", total=" + total +
                        ", user=" + user +
                        '}'
            }
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        /**
         * 订单
         *
         * @name: Order
         * @author: terwer
         * @date: 2022-03-17 17:42
         **/
        public class Order {
            private Integer id;
            private String orderTime;
            private Double total;
        
            // 代表当前订单属于哪一个用户
            private User user;
        
            public Integer getId() {
                return id;
            }
        
            public void setId(Integer id) {
                this.id = id;
            }
        
            public String getOrderTime() {
                return orderTime;
            }
        
            public void setOrderTime(String orderTime) {
                this.orderTime = orderTime;
            }
        
            public Double getTotal() {
                return total;
            }
        
            public void setTotal(Double total) {
                this.total = total;
            }
        
            public User getUser() {
                return user;
            }
        
            public void setUser(User user) {
                this.user = user;
            }
        
            @Override
            public String toString() {
                return "Order{" +
                        "id=" + id +
                        ", orderTime='" + orderTime + '\'' +
                        ", total=" + total +
                        ", user=" + user +
                        '}';
            }
        }
        
        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
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        // Make sure to add code blocks to your code group

      # 创建OrderMapper接口

        /**
         * 订单映射
         *
         * @name: IUserMapper
         * @author: terwer
         * @date: 2022-05-08 17:54
         */
        interface OrderMapper {
            /**
             * 查询订单同时查询订单所属用户
             * @return
             */
            fun findOrderAndUser(): List<Order?>?
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        /**
         * 订单映射
         *
         * @name: IUserMapper
         * @author: terwer
         * @date: 2022-03-17 17:54
         **/
        public interface OrderMapper {
            /**
             * 查询订单同时查询订单所属用户
             * @return
             */
            public List<Order> findOrderAndUser();
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        // Make sure to add code blocks to your code group

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

        另外一种配置方法

         <mapper namespace="com.terwergreen.mapper.OrderMapper">
            <resultMap id="orderMap" type="com.terwergreen.pojo.Order">
               <result property="id" column="id"></result>
                <result property="orderTime" column="ordertime"></result>
                <result property="total" column="total"></result>
            
                <result property="user.id" column="uid"></result>
                <result property="user.username" column="username"></result>
            </resultMap>
          
            <!-- resultMap:手动配置实体属性与表字段的映射关系 -->
            <select id="findOrderAndUser" resultMap="orderMap">
                select * from orders o,user u where o.uid=u.id
            </select>
        </mapper>
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15

        # 测试结果

          @Test
          @Throws(IOException::class)
          fun test1() {
              val resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml")
              val sqlSessionFactory = SqlSessionFactoryBuilder().build(resourceAsStream)
              val sqlSession = sqlSessionFactory.openSession()
              val orderMapper = sqlSession.getMapper(OrderMapper::class.java)
              val orderList = orderMapper.findOrderAndUser()
              for (order in orderList) {
                  println(order)
              }
          }
          
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          @Test
          public void test1() throws IOException {
              InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
              SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
          
              SqlSession sqlSession = sqlSessionFactory.openSession();
              OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
          
              List<Order> orderList = orderMapper.findOrderAndUser();
              for (Order order : orderList) {
                  System.out.println(order);
              }
          }
          
          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)
          #framework#mybatis#query#mybatis-10
          上次更新: 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 | 百度统计
          • 跟随系统
          • 浅色模式
          • 深色模式
          • 阅读模式