转自:
一对一级联简介
一对一级联操作:是我们日常开发中一种常见的数据库表设计方案,如: 一个客户表,一个客户个人信息表 因为一个客户只有一个客户个人信息,所以这两个表之间为一对一的关系,所以我们将其称之为“一对一关联”关系 MyBatis中设置一对一级联返回数据关系呢
如下所示:
实现思路: 在 MyBatis 中,通过元素的子元素 处理一对一级联关系。示例代码如下。
在
一对一关联查询可采用以下两种方式
单步查询:使用关联查询实现 分步查询:使用两次或多次查询,为一对一关系的实体 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]]