• MyBatis 如何进行一对一关联查询呢?


    转自:

    MyBatis 如何进行一对一关联查询呢?

    一对一级联简介

    一对一级联操作:是我们日常开发中一种常见的数据库表设计方案,如: 一个客户表,一个客户个人信息表 因为一个客户只有一个客户个人信息,所以这两个表之间为一对一的关系,所以我们将其称之为“一对一关联”关系 MyBatis中设置一对一级联返回数据关系呢

    如下所示:

    实现思路:
        在 MyBatis 中,通过  元素的子元素  处理一对一级联关系。示例代码如下。
          
     
    

    元素中通常使用以下属性 property:指定映射到实体类的对象属性。 column:指定表中对应的字段(即查询返回的列名)。 javaType:指定映射到实体对象属性的类型。 select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。

    一对一关联查询可采用以下两种方式

    单步查询:使用关联查询实现 分步查询:使用两次或多次查询,为一对一关系的实体 Bean 赋值 例 下面以客户和客户信息 1创建数据表

    创建 custom(客户)和 customInfo(客户个人信息表)数据表,SQL 语句如下 
    CREATE TABLE `custom` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
      `sex` tinyint(4) DEFAULT NULL,
      `cusId` int(20) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `cusId` (`cusId`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
    
    insert  into `custom`(`id`,`name`,`sex`,`cusId`) values (1,'张三',0,1),(2,'李四',0,2),(3,'王二',1,3),(4,'麻子',0,4),(5,'李逍遥',1,5),(6,'发百万',0,6);
    
    DROP TABLE IF EXISTS `customInfo`;
    CREATE TABLE `customInfo` (
      `id` int(20) NOT NULL AUTO_INCREMENT,
      `cusId` int(20) DEFAULT NULL,
      `startDate` date DEFAULT NULL,
      `endDate` date DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `cusId` (`cusId`)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
    
    insert  into `customInfo`(`id`,`cusId`,`startDate`,`endDate`) values (1,1,'2021-07-01','2022-07-11'),(2,2,'2021-07-01','2022-07-11'),(3,3,'2021-07-01','2022-03-11'),(4,4,'2021-07-01','2022-07-11'),(5,5,'2021-07-01','2022-07-11');
    
    

    2)创建持久化类 在 myBatisDemo 应用的 com.java265.po 包下创建数据表对应的持久化类 Custom 和 customInfo。 Custom 的代码如下:

    package com.java265.po;
    public class Custom {
        private int id;
        private String name;
        private int sex;
        private customInfo customInfo;
        /*省略setter和getter方法*/
        @Override
        public String toString() {
            return "Custom [id=" + id + ", name=" + name + ", sex=" + sex + ", customInfo=" + customInfo + "]";
        }
    }
    customInfo 
    package com.java265.po;
    import java.util.Date;
    public class customInfo {
        private int id;
        private int cusId;
        private Date startDate;
        private Date endDate;
        /*省略setter和getter方法*/
        @Override
        public String toString() {
            return "customInfo [id=" + id + ", cusId=" + cusId + "]";
        }
    }
    
    

    分步查询

    新建 customInfoMapper 类

    package com.java265.mapper;
    import com.java265.po.customInfo;
    public interface customInfoMapper {
        public customInfo selectCusInfoById(int id);
    }
    

    customInfoMapper.xml 对应映射 SQL 语句代码

    
        
    
    
    

    CustomMapper 类方法代码如下。

    package com.java265.mapper;
    import com.java265.po.Custom;
    public interface SCustomMapper {
        public Custom selectCusById1(int id);
        public Custom selectCusById2(int id);
    }
    

    CustomMapper.xml 代码如下。

    
        
        
            
            
            
            
            
        
        
    
    

    测试代码如下。

    public class Test {
        public static void main(String[] args) throws IOException {
            InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
            SqlSession ss = ssf.openSession();
            Custom cus = ss.getMapper(CustomMapper.class).selectCusById1(2);
            System.out.println(cus);
        }
    }
    

    运行结果---
    DEBUG [main] - ==> Preparing: select * from custom where id=?
    DEBUG [main] - ==> Parameters: 2(Integer)
    DEBUG [main] - ====> Preparing: SELECT * FROM customInfo WHERE id = ?
    DEBUG [main] - ====> Parameters: 2(Integer)
    DEBUG [main] - <==== Total: 1
    DEBUG [main] - <== Total: 1
    Custom [id=2, name=张三, sex=0, customInfo=customInfo [id=2, cusId=2]]

    单步查询

    在 CustomMapper.xml 中添加以下代码。

    
        
        
        
        
        
            
            
        
    
    
    
    

    在 CustomMapper 中添加以下方法。

    public Custom selectCusById2(int id);​
    

    运行结果如下 DEBUG [main] - ==> Preparing: SELECT s.*,sc.cusId FROM Custom s,customInfo sc WHERE s.cusId = sc.id AND s.id=? DEBUG [main] - ==> Parameters: 2(Integer) DEBUG [main] - <== Total: 1 Custom [id=2, name=张三, sex=0, customInfo=customInfo [id=2, cusId=2]]

  • 相关阅读:
    IDEA中使用Git,Github,Gitee
    购房,出资款性质如何认定?
    亚马逊VS独立站Shopify
    【Java】对象处理流(ObjectOutputStream和ObjectInputStream)
    审计专业毕业论文有什么好写一点的论文选题吗?
    计算机毕业设计Java搬家预约系统(源码+系统+mysql数据库+lw文档)
    中集世联达工业级成熟航运港口人工智能AI产品规模化应用,打造新一代高效能智慧港口和创新数字港口,全球港航人工智能能领军者中集飞瞳
    labelme标注格式的数据集转COCO格式脚本
    MySQL 基本SELECT语句
    Vue.js+Node.js全栈开发教程:Vue.js数据同步
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/128053830