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

Java-框架王 MyBatis 发布时间:2021-07-20 14:39:47 阅读数:12529 1

一对一级联简介

一对一级联操作:是我们日常开发中一种常见的数据库表设计方案,如: 一个客户表,一个客户个人信息表 因为一个客户只有一个客户个人信息,所以这两个表之间为一对一的关系,所以我们将其称之为“一对一关联”关系 MyBatis中设置一对一级联返回数据关系呢如下所示:
实现思路:
    在 MyBatis 中,通过 <resultMap> 元素的子元素 <association> 处理一对一级联关系。示例代码如下。
      <association property="customInfo" column="cusId"
            javaType="com.java265.po.CustomInfo"
            select="com.java265.mapper.customInfoMapper.selectCusInfoById" />
 
在 <association>元素中通常使用以下属性 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 语句代码

<mapper namespace="com.java265.mapper.customInfoMapper">
    <select id="selectCusInfoById" resulttype="com.java265.po.customInfo">
        SELECT * FROM customInfo WHERE id = #{id}
    </select>
</mapper>

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 代码如下。
<mapper namespace="com.java265.mapper.CustomMapper">
    <!-- 一对一根据id查询学生信息:级联查询的第一种方法(嵌套查询,执行两个SQL语句) -->
    <resultmap id="InfoAndCus1" type="com.java265.po.Custom">
        <id column="id" property="id">
        <result column="name" property="name">
        <result column="sex" property="sex">
        <!-- 一对一级联查询 -->
        <association column="cusId" javatype="com.java265.po.customInfo" property="customInfo" select="com.java265.mapper.customInfoMapper.selectCusInfoById">
    </association></result></result></id></resultmap>
    <select id="selectCusById1" parametertype="Integer" resultmap="InfoAndCus1">
        select * from Custom where id=#{id}
    </select>
</mapper>
测试代码如下。
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 中添加以下代码。

<resultmap id="InfoAndCus2" type="com.java265.po.Custom">
    <id column="id" property="id">
    <result column="name" property="name">
    <result column="sex" property="sex">
    <!-- 一对一级联查询 -->
    <association javatype="com.java265.po.customInfo" property="customInfo">
        <id column="id" property="id">
        <result column="cusId" property="cusId">
    </result></id></association>
</result></result></id></resultmap>
<select id="selectCusById2" parametertype="Integer" resultmap="InfoAndCus2">
    SELECT s.*,sc.cusId FROM custom s,customInfo sc
    WHERE
    s.cusId = sc.id AND s.id=#{id}
</select>

在 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]]
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/MyBatis/202107/543.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者