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]]
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


