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

转自:

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

一对一级联简介

一对一级联操作:是我们日常开发中一种常见的数据库表设计方案,如: 一个客户表,一个客户个人信息表 因为一个客户只有一个客户个人信息,所以这两个表之间为一对一的关系,所以我们将其称之为“一对一关联”关系 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]]

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis可以通过使用嵌套查询以及resultMap来实现一对一关联查询。 假设有两张表:订单表(order)和用户表(user),一个用户可以有多个订单,但一个订单只属于一个用户,这就是一对一的关系。 首先,在Order实体类中添加一个User对象,表示该订单所对应的用户。 ``` public class Order { private int id; private String orderNo; private int userId; private User user; // 省略getter和setter方法 } ``` 接下来,在OrderMapper.xml中编写嵌套查询语句,在查询订单的同时查询该订单所对应的用户信息: ``` <select id="getOrderList" resultMap="orderMap"> select o.*, u.id as user_id, u.username as user_name, u.email as user_email from order o left join user u on o.user_id = u.id </select> <resultMap id="orderMap" type="Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <result property="userId" column="user_id"/> <association property="user" javaType="User"> <id property="id" column="user_id"/> <result property="username" column="user_name"/> <result property="email" column="user_email"/> </association> </resultMap> ``` 在resultMap中使用association标签表示一对一关联查询,其中id标签表示User实体类中的主键id,result标签表示User实体类中的其他属性。 最后,在OrderMapper接口中定义getOrderList方法,调用上述SQL语句即可查询出包含用户信息的订单列表: ``` public interface OrderMapper { List<Order> getOrderList(); } ``` 以上就是使用Mybatis进行一对一关联查询的方法,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值