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